Неперехваченное исключение «MongoCursorException» с сообщением «Не удалось установить соединение: серверы-кандидаты не найдены»

Описание проблемы

У меня есть набор реплик из трех членов и веб-интерфейс php, который а) записывает запись, а затем б) выполняет .find() в коллекции и возвращает все документы в базе данных.

Чтобы лучше понять, как работают наборы реплик, я сделал следующее:

  1. остановил службу mongo на основном сервере (mongohost1). веб-страница продолжала работать.
  2. остановил службу mongo на сервере, который был повышен до основного (mongohost2). На данный момент, несмотря на то, что у меня есть другой хост mongo (mongohost3) с той же базой данных, веб-приложение PHP завершается с ошибкой, указанной выше.

Я ожидал, что система позволит мне хотя бы прочитать записи из базы данных, даже если запись не удалась.

Что я уже проверил/попробовал:

Все хосты доступны. Я пытаюсь пинговать по имени хоста с каждого ящика, и все работает.

Вот как настроен набор реплик в соответствии с mongohost3:

        jlrs0:SECONDARY> cfg=rs.config()
        {
            "_id" : "jlrs0",
            "version" : 5,
            "members" : [
                {
                    "_id" : 0,
                    "host" : "monghost1.test.mm.org:27017",
                    "priority" : 3
                },
                {
                    "_id" : 1,
                    "host" : "mongohost2.test.mm.org:27017",
                    "priority" : 2
                },
                {
                    "_id" : 2,
                    "host" : "mongohost3.test.mm.org:27017",
                    "priority" : 2
                }
            ]
        }
        jlrs0:SECONDARY> 

и статус каждого члена в наборе реплик для каждого mongohost3:

jlrs0:SECONDARY> rs.status()
{
    "set" : "jlrs0",
    "date" : ISODate("2014-11-19T15:16:21Z"),
    "myState" : 2,
    "members" : [
        {
            "_id" : 0,
            "name" : "mongohost1.test.mm.org:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : Timestamp(1416419914, 1),
            "optimeDate" : ISODate("2014-11-19T17:58:34Z"),
            "lastHeartbeat" : ISODate("2014-11-19T15:16:20Z"),
            "lastHeartbeatRecv" : ISODate("2014-11-19T14:06:49Z"),
            "pingMs" : 0
        },
        {
            "_id" : 1,
            "name" : "mongohost2.test.mm.org:27017",
            "health" : 0,
            "state" : 8,
            "stateStr" : "(not reachable/healthy)",
            "uptime" : 0,
            "optime" : Timestamp(1416419914, 5),
            "optimeDate" : ISODate("2014-11-19T17:58:34Z"),
            "lastHeartbeat" : ISODate("2014-11-19T15:16:17Z"),
            "lastHeartbeatRecv" : ISODate("2014-11-19T14:10:58Z"),
            "pingMs" : 0
    },
    {
        "_id" : 2,
        "name" : "mongohost3.test.mm.org:27017",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 451417,
        "optime" : Timestamp(1416419914, 5),
        "optimeDate" : ISODate("2014-11-19T17:58:34Z"),
        "self" : true
    }
],
"ok" : 1
}

Вот код PHP для подключения:

        $m = new   MongoClient("mongodb://mongohost1.test.mm.org:27017,mongohost2.test.mm.org:27017,mongohost3.test.mm.org:27017/?replicaSet=jlrs0");

Я все еще читаю о наборах реплик и т. Д., Так что я уверен, что это что-то, что я пропустил / забыл настроить. Например, я не настроил арбитра... не уверен, связано это или нет, но на всякий случай я решил упомянуть об этом. Я не уверен, что еще проверить.

Спасибо.


person dot    schedule 19.11.2014    source источник


Ответы (2)


Вам нужно установить предпочтение чтения на primaryPreferred. Вам нужно указать, что можно читать из вторичного, когда первичный недоступен. По умолчанию это не так.

Ссылка на документацию

person vav    schedule 19.11.2014

Пожалуйста, проверьте также вашу версию php mongo pecl lib. До версии 1.5.6 было 2 ошибки, связанные с тем, что PHP не выбрал первичный сервер после сбоя в наборе реплик. Обязательно наличие pecl mongo не ниже 1.5.6.

person senkal    schedule 29.11.2014