1. 程式人生 > >mongodb移除分片刪除分片上資料庫和新增分片

mongodb移除分片刪除分片上資料庫和新增分片

首先我們要移除的分片之後再次新增此分片時會出現新增失敗的情況,需要在新增的分片上登入進行刪除此分片之前資料庫的歷史資料比如testdb,刪除分片上的資料庫之後就可重新新增此分片到mongos中




1、執行RemoveShard命令 

db.runCommand( { removeshard: "your_shard_name" } ) 
{ msg : "draining started successfully" , state: "started" , shard :"mongodb0" , ok : 1 } 
“注意:該命令至少執行兩次才能成功刪除,執行到state為completed才真正刪除,否則就是沒用刪除成功,該分片處於"draining" : true狀態,該狀態下不但該分片沒用刪除成功,而且還影響接下來刪除其他分片操作,遇到該狀態再執行一次removeshard即可,最好就是刪除分片時一直重複執行刪除命令,直到state為completed; 

還有一個需要注意的地方就是:被成功刪除的分片如果想要再加入叢集時,必須將data資料目錄清理乾淨才可以再加入叢集,否則即使能加入成功也不會儲存資料,集合都不會被建立 

另外:在刪除分片的時有可能整個過程出現無限"draining" : true狀態,等多久還是這樣,而且分片上面的塊一個都沒有移動到別的分片,解決辦法是:在config的config資料庫的shard集合中找到該分片的資訊,並將draining欄位由True改為False,再繼續試著刪除操作” 

上面這句會立即返回,實際在後臺執行。 

2、檢視遷移狀態 
我們可以反覆執行上面語句,檢視執行結果。 
db.runCommand( { removeshard: "your_shard_name" } ) { msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: 42, dbs : 1 }, ok: 1 } 
從上面可以看到,正在遷移,還剩下42塊沒遷移完。 
當remain為0之後,這一步就結束了。 

3、移出非Shard資料(如果開始就知道是primary可以直接執行 步驟3和4即可,1和2不需要執行) 
如果你要刪除的Shard分片恰好是primary,那麼執行這一步,否則請跳過! 
db.runCommand( { movePrimary: "資料庫名稱", to: "分片名稱" }) 

這次就不是立即返回了,需要很久,然後會返回如下: 
{ "primary" : "mongodb1", "ok" : 1 } 

4、最後的清理 
上面步驟都完成後,還需要再執行一次RemoveShard,清理殘餘資料。 
db.runCommand( { removeshard: "mongodb0" } ) 
執行成功後,會如下結果: 
{ msg: "remove shard completed succesfully" , stage: "completed", host: "mongodb0", ok : 1 } 

顯示completed後,就可以安心的關閉mongod的程序了。