我有一個集合,其中分片鍵是UUID(十六進制字符串)。該集合非常龐大:812百萬份文檔,2張分片大約9600個大塊。出於某種原因,我最初存儲的文件不是UUID,而是在分區鍵字段中有整數。後來我徹底刪除了它們,現在我的所有文檔都被UUID分割了。但是我現在面臨着大塊分佈的問題。雖然我的文檔是整數而不是UUID,但平衡器爲這些文檔創建了大約2700個塊,並將所有這些文件保留在一個碎片上。當我刪除所有這些文件時,塊沒有被刪除,它們保持空白,並且它們將一直爲空,因爲我現在只使用UUID。由於平衡器distrubutes塊依靠塊每碎片算,不單證數量和大小,我的碎片一個需要比其他3倍以上的磁盤空間:如何從mongodb碎片中刪除塊
--- 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中不提供命令,刪除或手動合併塊。 我的主要問題是,這個對子級作品的任何擺脫空塊:
停止平衡器。連接到每個配置服務器,從
config.chunks
範圍刪除空塊,並且還修復minKey
切片以在第一個非空塊開始時結束。啓動平衡器。 似乎有風險,但據我所知,config.chunks
是存儲塊信息的唯一地方。停止平衡器。啓動一個新的mongod實例並將其連接爲第三個分片。手動將所有空塊移動到這個新碎片,然後永遠關閉它。啓動平衡器。 不確定,但只要我不再使用分片鍵中的整數值,所有查詢都應該正常運行。