2013-11-27 104 views
1

我創建了一個複製集。 我在開頭添加了localhost,但是當我嘗試用實際的主機名編輯成員時。我得到錯誤「例外:主機不能在本地主機和主機名之間切換」例外:主機不能在本地主機和主機名之間切換

我需要擺脫localhost:27017因爲,否則,它不會讓我輸入任何其他成員作爲主機名(即非本地主機地址)

my-rs0:PRIMARY> cfg=rs.conf(); 
{ 
    "_id" : "my-rs0", 
    "version" : 1, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "localhost:27017" 
     } 
    ] 
} 
my-rs0:PRIMARY> cfg.members[0].host="my-server04:27017" 

my-rs0:PRIMARY> cfg 
{ 
    "_id" : "my-rs0", 
    "version" : 1, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "my-server04:27017" 
     } 
    ] 
} 

使用rs.reconfig(CFG);

my-rs0:PRIMARY> rs.reconfig(cfg); 
     { 
      "errmsg" : "exception: hosts cannot switch between localhost and hostname", 
      "code" : 13645, 
      "ok" : 0 
     } 

與rs.add沒有運氣( 「我的-SERVER04:27017」)或rs.remove( 「本地主機:27017」)爲好。

my-rs0:PRIMARY> rs.add("my-server04:27017"); 
    { 
     "errmsg" : "exception: can't use localhost in repl set member names except when using it for all members", 
     "code" : 13393, 
     "ok" : 0 
    } 

我已經嘗試了所有在這裏Replica Set Reconfig steps 提到的重新配置方法,但是,沒有固定上述問題。已經花了幾個小時,我真的很沮喪。

回答

1

它看起來像你需要放棄你的replicaset並重新開始。

我相信,當你開始你的副本集,您明確通過它使用本地主機引用您的MongoDB實例一個配置文件。

當我正在調查這個問題,我提出了一個副本集。當我使用rs.initiate()(不通過配置文件)啓動副本集時,它默認使用主機名。

rs.initiate() 

rs.conf() 
{ 
    "_id" : "stack1", 
    "version" : 1, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "MY-HOSTNAME:28001" 
     } 
    ] 
} 

This post描述了需要完成清除掉你的數據庫文件創建一個新的副本集。

一旦我這樣做,我發起了一個新的副本中設置通過將配置文檔:

cfg = { 
    "_id" : "stack1", 
    "version" : 1, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "localhost:28001" 
     } 
    ] 
} 

rs.initiate(cfg) 

rs.conf() 
{ 
    "_id" : "stack1", 
    "version" : 1, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "localhost:28001" 
     } 
    ] 
} 

長話短說,你需要刪除所有文件在您--dbpath目錄中並重新 - 創建副本集,而不顯式指定「localhost」作爲您的主機名。

+0

感謝您的信息,我刪除了整個數據庫,並用新的複製集設置重新創建。 – Watt

+1

這是更簡單的方法:http://stackoverflow.com/a/8232241/757850 –

3

我有同樣的問題,我修復了它,沒有刪除任何數據庫。剛編輯local.system.replset集合中成員的主機字段以匹配本地ip,然後重新啓動mongod。一切都很完美。

+0

如果您不想刪除副本集(如執行本文所述的還原操作:http ://docs.mongodb.org/manual/tutorial/restore-replica-set-from-backup/) – MANCHUCK

0

我並根據docs

  1. 重啓動MongDB另一個端口(例如37107)上,以防止它的用戶連接。

  2. 然後開始在其上的殼:

$ mongo --port 37017 
  • 然後更新了配置:
  • use local 
    cfg = db.system.replset.findOne({ "_id": "my-rs0" }) 
    cfg.members[0].host = "my-server04:27017" 
    db.system.replset.update({ "_id": "my-rs0" } , cfg) 
    
  • 然後在原始端口上重新啓動MongoDB。