无论我做什么,我似乎无法让Ruby的Mongo驱动程序连接到副本集。我已经挖掘了关于这个主题的所有门票和SO问题,并尝试了每种语法组合。但最终,我最终只是尝试在Rails控制台中使用驱动程序API,如下所示:
Mongo::ReplSetConnection.new(['db1.yada.to:27017', 'db2.yada.to:27017'], :read => :primary).db("yada_production")
但无论它总是吐出来的东西,立即:
Mongo::ConnectionFailure: Failed to connect to primary node.
当我登录db服务器并从那里访问mongo时,我看到db1是PRIMARY>而db2是SECONDARY>
此外,我可以从端口27017上的应用程序服务器telnet到数据库服务器就好了。使用Connection.new将连接切换回单个服务器可以正常工作。
我疯了。我最初使用Mongo ruby驱动程序1.4 + Rails 3.1 + Mongoid 2.3 + MongoDB 2.0.6但现在升级到1.6.2 + Rails 3.2 + 2.4.12 + 2.0.6同样的问题。
我最初在auth中使用它,但我现在已经关闭了auth,以简化操作。
这完全被打破了吗?似乎其他人有类似的问题,但没有一个'解决方案'对我有用。那里的其他人都有想法吗?
答案 0 :(得分:3)
我发现了我的问题。我的mongo副本集看起来像这样:
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
}
请注意,即使db1的FQDN是db1.yada.com,该节点也会使用其本地主机名进行初始化。您似乎必须使用rs.status()提供的完全名称,否则连接将失败。这意味着如果无法使用DNS解析,则需要将其添加到连接服务器上的/ etc / hosts中。一旦我这样做了连接工作。
我读过response to this effect in the mongoid bugs,但我并不完全理解他们在对话中暗示的内容。我假设他们只需要修改/ etc / hosts,因为服务器没有公共DNS条目。现在有意义的是,Mongo中的确切名称是强制性的。