Подключение к набору реплик 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");