2014-02-24 54 views
3

我們試圖在3個副本集(rs1,rs2,rs3)中對mongodb 2.4.9中的大集合進行分片。目前,所有數據都駐留在rs1上。Mongodb不分片

我們有3個配置的服務器上運行,並啓用了分片使用:

sh.enableSharding("test") 

然後,我們選擇了片鍵和分片集合:

sh.shardCollection("test.fs.chunks", { files_id : 1 , n : 1 }) 

之後,我們增加了我們額外的碎片:

sh.addShard("rs2/mongo2:27017") 

sh.addShard("rs3/mongo3:27017") 

但是 - 在4天后,所有數據仍駐留在rs1上。綜觀配置,我們是分片數據庫中被列爲「分區=真」:

{ "_id" : "test", "partitioned" : true, "primary" : "rs1" } 

然而,當我們執行db.fs.chunks.getShardDistribution(),我們都帶有說明該集合的錯誤是不是分片:

mongos> db.fs.chunks.getShardDistribution() 
Collection test.fs.chunks is not sharded. 

我們再試圖重新執行shardCollection命令,並收到一條錯誤消息,說明它已經是分片:

mongos> sh.shardCollection("test.fs.chunks", { files_id : 1 , n : 1 }) 

"code" : 13449, 

"ok" : 0, 

"errmsg" : "exception: collection test.fs.chunks already sharded with 33463 chunks" 

所有3 CO nfig服務器正在運行。 mongos日誌包含一系列平衡器分佈式鎖獲取/解鎖消息,但沒有其他值得注意的。

有沒有人有任何建議,我們如何可以進一步排除故障,並得到一些分片發生?

感謝

戴夫

+0

您在分解集合之前是否在'files_id'和'n'(分片鍵)上創建了一個索引?另外,你沒有描述你使用'mongos' ...? –

+0

在分解集合之前,我們確實在「files_id」和「n」上創建了索引。爲了進一步闡明 - 我們的mongo環境由3個副本集,3個mongos實例(我們的驅動程序僅指向其中的一個)和3個配置服務器組成。 – user3345274

+1

在分片集合(網絡打嗝,其他錯誤)過程中發生某些事情時會發生這種情況,並且它使配置處於集合未「完全」分割的狀態。你可以檢查config DB,使用config; db.collections.find({ns:「test.fs.chunks」})和db.chunks.find({ns:「test.fs.chunks」}) - 我的猜測是,即使有集合中的條目。你可以手動清理它,但我建議在集合被分割時檢查mongos的日誌,並查看可能發現的錯誤或警告。 –

回答

1

我有收集類似的問題,但我固定它使用這個命令:

http://docs.mongodb.org/manual/reference/command/splitChunk/

我100%肯定這不是什麼你應該這樣做,但它確實有效!

實際上,另一個想法是創建一個只包含一個記錄的新集合,將其碎片化,然後將其他集合中的所有記錄插入到其中。

我收集了一個塊中的每一條記錄。使用sh.status()來找出哪些塊是最大的。

然後使用:

db.adminCommand({split:<database>.<collection>,find:{<database>.<collection>._id:<any doc in the shard>}}); 

這在中點拆分塊。有趣的是,Mongodb的分塊過程然後做了一些更進一步的分割,但仍需要一些重寫才能將塊分割成合適的大小。

+0

感謝您的意見。我寧願清理它,以便mongo在可能的情況下處理分裂。但是,作爲一種偶然事件,您是否介意分享一個關於如何使用您引用的命令手動分割集合的快速概述? – user3345274

+0

沒有辦法嘗試分割會做任何好處 - 這個集合的元數據中沒有塊,所以沒有什麼可以分割的。 –

+0

如果這是真的,那意味着Mongo還沒有分割 - 你確定你指出shardCollection在正確的位置嗎? –