Вот окружение:
[ 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. Сервер использует наборы реплик. Шардинга нет.
Вот мои вопросы:
Нужно ли при настройке набора реплик использовать внешний реальный 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 будут защищены балансировщиком нагрузки и брандмауэром, IP-адрес может не попасть во внешний мир. Можно ли использовать IP-адрес балансировщика нагрузки? если да, то как это сделать?
Я должен использовать Priorty=0, чтобы серверы в Центре обработки данных 2 и Центре обработки данных 3 никогда не были первичными, верно?
Как другое приложение подключается к MongoDB в центрах обработки данных 2 и 3 (только для чтения данных)? Допустим, приложение (приложение на стороне сервера) также находится в сети Data Center 2. Какой IP-адрес должно использовать приложение для подключения к MongoDB в DC2? Должен ли я использовать внутренний IP или внешний IP? Если приложение находится за пределами внутренней сети БД и хочет подключиться к MongoDB в DC2 только для чтения данных, должен ли я использовать IP-адрес балансировщика нагрузки или внешний IP-адрес?
Поскольку я хочу, чтобы серверы в DC2 и DC3 могли разрешать чтение данных, как установить slaveOk? Должен ли я установить его в основном «slaveOK» или я должен установить его на каждом сервере в DC2 и DC3?
Еще один шаг вперед, скажем, DC1, DC2 и DC3 — все это отдельные наборы реплик. например DC 1 имеет только первичный и вторичный. У DC2 есть свои первичный и вторичный, пока что DC3. Существует ли простой способ обновления DC2 и DC3 в режиме реального времени при наличии изменений (новая запись или обновление) в DC1?