У меня есть набор реплик, состоящий из 5 элементов: основной + арбитр на сервере 1, дополнительный + арбитр на сервере 2, скрытый дополнительный (резервный узел) на сервере 3.
Я ожидаю, что эта конфигурация будет работать, если один сервер выйдет из строя или временно потеряет связь.
Однако, когда сервер 2 вышел из строя (тот, который имеет вторичные узлы + арбитры), я столкнулся со странной проблемой. Любое подключение к реплике из PHP занимало больше минуты. Я попытался изменить строку подключения, чтобы исключить сервер, который был недоступен (вторичный узел), но это не помогло.
В то же время подключение через консоль Монго работало просто отлично.
Основной узел оставался основным. В журнале ошибок PHP не было ошибок.
Единственное, что помогло, — это удаление узлов на сервере, которые вышли из набора реплик.
Тем не менее, теперь я беспокоюсь о сбое конфигурации. Как я теперь понимаю, если сервер с вторичными + узлами арбитра выйдет из строя, вся конфигурация перестанет работать должным образом. Есть ли способ избежать этого? Мне нужно, чтобы клиент PHP мог подключаться к первичному серверу независимо от того, доступен ли вторичный сервер + арбитр или нет. Как этого добиться?
Версия клиентской библиотеки mongo PHP — 1.6.x, версия сервера — 3.0.
Ваша конфигурация не будет работать, если сервер 2 выйдет из строя. Ваш набор реплик имеет 3 голосующих узла, два из которых находятся на сервере 2. Если сервер 2 выходит из строя, набор имеет 1/3 члена и поэтому не может обслуживать или выбирать первичный. Вам нужно 2/3 в состоянии разговаривать друг с другом, чтобы выбрать основной.
Ваше описание проблемы не согласуется с поведением наборов реплик — при подключении к первичному через оболочку, когда 2/3 не работает, первичный оставшийся первичный не будет отображаться. Это уйдет на второй уровень. Вы уверены, что у вас есть правильные симптомы?
Просто интересно, как выглядит ваша строка подключения.
По моему опыту что-то вроде этого будет работать на конфигурации набора реплик:
$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017");
Но когда rs2 отключится, у меня будет такой же опыт, как вы описали.
Вы можете убедиться, что используете правильный формат строки подключения:
$m = new MongoClient("mongodb://rs1.example.com:27017", array("replicaSet" => "myReplSetName"));
или же
$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName");