0

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

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

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

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

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

Что я проверил/пытался до сих пор:

Все хосты достижимы. Я пытаюсь pinging по имени хоста из каждой коробки, и он работает alll.

Вот как набор реплик был настроен в соответствии с 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"); 

Я все еще читаю на наборах реплик и т. Д., Поэтому я уверен, что это нечто hing, что я пропустил/пренебрег настройкой. Например, я не настроил arbitor ... Не уверен, что это связано или нет, но на всякий случай, я думал, что упомянул об этом. Я не уверен, что еще проверить.

Спасибо.

ответ

1

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

Link to documentation

0

Пожалуйста, проверьте также РНР Монго PECL Lib версия. До 1.5.6 произошли 2 ошибки, связанные с невозможностью выбора первичного сервера через PHP после сбоя в наборе реплик. Обязательно иметь не менее 1,5.6.

Смежные вопросы