2013-03-15 3 views
0

У меня есть коллекция, в которой ключ сложения - 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 ничего об этой работе, чтобы избавиться от пустых кусков:

  1. Остановить балансир. Подключитесь к каждому конфигурационному серверу, удалите из config.chunks диапазоны пустых кусков, а также исправьте minKey срез до конца в начале первого непустого фрагмента. Начните балансировку. Кажется рискованным, но, насколько я вижу, config.chunks - это единственное место, где хранится информация о куске.

  2. Остановите балансировку. Начните новый экземпляр mongod и соедините его как 3-й осколок. Вручную переместите все пустые куски на этот новый осколок, а затем закройте его навсегда. Начните балансировку. Не уверен, но до тех пор, пока я не буду использовать целочисленные значения в ключе с закрытием, все запросы должны работать нормально.

ответ

0

Некоторые могут прочитать это и подумать, что пустые куски занимают пространство. Это не так - куски сами не занимают места - это логические диапазоны ключей осколков.

Однако балансировка блоков по осколкам основана на количестве кусков, а не на размере каждого куска.

Вы можете добавить свой голос к этому билету: https://jira.mongodb.org/browse/SERVER-2487

0

Поскольку MongoDB балансир только остатки Кусков номера через осколки, имея слишком много пустых кусков в коллекции может привести к черепкам быть сбалансированы по количеству порций, но сурово несбалансированный по размеру данных на каждый осколок (например, как показано db.myCollection.getShardDistribution()).

Вам нужно идентифицировать пустые куски и объединить их в куски, содержащие данные. Это устранит пустые куски. Все это теперь задокументировано в документах Mongodb (не менее 3,2 и выше, возможно, даже до этого).