Назад | Перейти на главную страницу

Не удается настроить набор реплик MongoDB из 3 узлов

Я просто следую инструкциям в документе MongoDB

Наборы реплик - Основы

для настройки набора реплик с 3 узлами. Все идет нормально, когда я выполняю инициацию и добавляю первый узел в основной.

[foo@host-a mongodb]$ bin/mongo localhost
MongoDB shell version: 1.8.2
connecting to: localhost
> rs.initiate()
{
        "info2" : "no configuration explicitly specified -- making one",
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}
> rs.add("host-b")
{ "ok" : 1 }

Пока все хорошо, но когда я пытаюсь добавить третий узел

myset:PRIMARY> rs.addArb("host-c")
Sun Aug  7 22:57:09 MessagingPort recv() errno:104 Connection reset by peer 127.0.0.1:27017
Sun Aug  7 22:57:09 SocketException: remote:  error: 9001 socket exception [1]
Sun Aug  7 22:57:09 DBClientCursor::init call() failed
Sun Aug  7 22:57:09 query failed : local.$cmd { count: "system.replset", query: {}, fields: {} } to: 127.0.0.1
Sun Aug  7 22:57:09 Error: error doing query: failed shell/collection.js:150
Sun Aug  7 22:57:09 trying reconnect to 127.0.0.1
Sun Aug  7 22:57:09 reconnect 127.0.0.1 ok

В результате текущий первичный стал вторичным, а хост-b был помечен как мертвый, но на самом деле он все еще жив.

myset:SECONDARY> rs.status()
{
        "set" : "myset",
        "date" : ISODate("2011-08-08T04:03:23Z"),
        "myState" : 2,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "host-a:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "optime" : {
                                "t" : 1312775799000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2011-08-08T03:56:39Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "host-b",
                        "health" : 0,
                        "state" : 6,
                        "stateStr" : "(not reachable/healthy)",
                        "uptime" : 0,
                        "optime" : {
                                "t" : 0,
                                "i" : 0
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2011-08-08T04:03:22Z"),
                        "errmsg" : "still initializing"
                }
        ],
        "ok" : 1
}

Как это могло случиться? Я просто следую руководству в документе, я что-то сделал не так? Более того, я ничего не могу сделать на текущем вторичном сервере. Это не позволяет мне перенастроить вторичный узел, но проблема в том, что первичного узла нет.

myset:SECONDARY> rs.reconfig({})
{
        "errmsg" : "replSetReconfig command must be sent to the current replica set primary.",
        "ok" : 0
}

Любые идеи?

Что бы я сделал:

  1. В системе, которую вы хотите оставить вторичной, установите приоритет 0
  2. В проблемной системе проверьте ее журнал. Убедитесь, что он прослушивает ожидаемый порт
  3. Убедитесь, что из всех систем у вас есть подключение к проблемной системе через порт, который она прослушивает.
  4. Удалите проблемную систему из конфигурации, затем снова добавьте ее

Hth!