3

无论我做什么,我似乎都无法让 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.

当我登录到数据库服务器并从那里访问 mongo 时,我看到 db1 是 PRIMARY> 而 db2 是 SECONDARY>

此外,我可以从端口 27017 上的应用程序服务器远程登录到数据库服务器。使用 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 以简化事情。

这完全坏了吗?似乎其他人也有类似的问题,但没有一个“解决方案”对我有用。还有其他人有想法吗?

4

1 回答 1

4

我发现了我的问题。我的 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 中。一旦我这样做了,连接就起作用了。

在我阅读的 mongoid bugs 中有对此效果的响应,但我并不完全理解它们在对话框中的含义。我假设他们只需要修改 /etc/hosts 因为服务器没有公共 DNS 条目。现在,Mongo 中的确切名称是强制性的,这是有道理的。

于 2012-07-30T06:35:44.113 回答