Чтение из вторичного узла mongodb, когда нет соединения с первичным

У нас есть реплика mongodb с 3 экземплярами, где основной находится в центре обработки данных D1, а вторичные узлы - в центре обработки данных D2. Мы не нуждаемся в какой-либо опции отработки отказа в нашей установке и настроили ее, как описано на https://docs.mongodb.com/manual/tutorial/configure-secondary-only-replica-set-member/.

Приложение "А", работающее поверх вторичных узлов в том же центре данных D2, использует mongoose, и мы указали (с параметрами "ближайший" или "вторичный") для чтения данных из вторичных узлов.

Мы сталкиваемся с этими проблемами:

1) Можно ли сделать "А" для чтения с определенных вторичных узлов, не указав в конфигурациях соединения, где находится основной узел mongoDB?

2) Как мы можем заставить приложение "А" по-прежнему считывать данные со вторичного узла, если соединение между центрами обработки данных D1 и D2 потеряно, поэтому первичный узел mongoDB больше не доступен / не виден? Насколько я понимаю, это не работает, потому что даже буква "А" настроена на чтение из вторичного устройства, mongoDB все еще должен выполнить своего рода пинг / арбитраж между первичным и вторичным интерфейсом, прежде чем можно будет выполнить фактическую операцию чтения.

3) Возможно / рекомендуется иметь приложение в центре обработки данных D2, которое будет выполнять операции записи в первичный экземпляр с набором реплик mongodb непосредственно как автономный экземпляр, а не как часть набора реплик?

Версии: mongodb 3.2.9, mongoose 4.5.9

1 ответ

  1. Да, читать предпочтения с тегами

  2. В сетевом разделе с D1 и D2 первичный автоматически передается на один из тех узлов D2, который является наиболее "современным" по сравнению с первичным. С помощью "настроек приоритета" вы можете управлять этим выбором. Пока 2 узла из 3 работают, один из них считается первичным.

Давайте представим, что у вас есть три узла:

  • D1.N0
  • D2.N1
  • D2.N2

Вы должны расставить приоритеты для узлов:

  • D1.N0.priority = 3
  • D2.N1.priority = 2
  • D2.N2.priority = 1

Теперь, пока D1 достижим, D1.N0 является первичным. Когда у нас есть сетевой раздел между D1 и D2, D2.N1 становится основным и D2.N2 останется вторичным. Когда сетевой раздел закончен, D1.N0 "догонит" пропущенные данные, прочитав opLog D2.N1, и снова станет первичным, а D2.N1 - вторичным.

  1. Если у вас есть набор реплик, вы всегда должны писать в набор реплик и НИКОГДА не напрямую на отдельный узел!
Другие вопросы по тегам