2017-10-11 40 views
0

我有一個3副本的MongoDB具有以下配置設置:設置的MongoDB副本集的版本到以前的值

rs0:PRIMARY> rs.conf() 
{ 
    "_id" : "rs0", 
    "version" : 138086, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "host_1:27017", 
      "arbiterOnly" : false, 
      "buildIndexes" : true, 
      "hidden" : false, 
      "priority" : 1, 
      "tags" : { 

      }, 
      "slaveDelay" : 0, 
      "votes" : 1 
     }, 
     { 
      "_id" : 1, 
      "host" : "host_2:27017", 
      "arbiterOnly" : false, 
      "buildIndexes" : true, 
      "hidden" : false, 
      "priority" : 0.5, 
      "tags" : { 

      }, 
      "slaveDelay" : 0, 
      "votes" : 1 
     }, 
     { 
      "_id" : 2, 
      "host" : "host_3:27017", 
      "arbiterOnly" : false, 
      "buildIndexes" : true, 
      "hidden" : false, 
      "priority" : 0.5, 
      "tags" : { 

      }, 
      "slaveDelay" : 0, 
      "votes" : 1 
     } 
    ], 
    "settings" : { 
     "chainingAllowed" : true, 
     "heartbeatTimeoutSecs" : 10, 
     "getLastErrorModes" : { 

     }, 
     "getLastErrorDefaults" : { 
      "w" : 1, 
      "wtimeout" : 0 
     } 
    } 
} 

正如你可能已經注意到,版本號爲一些垃圾值。這是較早的9,然後我改變的東西,使其10.然而,另一個實例連接到數據庫,需要它有版本9.我想:

cfg = rs.conf() 
cfg.version = 9 
rs.reconfig(cfg, { force: true }) 

但創建垃圾值。有什麼辦法可以將它重新設置爲9?哦,並且rs.initiate()也沒有工作。這個link描述瞭如何通過完全關閉副本集來完成它。這對我來說太危險了,因爲它在生產中。請幫忙!

回答

0

這是較早9,然後我改變的東西,使其10.然而,另一個實例連接到數據庫,需要它有版本9

副本集配置version值不意味着要手動改變。此值是用於區分配置版本的遞增數字,以便驅動程序或副本集成員知道其配置是最新的。

正如您可能已經注意到的,版本號是一些垃圾值。

這是forced reconfiguration的預期成果:

當您使用武力:真,在副本集中配置增加顯著的版本號,由幾十或幾十萬。這是正常的,旨在防止設置版本衝突,如果您不小心強制重新配置網絡分區的兩側,然後網絡分區結束。

強制重新配置應僅用於災難恢復,並不能用於正常的重新配置:

force選項強制新配置到成員。只能使用此程序從災難性中斷中恢復。每次重新配置時請勿使用force。另外,請勿在任何自動腳本中使用force選項,並且在仍有主節點時不要使用force

有什麼辦法可以將它重新設置爲9?

應該沒有正常的操作原因將版本更改回9,並且這樣做可能會導致您的部署出現意想不到的問題(例如,可能回滾提交的寫入)。您可以花費一些努力來改變這種情況,但我會建議保持原樣(特別是對於生產環境)。

哦,並且rs.initiate()也不起作用。

rs.initiate()命令在副本集的生命週期只使用一次:當您初始化,以便創建一個OPLOG副本集中的第一個成員。