Сформируйте новый набор реплик с удаленными участниками - PullRequest
0 голосов
/ 01 июня 2019

Как настроить удаленные элементы набора реплик для формирования нового набора реплик?

У меня есть набор реплик с 4 экземплярами Mongod

Вывод rs.config ()

{
    "_id" : "rs0",
    "members" : [
        {
            "_id" : 0,
            "host" : "localhost:27031"
        },
        {
            "_id" : 1,
            "host" : "localhost:27032"
        },
        {
            "_id" : 2,
            "host" : "localhost:27033"
        },
        {
            "_id" : 3,
            "host" : "localhost:27034"
        }
    ],
    "settings" : {
       "replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2") 
    }
}

Я удалил 2 экземпляра из набора реплик

rs.remove("localhost:27033")
rs.remove("localhost:27034")

Теперь мое требование - сформировать новый набор реплик с этими двумя удаленными членами. Каков наилучший способ для этого?

Мое текущее решение

подключиться к удаленному участнику

mongo --port 27033

и выполнить

conf = {
        "_id" : "rs0",
        "members" : [
            {
                "_id" : 2,
                "host" : "localhost:27033"
            },
            {
                "_id" : 3,
                "host" : "localhost:27034"
            }
        ],
        "settings" : {
           "replicaSetId" : ObjectId("5cf22332f5b9d21b01b9b6b2") 
        }
    }

, а затем

rs.reconfig(conf, {force:true})

Результат

Это решение работало нормально практически. Удаленные члены сформировали репликационный набор, один из которых стал первичным, а другой стал вторичным. Данные были воспроизведены среди них. И этот набор реплик кажется изолированным от начального набора реплик, из которого они были удалены.

Беспокойство

1) Мне пришлось использовать принудительная реконфигурация . Не уверен насчет последствий.

"errmsg" : "replSetReconfig should only be run on PRIMARY, but my state is REMOVED; use the \"force\" argument to override",

2) Новый набор реплик на самом деле новый? В rs.config ()

  • replicaSetId совпадает со старым.

    "replicaSetId": ObjectId ("5cf22332f5b9d21b01b9b6b2")

  • Мне пришлось использовать то же значение для _id членов, что и в конфигурации старого набора реплик

    "errmsg": "Новая и старая конфигурации имеют членов с hosthost localhost: 27034, но в новой конфигурации поле _id равно 1, а в старой конфигурации это 3 для набора реплик rs0",

Это решение хорошо?

Есть ли лучшее решение?

Примечание : мне нужно сохранить данные из старого набора реплик (данные, которые присутствовали на момент удаления) в новом наборе реплик.

1 Ответ

2 голосов
/ 03 июня 2019

Как вы и подозревали, процедура не создала новый набор реплик.Скорее, это продолжение старого набора реплик, хотя внешне они выглядят по-разному.

На самом деле в документации MongoDB есть процедура, которая делает то, что вы хотите: Восстановление набора реплик из резервных копий MongoDB .Разница в том, что вы не восстанавливаете из резервной копии.Скорее, вы используете один из удаленных вторичных серверов для заполнения нового набора реплик.

Следовательно, вам нужно изменить первый шаг в процедуре, упомянутой в ссылке выше.Остальная часть процедуры будет такой же:

  1. Перезапустите удаленный вторичный сервер как отдельный (без параметра --replSet) и подключитесь к нему с помощью оболочки mongo.
  2. Удалите базу данных local в автономном узле:

    use local
    db.dropDatabase()
    
  3. Перезапустите экс-вторичное устройство, на этот раз с параметром --replSet (с новой репликойимя набора)

  4. Подключитесь к нему с помощью оболочки mongo.
  5. rs.initiate() нового набора.

После этого нового наборадолжен иметь другое replicaSetId по сравнению со старым набором.В моем быстром тесте описанной выше процедуры я вижу следующий результат:

Старый набор:

> rs.conf()
...
"replicaSetId": ObjectId("5cf45d72a1c6c4de948ff5d8")
...

Новый набор

> rs.conf()
...
"replicaSetId": ObjectId("5cf45d000dda9e1025d6c65e")
...

Как и при любом крупном развертыванииВнесите подобные изменения, убедитесь, что у вас есть резервная копия, и тщательно протестируйте процедуры, прежде чем делать это в производственной системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...