Как переконфигурировать набор реплик в MongoDB?

Материал из support.qbpro.ru

источник

Сейчас на курсах MongoDB для DBA изучаю репликацию. Частенько приходится создавать и перезапускать наборы реплик. Главное при перезапуске не забывать о реконфигурации. Иначе можно попасть во всякие неприятные штуки. в которые я попадал на первых порах. Сейчас я освоился и могу немного рассказать о самый полезных командах.

После того как вы проинициализировали свой набор реплик методом rs.initiate() вы больше не можете переинициализировать его повторно с помощью этой же команды. Вы получите ошибку:

{
“info” : “try querying local.system.replset to see current configuration”,
“errmsg” : “already initialized”,
“ok” : 0
}

Для переконфигурации набора реплик в MongoDB предусмотрена команда rs.reconfig(сfg, {force: true}). Вот пример использования:

PRIMARY> cfg = {
... _id: "myrs1",
... members: [
... {_id: 0, host: "denis-home:27001"},
... {_id: 1, host: "denis-home:27002"},
... {_id: 2, host: "denis-home:27003"}
... ]
... }
{
    "_id" : "myrs1",
    "members" : [
        {
            "_id" : 0,
            "host" : "denis-home:27001"
        },
        {
            "_id" : 1,
            "host" : "denis-home:27002"
        },
        {
            "_id" : 2,
            "host" : "denis-home:27003"
        }
    ]
}
// пробуем проинициализировать, но получаем ошибку
PRIMARY> rs.initiate(cfg)
{
    "info" : "try querying local.system.replset to see current configuration",
    "errmsg" : "already initialized",
    "ok" : 0
}
// смотрим какой у нас сейчас конфиг
PRIMARY> c = rs.conf()
{
    "_id" : "myrs1",
    "version" : 1,
    "members" : [
        {
            "_id" : 0,
            "host" : "denis-home:27001"
        }
    ]
}
// запускаем реконфиг
PRIMARY> rs.reconfig(cfg, {force: true})
{ "ok" : 1 }
PRIMARY> rs.conf()
{
    "_id" : "myrs1",
    "version" : 84963,
    "members" : [
        {
            "_id" : 0,
            "host" : "denis-home:27001"
        },
        {
            "_id" : 1,
            "host" : "denis-home:27002"
        },
        {
            "_id" : 2,
            "host" : "denis-home:27003"
        }
    ]
}

Команда rs.conf() возвращает конфигурацию набора реплик. Вы можете сохранить её в переменную и работать с этой переменной с помощью javascript. Например удалить первую реплику и затем передать модифицированную переменную как аргумент для команды rs.reconfig(). Вот небольшая иллюстрация:

// сохраняем конфигурацию в oldcfg
PRIMARY> oldcfg = rs.conf()
{
    "_id" : "myrs1",
    "version" : 84963,
    "members" : [
        {
            "_id" : 0,
            "host" : "denis-home:27001"
        },
        {
            "_id" : 1,
            "host" : "denis-home:27002"
        },
        {
            "_id" : 2,
            "host" : "denis-home:27003"
        }
    ]
}
// удаляем первую реплику из конфигурации используя javascript метод shift()
PRIMARY> oldcfg.members.shift()
{ "_id" : 0, "host" : "denis-home:27001" }
// проверяем правильно ли удалилось
PRIMARY> oldcfg
{
    "_id" : "myrs1",
    "version" : 84963,
    "members" : [
        {
            "_id" : 1,
            "host" : "denis-home:27002"
        },
        {
            "_id" : 2,
            "host" : "denis-home:27003"
        }
    ]
}
// зарускаем реконфиг с обновлённой конфигурацией
// тут у меня вываливаются не очень хорошие надписи, я пока ещё не разобрался почему так происходит. Несмотря на все эти сообщения с виду всё сработало правильно.
PRIMARY> rs.reconfig(oldcfg, {force: true})
Sat Nov 24 13:55:05 DBClientCursor::init call() failed
Sat Nov 24 13:55:05 query failed : admin.$cmd { replSetReconfig: { _id: "myrs1", version: 84964, members: [ { _id: 1, host: "denis-home:27002" }, { _id: 2, host: "denis-home:27003" } ] }, force: true } to: 127.0.0.1:27002
Sat Nov 24 13:55:05 trying reconnect to 127.0.0.1:27002
Sat Nov 24 13:55:05 reconnect 127.0.0.1:27002 ok
reconnected to server after rs command (which is normal)
// проверяем что мы действительно изменили конфигурацию
PRIMARY> rs.conf()
{
    "_id" : "myrs1",
    "version" : 102367,
    "members" : [
        {
            "_id" : 1,
            "host" : "denis-home:27002"
        },
        {
            "_id" : 2,
            "host" : "denis-home:27003"
        }
    ]
}