Как настроить MongoDB для нескольких центров обработки данных?

Вот окружение:

[ Data Center 1 ]
   [ load balancer, ip: 45.45.45.45] 
     [ Server 1-A, internal ip: 10.0.0.1, external ip: 200.0.0.1 ]
     [ Server 1-B, internal ip: 10.0.0.2, external ip: 200.0.0.2 ]
     [ Server 1-C, internal ip: 10.0.0.3, external ip: 200.0.0.3 ]

[ Data Center 2 ]
   [ load balancer, ip: 90.90.90.90] 
     [ Server 2-A, internal ip: 10.0.0.1, external ip: 201.0.0.1 ]
     [ Server 2-B, internal ip: 10.0.0.2, external ip: 201.0.0.2 ]
     [ Server 2-C, internal ip: 10.0.0.3, external ip: 201.0.0.3 ]

[ Data Center 3 ]
   [ load balancer, ip: 88.88.88.88] 
     [ Server 3-A, internal ip: 10.0.0.1, external ip: 221.0.0.1 ]
     [ Server 3-B, internal ip: 10.0.0.2, external ip: 221.0.0.2 ]
     [ Server 3-C, internal ip: 10.0.0.3, external ip: 221.0.0.3 ]

Я хотел бы добиться того, чтобы каждый сервер устанавливал один сервер mongo, и только серверы Data Center 1 (1-A, 1-B и 1-C) могли быть первичными. Серверы MongoDB в Data Center 2 и Data Center 3 являются только вторичными. Приложения могут специально считывать данные из центра обработки данных 2, поскольку эти приложения могут находиться в той же сети, что и центр обработки данных 2, который имеет более быстрый доступ, чем подключение к центру обработки данных 1. Сервер использует наборы реплик. Шардинга нет.

Вот мои вопросы:

  1. Нужно ли при настройке набора реплик использовать внешний реальный IP-адрес для указания хоста из ЦОД 2 и 3? например

    config = {  _id: 'foo', members: [
                          // data center 1
                          {_id: 0, host: '10.0.0.1:27017'},
                          {_id: 1, host: '10.0.0.2:27017'},
                          {_id: 2, host: '10.0.0.3:27017'},
                          // data center 2
                          {_id: 3, host: '201.0.0.1:27017'},
                          {_id: 4, host: '201.0.0.2:27017'},
                          {_id: 5, host: '201.0.0.3:27017'},
                          // data center 3
                          {_id: 6, host: '221.0.0.1:27017'},
                          {_id: 7, host: '221.0.0.2:27017'},
                          {_id: 8, host: '221.0.0.3:27017'}
                         ]
           }
    
  2. Поскольку серверы в Центре обработки данных 2 будут защищены балансировщиком нагрузки и брандмауэром, IP-адрес может не попасть во внешний мир. Можно ли использовать IP-адрес балансировщика нагрузки? если да, то как это сделать?

  3. Я должен использовать Priorty=0, чтобы серверы в Центре обработки данных 2 и Центре обработки данных 3 никогда не были первичными, верно?

  4. Как другое приложение подключается к MongoDB в центрах обработки данных 2 и 3 (только для чтения данных)? Допустим, приложение (приложение на стороне сервера) также находится в сети Data Center 2. Какой IP-адрес должно использовать приложение для подключения к MongoDB в DC2? Должен ли я использовать внутренний IP или внешний IP? Если приложение находится за пределами внутренней сети БД и хочет подключиться к MongoDB в DC2 только для чтения данных, должен ли я использовать IP-адрес балансировщика нагрузки или внешний IP-адрес?

  5. Поскольку я хочу, чтобы серверы в DC2 и DC3 могли разрешать чтение данных, как установить slaveOk? Должен ли я установить его в основном «slaveOK» или я должен установить его на каждом сервере в DC2 и DC3?

  6. Еще один шаг вперед, скажем, DC1, DC2 и DC3 — все это отдельные наборы реплик. например DC 1 имеет только первичный и вторичный. У DC2 есть свои первичный и вторичный, пока что DC3. Существует ли простой способ обновления DC2 и DC3 в режиме реального времени при наличии изменений (новая запись или обновление) в DC1?


person murvinlai    schedule 27.10.2011    source источник


Ответы (1)


  1. Смотря как. Это должны быть имена хостов/IP-адреса, к которым могут получить доступ ваши серверы приложений. Если ваши серверы приложений работают на том же DC, что и ваш процесс mongod, они могут и должны быть внутренними. Любая другая установка имеет серьезные проблемы с безопасностью.
  2. Технически, да. Назначьте каждому процессу mongod отдельный порт. Однако я не понимаю, почему вы когда-либо хотели, чтобы балансировщик нагрузки распределял запросы монго. Это то, что драйвер сделает за вас, и могут быть даже побочные эффекты, если позволить чему-то другому, кроме драйвера, решать, к какому члену RS направляется запрос.
  3. Верный.
  4. Внутренние IP-адреса — это путь. Серверы приложений должны инициализировать свой драйвер со всеми внутренними IP-адресами локальных членов (читай: членов на одном контроллере домена).
  5. Вы не настраиваете серверы на slaveOk. Функциональность SlaveOk находится на стороне драйвера. Обычно устанавливается для каждого соединения, но большинство драйверов также имеют глобальный флаг и флаг для каждого запроса. Очевидно, что ваша установка не будет работать без включенного этого флага.
  6. Нет. В MongoDB atm нет репликации master-master.
person Remon van Vliet    schedule 28.10.2011
comment
Спасибо.. за 2) причина не в том, что я хочу. это потому, что я ограничен этой установкой. внешний запрос не может напрямую обращаться к внутренним серверам. должен пройти через брандмауэр или балансировщик нагрузки, чтобы выполнить сопоставление. - person murvinlai; 28.10.2011
comment
2) может быть, у меня есть порты 27017, 27018 и 27019, указывающие на каждый внутренний сервер (ip1:27017, ip2:27018 и ip3:27019) - person murvinlai; 28.10.2011
comment
Большое спасибо за совет. :) - person murvinlai; 28.10.2011