2013-03-15 101 views
0

我有一個集合,其中分片鍵是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中不提供命令,刪除或手動合併塊。 我的主要問題是,這個對子級作品的任何擺脫空塊:

  1. 停止平衡器。連接到每個配置服務器,從config.chunks範圍刪除空塊,並且還修復minKey切片以在第一個非空塊開始時結束。啓動平衡器。 似乎有風險,但據我所知,config.chunks是存儲塊信息的唯一地方。

  2. 停止平衡器。啓動一個新的mongod實例並將其連接爲第三個分片。手動將所有空塊移動到這個新碎片,然後永遠關閉它。啓動平衡器。 不確定,但只要我不再使用分片鍵中的整數值,所有查詢都應該正常運行。

回答

0

有人可能會讀這個,並認爲空塊是佔用空間。情況並非如此 - 塊本身不佔用空間 - 它們是分片鍵的邏輯範圍。

但是,跨分片的塊平衡是基於塊的數量而不是每個塊的大小。

你可能想你的聲音添加到這張票:https://jira.mongodb.org/browse/SERVER-2487

0

因爲MongoDB的平衡只有平衡豆腐塊跨碎片數量,具有收集太多的空塊可能會導致碎片由塊數,但嚴重地平衡由於每個分片的數據大小不均衡(例如,如db.myCollection.getShardDistribution()所示)。

您需要識別空白塊,並將它們合併爲具有數據的塊。這將消除空塊。現在所有文檔都在Mongodb文檔中記錄(至少3.2以上,甚至可能在此之前)。