У меня есть простая настройка 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 не дают никаких подсказок относительно того, что не так. Любая помощь приветствуется!
Итак, во-первых, не давайте драйверу адрес арбитра, только первичный - у драйвера нет причин когда-либо разговаривать с арбитром, у него нет данных. Когда будет подключен только основной, он будет подключаться только к основному, и ваша проблема должна исчезнуть.
Другое дело ваша установка - наличие арбитра с одним узлом ничего вам не покупает и фактически делает ваш набор менее надежным, чем более стабильным.
Сценарий 1: арбитр отключился / отключился
Сценарий 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.
Вы не соответствуете установленным минимальным требованиям.