Mongodb продолжает сообщать, что "первичный не найден", но оболочка работает нормально
У меня есть простая установка mongodb в репликасе, с 1 фактическим экземпляром и 1 арбитром (чтобы избежать конфликтов). Это ожидание расширения репликационного набора для включения большего количества экземпляров по мере увеличения нашей нагрузки.
Если я получаю доступ к mongodb через оболочку, я правильно получаю PRIMARY >
подскажите, и работает rs.status()
говорит мне, что все в порядке и денди.
У меня есть сервер node.js, который обращается к базе данных, используя собственный драйвер mongodb, найденный на github, версия 0.9.9-8. Однако иногда он просто выходит из строя со следующей ошибкой: Unable to connect to database: Error: no primary server found
Программа получает два адреса для двух экземпляров (обычный экземпляр + арбитр), но в противном случае ни журнал программы, ни журнал mongodb не дают никакой подсказки о том, что не так. Любая помощь приветствуется!
2 ответа
Итак, во-первых, не давайте драйверу адрес арбитра, а только основной - у водителя нет никаких оснований когда-либо разговаривать с арбитром, у него нет данных. Если к нему подключиться только основной сервер, он будет подключаться только к первичному серверу, и ваша проблема должна исчезнуть.
Ваша настройка - другое дело - наличие арбитра с одним узлом ничего не покупает и фактически делает ваш набор менее надежным, чем более стабильным.
Сценарий 1: арбитр отключается / не работает
- Основной - единственный оставшийся узел и проголосовал за себя
- 1/2 голоса не является большинством, поэтому первичный не может быть избран и становится вторичным
- Ваш набор отключен и не может принимать записи
Сценарий 2: основной отключается / не работает
- Нет узла с данными, арбитр не может голосовать за себя
- 0/2 голосов, фактические узлы данных недоступны, ваш набор находится в автономном режиме
Как вы можете видеть, на самом деле было бы лучше всего с одним основным узлом - потому что все, что делает арбитр, это вводит способ для вашего набора быть недоступным, когда основной работает просто отлично. Другой вариант, конечно, будет добавить вторичный и перейти на 3 узла - тогда вы фактически получите преимущества избыточности набора реплик.
Это цитата из http://docs.mongodb.org/manual/core/replication/
The minimum requirements for a replica set include two members with data,
for a primary and a secondary, and an arbiter. In most circumstances,
however, you will want to deploy three data members.
Вы не соответствуете определенным минимальным требованиям.