2017年2月21日 星期二

[mongo] 從MongoDB Cluster移除Shard Nodes實作

因某種原因必須從cluster移除shard nodes

由於每個shard nodes都會有chunks

所以在移除的過程非常麻煩

更何況我操作的是正在線上運行中的Cluster

所以各種操作都必須非常小心

這次作業雖然操作不多,但我準備(測試)了非常久

以下我按照步驟流程來描述:

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

沒有留言:

張貼留言