Удалить недоступный монго осколок
У меня есть установка сегментированных 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 с одним пустым шардом
- Запустить один старый осколок как автономный
- Сделайте резервную копию этого старого осколка
- Снеси этот старый осколок
- построить новый пустой осколок
- добавить новый осколок в новый кластер
- восстановить данные в новый кластер
- резервную копию можно удалить, а осколок можно повторно использовать в новом кластере
- Повторите выше для каждого осколка в вашем кластере (скорее всего, сломанный осколок может быть пропущен)