mongodb的shard叢集來說,添加一個分片很簡單,addshard就可以了。
但是縮減叢集(删除分片)這種一般很少用到。由于曙光的某伺服器又挂了,是以我們送修之前必須把它上面的資料自動遷移到其他shard上。
1、執行removeshard指令
1 db.runcommand( { removeshard: "your_shard_name" } )
2
3 { msg : "draining started successfully" , state: "started" , shard :"mongodb0" , ok : 1 }
上面這句會立即傳回,實際在背景執行。
2、檢視遷移狀态
我們可以反複執行上面語句,檢視執行結果。
3 { msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: 42, dbs : 1 }, ok: 1 }
從上面可以看到,正在遷移,還剩下42塊沒遷移完。
當remain為0之後,這一步就結束了。
3、移出非shard資料
1 db.runcommand( { moveprimary: "myapp", to: "mongodb1" })
這次就不是立即傳回了,需要很久,然後會傳回如下:
1 { "primary" : "mongodb1", "ok" : 1 }
4、最後的清理
上面步驟都完成後,還需要再執行一次removeshard,清理殘餘資料。
1 db.runcommand( { removeshard: "mongodb0" } )
執行成功後,會如下結果:
1 { msg: "remove shard completed succesfully" , stage: "completed", host: "mongodb0", ok : 1 }
顯示completed後,就可以安心的關閉mongod的程序了。
--如果要移除的分片正好是某一個表的primary,就會報錯無法移除,那麼就先進行如下操作:
mongos> use admin
switched to db admin
mongos> db.runcommand({moveprimary:"testdb",to:"shard0001"}) --将主移動到另一個分片上
{ "primary " : "shard0001:192.168.12.104:27019", "ok" : 1 }
mongos> db.runcommand({moveprimary:"test",to:"shard0001"})
mongos> db.runcommand({removeshard:"192.168.12.104:27017"}) --這樣就可以成功移除
{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : "shard0000",
"ok" : 1
}