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.

Вы не соответствуете определенным минимальным требованиям.

Другие вопросы по тегам