1. 今天上午遇到一個有關host設定一部分是localhost另一部分是hostname,造成向sharding添加shard的時候失敗。特紀錄下來。
問題:一個已存在的sharding各個shard都是原生其他的mongod進程,在當初添加shard的時候,db.runCommand({addshard:"localhost:port"})。後來又在本機配置了一個replSet.問題就來了。replSet布署成功後,其中的各個節點的host使用的是hostname.這樣一來,當我將replSet添加到sharding的時候報錯。因為sharding的各個節點如果都是原生其他進程的話,在設定host的時候要麼全部使用localhost要麼全部使用hostname,如果混用會報錯。
解決過程:剛開始我打算將replSet的各個節點的host改成localhost.但是在reconfig的時候報錯。報錯如下:
之後考慮將已經添加到sharding中各個shard的host改成hostname.修改方法是use config;db.shards.update({_id:xx},{host:"xx"});這回修改成功了。之後就簡單了。
2. 從sharding當中移除一個shard。需要將儲存在將被移除的shard中資料移到其他的shard中。移除完成後,被移除的shard就沒有資料了。
(一)移除一個shard. use admin; db.runCommand({removeshard:"name"});
(二)執行結果如,需要注意的是,note有提示說需要執行movePrimary操作。這是因為被移除的shard是某幾個庫的大本營。如果是這種情況,就需要在資料移除完之後執行movePrimary操作,為這幾個庫設定新的大本營。需要設定新的大本營的幾個庫這裡也已經給出來了,例如dbsToMove的值 。如果被移除的shard不存在是任何一個庫的大本營,那麼就不需要執行movePrimary.如
(三)如,名為shard0001的shard並不是哪個庫的大本營,因此在被移除的時候,結果輸出中並沒有類似於移除shard0000的時候有note與dbsToMove這兩個值。需要注意的是,被移除的shard是某幾個庫的大本營,不管是否有庫不參加分區,都需要為庫設定新的大本營。如
(四)在資料移轉之前sar的partitioned的值是false,遷移完成執行movePrimary操作後,sar的partitioned的值仍是false.如。
(五)在移除資料過程中,由於網路與資料量的原因,可能需要花費不同的時間。執行db.runCommand({removeshard:"name"})命令可以查看資料移轉的進度。
(六)如,通過執行db.runCommand({removeshard:"name"})命令不但可以開始移除shard,還可以在移除的過程中查看資料移轉的進度。remaining的值就表示資料移轉的進度。其中chunks代表還剩多少塊資料需要被遷移。當chunks的值等於0時代表資料移轉完成。dbs的值代表還剩多少個庫需要設定新的大本營。movePrimary操作要等到資料移轉完成之後再進行。也就是當chunks的值等於0後才可以執行movePrimary操作。
(七)如,chunks的值等於0代表資料移轉已經完成。可以開始movePrimary操作。
(八)如,將庫foo,too重新設定大本營為rs0這個shard.操作完成後,可以查看整個移除進度了。
(九)如,代表整個移除過程已經全部完成。這個時候就可以放心的停掉shard0000這個shard了。