1. 程式人生 > >MongoDB新增仲裁節點報錯replica set IDs do not match辦法

MongoDB新增仲裁節點報錯replica set IDs do not match辦法

背景:由於歷史原因,某個MongoDB副本集只有一主一從雙節點,無法滿足自動故障轉移要求,需要配置一個仲裁節點。

原有節點192.168.10.20:27017,192.168.10.21:27017,現在準備在20上配置一個新節點27018當做仲裁

 

在當前主節點上執行

repset:PRIMARY> cfg={_id:"repset", members:[{_id:0, host:'192.168.10.20:27017', priority:1},{_id:2, host:'192.168.10.21:27017', priority:2}, {_id:3, host:'192.168.10.20:27018
', arbiterOnly:true}]}; repset:PRIMARY> rs.reconfig(cfg)

顯示配置是成功的,接著用命令檢視副本集狀態時,發現仲裁節點不可用,報錯資訊replica set IDs do not match。

repset:PRIMARY> rs.status()

網上的各種文件都是說①檢視副本集的名稱是否一致 ②把節點上的資料全都刪掉。

我在確認副本集配置名稱一致後,刪除仲裁節點的資料時發現:1、通過客戶端是無法刪除副本集配置集合;2、刪除底層物理檔案會導致Mongod程序啟動失敗。

在仔細回想initiate一次性副本集配置的操作時,發現配置後,只啟動了一個客戶端。我的猜想是會不會是因為我啟動了仲裁節點的客戶端,仲裁節點生成了單獨的副本集ID。

於是我將副本集的配置檔案db、log、Mongodb.conf全都刪除,並重新命令啟動MongoD程序後,直接在當前Primary節點按之前的操作新增仲裁節點後,發現仲裁節點已正常。

 

結論:目前只是證實了我的猜想,還沒找到官方的說法。

在新增副本集節點的時候,新增的節點在啟動服務後,一定不要連線客戶端,否則新增節點會生成另外的副本集ID,雖然副本集名稱一致,但是IDs不一致會報錯。