Подключение к набору реплик MongoDB занимает минуту + на PHP, когда вторичное недостижимое

У меня есть набор реплик, состоящий из 5 членов: первичный + арбитр на сервере 1, вторичный + арбитр на сервере 2, скрытый вторичный (резервный node) на сервере 3. Я ожидаю, что эта конфигурация будет работать, если один сервер снизится или временно потеряет связь.

Однако, когда сервер 2 опустился (тот, у кого есть вторичные + арбитры), я столкнулся с какой-то странной проблемой. Любое подключение к набору реплик из PHP занимало больше минуты. Я попытался изменить строку подключения, чтобы исключить из нее сервер, который был недоступен (вторичный node), но это не помогло.

В то же время соединение через консоль mongo работало отлично. Первичный node оставался основным. В журнале ошибок PHP не было ошибок.

Единственное, что помогло, - удалить узлы на сервере, которые упали с набора реплик.

Однако теперь я беспокоюсь об отказе от конфигурации. Как я понимаю, если сервер со вторичными + арбитрами будет работать, вся конфигурация перестанет работать должным образом. Есть ли способ избежать этого? Мне нужен PHP-клиент, чтобы иметь возможность подключаться к основному независимо от того, доступен ли сервер вторичного + арбитража или нет. Как достичь этого?

Версия клиентской библиотеки PHP mongo - 1.6.x, версия сервера - 3.0.

Ответ 1

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

Ваше описание проблемы не согласуется с тем, как ведут себя реплики - подключение к первичному через оболочку, когда 2/3 вниз, не отображает первичный оставшийся первичный. Это уступит второстепенному. Вы уверены, что у вас есть правильные симптомы?

Ответ 2

Просто интересно, как выглядит ваша строка подключения.

По моему опыту, что-то вроде этого будет работать на настройке конфигурации реплик:

$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");