Удалить недоступный монго осколок

У меня есть установка сегментированных MongoDB с 3 шардами: shard0000, shard0001 и shard0002. Компьютер, на котором запущен shard0002, сейчас не работает, что приводит к сбою всех моих запросов. Я бы хотел временно удалить shard0002 из моей настройки и продолжить работу с первыми двумя шардами. Это должно быть выполнимо, если я использую только неохраненные коллекции, которые находятся в первых двух шардах, верно?

То, что я попробовал сначала: db.runCommand({removeshard: 'IP:PORT'}) что, очевидно, не помогает, потому что просто переводит осколок в режим слива, который никогда не закончится (так как он выключен). Затем я попытался подключиться к моему серверу конфигурации и сделал db.shards.remove({_id: 'shard0002'}) на конфигурационной базе данных затем перезапустите mongos, чтобы он перезагрузил конфигурацию. Теперь, когда я пытаюсь что-то сделать, я получаю сообщение "не могу найти шарда для: shard0002".

Есть ли способ, чтобы просто сообщить Монго, что мне сейчас не нужен этот осколок, а затем включить его позже, когда он станет доступен.

2 ответа

Решение

Вручную измените запись шарда в конфиге БД, затем removeshard

У меня была другая проблема, и я вручную удалил осколок с помощью:

use config
db.shards.remove({"_id":"shard0002"});

Я пробовал несколько вариантов сделать это в версии 4.2.

В конце я остановился на следующих командах, которые должны быть выполнены на сервере конфигурации:

use config

db.databases.updateMany( {primary: "shard0002"}, {$set: {primary: "shard0000"} })
db.shards.deleteOne({_id : "shard0002" })
db.chunks.updateMany( {shard : "shard0002"}, {$set: {shard: "shard0000"} })

while ( db.chunks.updateMany( {"history.shard" : "shard0002"}, 
      {$set: {"history.$.shard": "shard0000"} }).modifiedCount > 0 ) { print("Updated") }

В какой-то степени он работает, т.е. операции CRUD работают. Однако когда вы бежитеgetShardDistribution()тогда вы получите сообщение об ошибке Коллекция db.collection не сегментирована.

Наконец, я вижу только одно надежное и безопасное решение:

  • Выключите все mongod и mongos в вашем сегментированном кластере
  • Запуск доступных сегментов как автономной службы (см. Выполнение обслуживания элементов набора реплик)
  • Сделайте резервную копию из доступных шардов с помощью mongodump.
  • Удалите папки с данными со всех хостов.
  • Создайте новое приложение с нуля. Запускаем все монгоды и монго
  • Загрузите данные в новый кластер с помощью mongorestore

Возможно, для большого кластера вам придется перетасовать примерно так:

  • Разверните серверы Config и сервер mongos с одним пустым шардом
    1. Запустить один старый осколок как автономный
    2. Сделайте резервную копию этого старого осколка
    3. Снеси этот старый осколок
    4. построить новый пустой осколок
    5. добавить новый осколок в новый кластер
    6. восстановить данные в новый кластер
    7. резервную копию можно удалить, а осколок можно повторно использовать в новом кластере
  • Повторите выше для каждого осколка в вашем кластере (скорее всего, сломанный осколок может быть пропущен)
Другие вопросы по тегам