Как переконфигурировать набор реплик в MongoDB?
Сейчас на курсах 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" } ] }