Добавить нового члена в монго и предотвратить исключение ошибки в приложении

У меня есть три экземпляра на EC2, каждый со сервисным монго, настроенным с набором реплик, т. е. первичный (192.168.1.1), вторичный (192.168.1.2) и арбитр (192.168.1.3).

У меня есть несколько приложений, которые подключаются к монго.

Мой вопрос заключается в следующем:

Если я добавлю еще одного члена в реплику, мне придется изменить все приложения в настройке подключения, чтобы включить новый член?

Потому что я спрашиваю.

Предположим, что ip с конечным номером .1 является первичным, а .2 — вторичным, а затем добавьте новый элемент в конец ip .4. И я не включаю этого нового члена в настройки базы данных приложения. И если первичка падает, арбитр выбирает ip с .4 в качестве новой первички. Все приложения начнут выбрасывать исключения.

Как я могу «исправить» это таким образом, чтобы всегда добавлять нового члена, не нужно менять конфигурацию базы данных приложения. Представьте, если мне нужно добавить «n» членов.

Есть ли у вас способ настроить приложение, зная, что мое приложение находится на PHP, чтобы идентифицировать только первичное устройство без необходимости добавлять конфигурацию хоста?


person pedrosalpr    schedule 28.09.2016    source источник
comment
Это трудно; если вам не повезет, и ваш первоначальный набор хостов навсегда останется включенным в набор реплик, и всегда есть хотя бы один из них активным и доступным, тогда вам придется в конечном итоге изменить конфигурацию приложения. Различные решения этой проблемы называются service-discovery и предполагают, что ваше приложение связывается с третьей системой, чтобы узнать, где он может подключаться к набору реплик.   -  person Vince Bowdren    schedule 20.10.2016


Ответы (1)


В приложении ничего менять не нужно. Вы просто добавляете новый узел в набор реплик с помощью команды rs.add("address:port"). Если у вас есть три узла (основной и 2 дополнительных), у вас НЕ должно быть арбитра, если все эти узлы являются членами с правом голоса. (количество голосов всегда должно быть нечетным)

Вы можете «выбрать» основной порядок наследия со значениями приоритета. Если вы установите приоритет узлов .1, например. до 3, .2 приоритет узлов до 2 и сохранить последний вторичный приоритет в качестве приоритета 1, .1 остается основным, если он может, а когда нет, .2 выбирается в качестве основного... Дело в том, что достаточно, чтобы ваше приложение подключалось к одному узел набора реплик, и он (приложение) автоматически получает информацию о том, какие другие узлы этого набора реплик и «кто» являются первичными.

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

person JJussi    schedule 28.09.2016
comment
Это будет работать нормально, если в набор реплик будет внесено всего несколько изменений. Если вы в конечном итоге внесете много изменений (например, добавите пять новых хостов, а затем удалите исходные три хоста), тогда строка подключения приложения больше не будет действительной, поскольку она не включает адрес ни одного из активных хостов. - person Vince Bowdren; 20.10.2016