Labutin
@Labutin
Web-разработчик

MONGO: Почему коннект не сразу переключается на второй сервер в случае падения первого?

Имеется три сервера монги: PRIMARY, SECONDARY и ARBITER
pkrs:PRIMARY> rs.status()
{
"set" : "pkrs",
"date" : ISODate("2014-04-09T05:44:14Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongodb01:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 93,
"optime" : Timestamp(1397022230, 2),
"optimeDate" : ISODate("2014-04-09T05:43:50Z"),
"self" : true
},
{
"_id" : 1,
"name" : "mongodb02:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 14,
"optime" : Timestamp(1397022230, 2),
"optimeDate" : ISODate("2014-04-09T05:43:50Z"),
"lastHeartbeat" : ISODate("2014-04-09T05:44:14Z"),
"lastHeartbeatRecv" : ISODate("2014-04-09T05:44:13Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "syncing to: mongodb01:27017",
"syncingTo" : "mongodb01:27017"
},
{
"_id" : 2,
"name" : "mongodba:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 92,
"lastHeartbeat" : ISODate("2014-04-09T05:44:14Z"),
"lastHeartbeatRecv" : ISODate("2014-04-09T05:44:14Z"),
"pingMs" : 0
}
],
"ok" : 1
}

Штатно все работает нормально. Вот так делается коннект + немного тестового кода:
$m = new MongoClient("mongodb://mongodb01,mongodb02,mysql-develop01,mongodba/?replicaSet=pkrs");
$db = $m->main;
$collection = $db->addPrice;
$collection->drop();

Последняя строка имеет номер 6. Это важно, т.к. ниже будет текст ошибки и там ссылка на 6-ю строку.
Останавливаю PRIMARY сервер.
Имеем вот такую картинку.
pkrs:PRIMARY> rs.status()
{
"set" : "pkrs",
"date" : ISODate("2014-04-09T05:49:17Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongodb01:27017",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : Timestamp(1397022230, 2),
"optimeDate" : ISODate("2014-04-09T05:43:50Z"),
"lastHeartbeat" : ISODate("2014-04-09T05:49:16Z"),
"lastHeartbeatRecv" : ISODate("2014-04-09T05:49:04Z"),
"pingMs" : 0
},
{
"_id" : 1,
"name" : "mongodb02:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 318,
"optime" : Timestamp(1397022230, 2),
"optimeDate" : ISODate("2014-04-09T05:43:50Z"),
"self" : true
},
{
"_id" : 2,
"name" : "mongodba:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 317,
"lastHeartbeat" : ISODate("2014-04-09T05:49:16Z"),
"lastHeartbeatRecv" : ISODate("2014-04-09T05:49:16Z"),
"pingMs" : 0
}
],
"ok" : 1
}

А вот если выполнить приведенный выше код на PHP, то в течение нескольких секунд имеем вот такую ошибку:
Fatal error: Uncaught exception 'MongoConnectionException' with message 'No candidate servers found' in /var/www/test/mongo.php on line 6
MongoConnectionException: No candidate servers found in /var/www/test/mongo.php on line 6


Собственно, вопрос: почему? Ведь второй сервер уже взял на себя роль PRIMARY. Почему ошибка? Ну и она сама пропадает через 4-5 секунд.
  • Вопрос задан
  • 2907 просмотров
Решения вопроса 1
7workers
@7workers
Replica set members send heartbeats (pings) to each other every two seconds. If a heartbeat does not return within 10 seconds, the other members mark the delinquent member as inaccessible.

docs.mongodb.org/manual/core/replica-set-elections

Если коротко - то так и должно быть. Оно не работает мгновенно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы