Mongo Ruby驱动程序无法连接到副本集主节点

时间:2012-07-30 02:11:05

标签: ruby-on-rails ruby mongodb mongoid replication

无论我做什么,我似乎无法让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,以简化操作。

这完全被打破了吗?似乎其他人有类似的问题,但没有一个'解决方案'对我有用。那里的其他人都有想法吗?

1 个答案:

答案 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中的确切名称是强制性的。