У меня есть коллекция, в которой ключ сложения - UUID (шестнадцатеричная строка). Коллекция огромна: 812 миллионов документов, около 9600 кусков на 2 осколка. По какой-то причине я изначально хранил документы, которые вместо UUID имели целое число в поле ключа окорок. Позже я удалил их полностью, и теперь все мои документы зашли UUID. Но теперь у меня проблема с распределением кусков. Хотя у меня были документы с целым числом вместо UUID, балансир создал около 2700 кусков для этих документов и оставил их на одном осколке. Когда я удалил все эти документы, куски не были удалены, они остались пустыми, и они всегда будут пустыми, потому что теперь я использую UUID. Так как балансировочное distrubutes глыба, опирающаяся на куске рассчитывать на осколок, не документировать количество или размер, один из моих осколков занимают в 3 раза больше дискового пространства, чем другой:Как удалить куски из mongodb shard
--- Sharding Status ---
db.click chunks:
set1 4863
set2 4784 // 2717 of them are empty
set1> db.click.count()
191488373
set2> db.click.count()
621237120
Печально то здесь MongoDB не предоставляют команды для удаления или объединить куски вручную. Мой главный вопрос, whould ничего об этой работе, чтобы избавиться от пустых кусков:
Остановить балансир. Подключитесь к каждому конфигурационному серверу, удалите из
config.chunks
диапазоны пустых кусков, а также исправьтеminKey
срез до конца в начале первого непустого фрагмента. Начните балансировку. Кажется рискованным, но, насколько я вижу,config.chunks
- это единственное место, где хранится информация о куске.Остановите балансировку. Начните новый экземпляр mongod и соедините его как 3-й осколок. Вручную переместите все пустые куски на этот новый осколок, а затем закройте его навсегда. Начните балансировку. Не уверен, но до тех пор, пока я не буду использовать целочисленные значения в ключе с закрытием, все запросы должны работать нормально.