2012-07-30 71 views
2

不管我似乎什麼,我不能讓Ruby的Mongo的驅動程序連接到一個副本集。我已經挖掘了所有的門票和關於這個主題的問題,並嘗試了各種語法組合。不過說到底,我已經結束了只是試圖使用驅動程序API在Rails的控制檯,像這樣:蒙戈Ruby驅動程序無法連接到副本集小學

Mongo::ReplSetConnection.new(['db1.yada.to:27017', 'db2.yada.to:27017'], :read => :primary).db("yada_production") 

但無論怎樣它總是吐回來,立刻:

Mongo::ConnectionFailure: Failed to connect to primary node. 

當我登錄到數據庫服務器並從那裏訪問mongo我看到db1是PRIMARY>而db2是SECONDARY>

此外,我可以通過端口27017從應用服務器telnet到數據庫服務器就好了。使用Connection.new將連接切換回單個服務器可毫無問題地工作。

我瘋了。我最初使用的是Mongo ruby​​ driver 1.4 + Rails 3.1 + Mongoid 2.3 + MongoDB 2.0.6,但現在升級到1.6.2 + Rails 3.2 + 2.4.12 + 2.0.6,同樣的問題。

我最初使用它與權威性,但我已經把身份驗證關閉,現在把事情簡單化。

這只是完全打破?似乎其他人也有類似的問題,但沒有任何'解決方案'爲我工作。其他人有想法嗎?

回答

3

我想通了,我的問題。我蒙戈副本集是這樣的:即使DB1的FQDN是db1.yada.com,該節點與本地主機名初始化

PRIMARY> rs.status() 
{ 
"set" : "yada", 
"date" : ISODate("2012-07-30T06:30:23Z"), 
"myState" : 1, 
"members" : [ 
    { 
     "_id" : 0, 
     "name" : "YADAdb1:27017", 
     "health" : 1, 
     "state" : 1, 
     "stateStr" : "PRIMARY", 
     "optime" : { 
      "t" : 1343627448000, 
      "i" : 2 
     }, 
     "optimeDate" : ISODate("2012-07-30T05:50:48Z"), 
     "self" : true 
    }, 
    { 
     "_id" : 1, 
     "name" : "db2.yada.to:27017", 
     "health" : 1, 
     "state" : 2, 
     "stateStr" : "SECONDARY", 
     "uptime" : 16022, 
     "optime" : { 
      "t" : 1343627448000, 
      "i" : 2 
     }, 
     "optimeDate" : ISODate("2012-07-30T05:50:48Z"), 
     "lastHeartbeat" : ISODate("2012-07-30T06:30:22Z"), 
     "pingMs" : 0 
    } 
], 
"ok" : 1 
} 

通知。看來,你必須使用由rs.status提供()的確切名稱或連接失敗。這意味着如果它無法通過DNS解析,則需要將其添加到連接服務器上的/ etc/hosts中。一旦我這樣做,連接工作。

有一個response to this effect in the mongoid bugs,我看,但我沒有完全理解他們的對話框中進行了暗示。我以爲他們只需要修改/ etc/hosts,因爲服務器沒有公共的DNS條目。現在它是有道理的,在Mongo中的確切名稱是強制性的。

+0

你剛剛救了我的命。謝謝 – maxdec 2013-07-31 14:52:09