5

在两个不同的终端中,我使用以下命令启动 mongod:

mongod --dbpath 1 --port 27001 --smallfiles --oplogSize 50 --logpath log.1 --replSet test
mongod --dbpath 2 --port 27002 --smallfiles --oplogSize 50 --logpath log.2 --replSet test

(数据子目录 1 和 2 已经创建)。

我进入第三个窗口并针对其中一个 mongod 实例运行 mongo shell

mongo --port 27001

在外壳中,我将配置设置为

cfg = { _id: "test", members: [ {_id:0, host: "localhost:27001"}, {_id:1, host:"localhost:27002"} ] }

然后运行:

use admin
rs.initiate(cfg)

来自外壳的响应是:

{
"startupStatus" : 4,
"info" : "hotest",
"errmsg" : "all members and seeds must be reachable to initiate set",
"ok" : 0
}

例如,端口 27001 上的日志文件报告:

Sun Nov 18 18:32:56 [rsStart] trying to contact macbookpro.local:27001
Sun Nov 18 18:32:56 [rsStart] couldn't connect to macbookpro.local:27001: couldn't connect to server macbookpro.local:27001
Sun Nov 18 18:32:56 [rsStart] replSet can't get local.system.replset config from self or any seed (yet)

看来 rs.initiate(cfg) 无法连接到端口 27001 上的 mongod 实例。但是当我在没有 --replSet 的情况下运行 mongod 时,mongo shell 连接得很好。

目前尚不清楚我在哪里搞砸了,但我敢打赌这很明显。

4

3 回答 3

11

找到了!

事实证明,当使用 brew 在 OSX 上安装 MongoDB 时,会在 /usr/local/etc/mongo.conf 中创建一个配置文件。在这个文件中有一行:

# 只接受本地连接 bind_ip = 127.0.0.1

好吧,如果您查看日志,则 rsStart 错误是:

Sun Nov 18 18:32:56 [rsStart] trying to contact macbookpro.local:27001
Sun Nov 18 18:32:56 [rsStart] couldn't connect to macbookpro.local:27001: couldn't connect to server macbookpro.local:27001
Sun Nov 18 18:32:56 [rsStart] replSet can't get local.system.replset config from self or any seed (yet)

如果我 ping macbookpro.local 返回的 IP 地址是 192.168.41.1。192.168.41.1 <> 127.0.0.1 所以 mongod 拒绝回应。从配置中删除此行允许成功设置复制。

嘘。我真是个白痴。看了几个小时,一直认为连接到网络时的机器名称是 127.0.0.1。让这成为你的一个教训——不要变老!

于 2012-11-19T22:42:46.680 回答
3

找出主机名可能会很痛苦,因此与其传递配置对象并尝试找出您的主机名应该是什么rs.initiate(),不如在第一台主机上不带任何参数。这将创建所需的配置,为您发现正确的值。它将打印出它创建的配置的“有效”版本。这是一个示例:

> rs.initiate()
{
    "info2" : "no configuration explicitly specified -- making one",
    "me" : "adamc-mbp.local:27001",
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}

复制并粘贴“me”字段并使用新的端口号,传递给rs.add()

sotest:PRIMARY> rs.add("adamc-mbp.local:27002")
{ "ok" : 1 }

现在看看你的配置:

sotest:PRIMARY> rs.conf()
{
    "_id" : "sotest",
    "version" : 2,
    "members" : [
        {
            "_id" : 0,
            "host" : "adamc-mbp.local:27001"
        },
        {
            "_id" : 1,
            "host" : "adamc-mbp.local:27002"
        }
    ]
}

你应该很高兴:)

于 2012-11-19T07:00:32.267 回答
3

我遇到过同样的问题。不知何故,mongo 将 localhost 解析为您机器的名称 macbookpro.local。

只需将此行添加到您的 /etc/hosts 文件中:

127.0.0.1           macbookpro.local
于 2013-03-05T01:32:18.900 回答