2013-12-14 73 views
1

我試圖實現MongoDB的複製,在虛擬機的形式,由4個節點,MongoDB的replicaSet配置 - 奇怪的行爲

信息:我使用VirtualBox的,並且v.machines相互throught的comunicate 主機專用適配器。通信已經過測試,並且ervery節點可以ping其他節點。

這是rs.conf()命令的輸出:

rs0:PRIMARY> rs.conf() 
{ 
    "_id" : "rs0", 
    "version" : 4, 
    "members" : [ 
     { 
      "_id" : 0, 
      "host" : "192.168.56.1:27017" 
     }, 
     { 
      "_id" : 1, 
      "host" : "192.168.56.101:27018" 
     }, 
     { 
      "_id" : 2, 
      "host" : "192.168.56.102:27019" 
     }, 
     { 
      "_id" : 3, 
      "host" : "192.168.56.103:27020" 
     } 
    ] 
} 

這是命令rs.status()的輸出

rs0:PRIMARY> rs.status() 
{ 
    "set" : "rs0", 
    "date" : ISODate("2013-12-14T16:09:36Z"), 
    "myState" : 1, 
    "members" : [ 
     { 
      "_id" : 0, 
      "name" : "192.168.56.1:27017", 
      "health" : 1, 
      "state" : 1, 
      "stateStr" : "PRIMARY", 
      "uptime" : 3207, 
      "optime" : Timestamp(1387034904, 1), 
      "optimeDate" : ISODate("2013-12-14T15:28:24Z"), 
      "self" : true 
     }, 
     { 
      "_id" : 1, 
      "name" : "192.168.56.101:27018", 
      "health" : 1, 
      "state" : 6, 
      "stateStr" : "UNKNOWN", 
      "uptime" : 2542, 
      "optime" : Timestamp(0, 0), 
      "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 
      "lastHeartbeat" : ISODate("2013-12-14T16:09:35Z"), 
      "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), 
      "pingMs" : 1, 
      "lastHeartbeatMessage" : "still initializing" 
     }, 
     { 
      "_id" : 2, 
      "name" : "192.168.56.102:27019", 
      "health" : 1, 
      "state" : 6, 
      "stateStr" : "UNKNOWN", 
      "uptime" : 2497, 
      "optime" : Timestamp(0, 0), 
      "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 
      "lastHeartbeat" : ISODate("2013-12-14T16:09:35Z"), 
      "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), 
      "pingMs" : 0, 
      "lastHeartbeatMessage" : "still initializing" 
     }, 
     { 
      "_id" : 3, 
      "name" : "192.168.56.103:27020", 
      "health" : 1, 
      "state" : 6, 
      "stateStr" : "UNKNOWN", 
      "uptime" : 2472, 
      "optime" : Timestamp(0, 0), 
      "optimeDate" : ISODate("1970-01-01T00:00:00Z"), 
      "lastHeartbeat" : ISODate("2013-12-14T16:09:36Z"), 
      "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"), 
      "pingMs" : 1, 
      "lastHeartbeatMessage" : "still initializing" 
     } 
    ], 
    "ok" : 1 
} 

從最後的命令似乎replicaSet仍然初始化,但看着mongod的4個實例,我不知道,這似乎是這樣的東西不能正常工作..

enter image description here

我想知道爲什麼所有的節點都試圖聯繫只有主實例忽略其他?以及爲什麼當連接被接受時,它再次嘗試聯繫同一個節點,因爲它沒有這樣做,因爲它說「無法加載配置」..我真的需要一個推動力來理解問題,如果有必要的話命令輸出,或一般信息只是讓我知道我會發布它們。

在此先感謝您的幫助

+0

雖然您使用ping檢查了網絡連接,但您是否試圖在兩個方向連接服務器?我的意思是,你應該能夠從一臺服務器連接到所有其他服務器的外殼。也許你的防火牆阻止了連接。 – rubenfa

+0

如果一個節點看不到一個主節點,那就像是經常觸發一個選舉。沒有主副本集不被認爲是一致的。每個節點都需要註冊到當前的主節點,並且需要能夠從該主節點獲取信息,即使它仍然繼續從輔助節點進行同步。 – Sammaye

+0

@rubenfa:你的意思是連接到「mongo --port 27019」的方式,不,我沒有嘗試過,我認爲pinging被佔用,我會盡快檢查這種方式 – lese

回答

0

解決 - 我只是檢查連接中間人像rubenfa蒙戈連接的方式,所有成員在他的評論暗示。

mongo --host 192.168.56.103 --port 27020 

和各成員之間的每個連接工作正常使用,只有主機適配器。

我在開始時發佈的主要問題,與我沒有檢查3個輔助節點內部的事實有關,如果有其他local數據庫從以前嘗試配置replicaSet創建的。我只是用來檢查主節點,並從那裏刪除本地數據庫,而不檢查其他節點。

還有,記得從所有節點刪除所有local DBS之前,請嘗試重新配置replicaSet

1

爲別人絆倒在此:

確保你的主要的主機名解析從成員,或以其他方式您的replSetConfig正在使用您的主IP而不是主機名或fqdn。 默認情況下,mongo在「主機」配置字段中使用主節點的主機名, 如果所有其他成員沒有/ etc/hosts文件中的信息,則無法與其通信。