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

#mongodb #database-replication

#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, и только серверам центра обработки данных 1 (1-A, 1-B и 1-C) разрешено быть первичными. Серверы MongoDB в дата-центре 2 и дата-центре 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. Я должен использовать приоритет = 0, чтобы серверы в центре обработки данных 2 и центре обработки данных 3 никогда не были основными, верно?
  4. Как другое приложение подключается к MongoDB в центрах обработки данных 2 и 3 (только для чтения данных)? Допустим, приложение (приложение на стороне сервера) также находится в сети центра обработки данных 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?

Ответ №1:

  1. Зависит. Это должны быть имена хостов / IP-адреса, к которым могут получить доступ ваши серверы приложений. Если ваши серверы приложений работают на том же DC, что и ваш процесс mongod, они могут и должны быть внутренними. Любая другая настройка имеет серьезные проблемы с безопасностью.
  2. Технически, да. Назначьте каждому процессу mongod отдельный порт. Однако я не понимаю, почему вы когда-либо хотели, чтобы балансировщик нагрузки распространял запросы mongo. Это то, что драйвер сделает для вас, и могут даже быть побочные эффекты, если позволить чему-то другому, а не драйверу, решать, к какому члену RS отправляется запрос.
  3. Правильно.
  4. Внутренние IP-адреса — это правильный путь. Серверы приложений должны инициализировать свой драйвер всеми внутренними IP-адресами локальных участников (читай: участников на одном и том же DC)
  5. Вы не устанавливаете серверы в slaveOk. Функциональность slaveOk зависит от драйвера. Обычно устанавливается для каждого соединения, но большинство драйверов также имеют для него флаг global и per query. Очевидно, что ваша настройка не будет работать без этого включенного флага.
  6. Нет. В MongoDB atm нет репликации master-master.

Комментарии:

1. Спасибо.. для 2) причина не в том, что я хочу. это потому, что я ограничен этой настройкой. внешний запрос не может напрямую обращаться к внутренним серверам. для выполнения сопоставления необходимо пройти через брандмауэр или балансировщик нагрузки.

2. 2) может быть, у меня есть порты 27017, 27018 и 27019, указывающие на каждый внутренний сервер (ip1: 27017, ip2: 27018 и ip3: 27019)

3. Большое спасибо за совет. 🙂