由於每個shard nodes都會有chunks
所以在移除的過程非常麻煩
更何況我操作的是正在線上運行中的Cluster
所以各種操作都必須非常小心
這次作業雖然操作不多,但我準備(測試)了非常久
以下我按照步驟流程來描述:
- 停止sharding
sh.stopBalancer() - 如果可以則將目標shard中db及資料停止更新,不過新增可以,但是update的話就要承受備份出來又蓋回去舊資料的風險。
- 為了將shard nodes中的資料備份出來,在加上shard node有master和slave兩台,所以我將slave關閉,在將參數改為不同的port,取消各種replica設定,指定為master後重新啟動(如果不指定會操照先前設定啟動為slave不管有沒有啟動為replica server),大概的指令如下
mongod --dbpath data/node-2-2 --port 8888 --fork --master - 將此node中所有資料備份出來,如要謹慎一點就根據不同的db備份到不同檔案中
(註:不要用archive輸出,因為archive會紀錄ㄐ詳盡的設定,無法移動到其他db名稱中)
mongodump -h localhost:8888 --db=dbname -o=backup - 將shard從cluster中移除
use admin
db.runCommand({removeShard: <shard_name>}) - 此時回應應該為 {ok: 1} 但沒這麼容易就結束,他說明要求你要移動所有指定primary為此nodes的db (請參考上一篇)
db.runCommand( { movePrimary: <databaseName>, to: <newPrimaryShard> } )
db.runCommand({"flushRouterConfig":1}) - 確認資料都移動成功後,到config確認系統是否移除node2的chunk資料,如果沒有就要自己來(小心操作避免毀了整個cluster)
use config
db.shards.find() - 確認所有的chunk也離開shard nodes,在執行一次移除shard
use admindb.runCommand({removeShard: <shard_name>}) - 這時候回應該為,如果沒成功檢閱msg內容回到第4步重做
{
"msg" : "removeshard completed successfully",
"state" : "completed",
"shard" : <your_shard_name>,
"ok": 1
} - 到config中確認移除shard,如果還在回到第7步重做
use config
db.shards.find() - 更新資料路徑
db.runCommand({"flushRouterConfig":1}) - 完成第8步驟後,將備份出來的資料倒回去。
mongorestore -h <host>:<port> -d <db_name> -u <user_name> --dir=backup/<db_name> --authenticationDatabase admin
沒有留言:
張貼留言