1. 程式人生 > >mongodb移除分片

mongodb移除分片

關於mongodb中移除分片的操作:

一、移除分片

1.確定balancer已經開啟:

mongs>sh.getBalancerState()
true
2.移除分片--在admin db下執行命令:
mongos> use admin
switched to db admin
mongos> db.runCommand( { removeShard: "shard3" } )
{
"msg" : "draining started successfully",
"state" : "started",
"shard" : "shard3",
"ok" : 1
}

3、檢查遷移的狀態

同樣執行
mongos> use admin
switched to db admin
mongos> db.runCommand( { removeShard: "shard3" } )
{
"msg" : "draining ongoing",
"state" : "ongoing",
"remaining" : {
"chunks" : NumberLong(3),
"dbs" : NumberLong(0)
},
"ok" : 1
}

remaining中的chunks表示還有多少資料塊未遷移。

4.移除未分片資料:

1)

        sh.status()

db.printShardingStatus()
     這樣,會輸出類似下面的資訊:{ "_id" : "products", "partitioned" : true, "primary" : "mongodb0" }
2)
To move a database to another shard, use the movePrimary command. For example, to migrate all remaining unsharded data from mongodb0 to mongodb1, 
issue the following command:
use admin
db.runCommand( { movePrimary: "products", to: "mongodb1" }) --products為db name
This command does not return until MongoDB completes moving all data, which may take a long time. 
The response from this command will resemble the following:
{ "primary" : "mongodb1", "ok" : 1 }
If you use the movePrimary command to move un-sharded collections, you must either restart all mongos instances,
or use the flushRouterConfig command on all mongos instances before writing any data to the cluster. 
This action notifies the mongos of the new shard for the database.
If you do not update the mongos instances' metadata cache after using movePrimary, the mongos may not write data to the correct shard. 
To recover, you must manually intervene.

3)

        遷移非分片表 時 最好停機,在執行db.runCommand( { movePrimary: "products", to: "mongodb1" }) 命令完成之後,重新整理所有mongos後(所有mongos上執行db.runCommand("flushRouterConfig")),再對外提供服務。當然也可以重新啟動所有mongos例項 。

5.完成遷移
        mongos> use admin
        switched to db admin
        mongos> db.runCommand( { removeShard: "shard3" } )
        {
        "msg" : "removeshard completed successfully",
        "state" : "completed",
        "shard" : "shard3",
        "ok" : 1
        }
        如果state為 completed,表示已完成遷移。
二、新增分片
1、首先確認balancer已經開啟

mongos> sh.getBalancerState()
true
2、執行新增分片的命令
如果出現以下錯誤,刪除目標shard3上的test1資料庫,再次執行命令
        mongos> sh.addShard("shard3/192.168.137.138:27019")
        {
        "ok" : 0,
        "errmsg" : "can't add shard shard3/192.168.137.138:27019 because a local database 'test1' exists in another shard1:shard1/192.168.137.111:27017,192.168.137.75:27017"
        }
        mongos> sh.addShard("shard3/192.168.137.138:27019")
        { "shardAdded" : "shard3", "ok" : 1 }
        最後執行sh.status()命令確認遷移是否成功,可能會花比較長的時間。
三、其他
刪除不合理的分片資料庫:----方法和刪除資料庫一樣
use testdb
db.dropDatabase()
刪除不合理的分片集合:----方法和刪除集合一樣
use database
db.collection.drop()