Secondary 和 Arbiter 卡在 Startup 中

Vin*_*nie 7 replication mongodb configuration mongodb-3.0

我正在使用 MongoDB 3.0.0 版。我正在尝试在我们的机器上设置 mongodb 复制。最初设置了复制,但由于 VM 上的一些更改,整个过程崩溃了。当我再次尝试设置时,辅助节点和仲裁器卡在启动模式中。

在我设置的 mongoDB conf 文件中

replSet=ReplicaSet1
Run Code Online (Sandbox Code Playgroud)

我使用命令添加了 2 台机器

rs.add("10.235.96.12:27017")
rs.add("10.235.96.12:27017")
Run Code Online (Sandbox Code Playgroud)

但是在这之后,当我做一个rs.status()次要和仲裁者时,仍然在 StartUp 中显示

ReplicaSet1:PRIMARY> rs.status()
{
    "set" : "ReplicaSet1",
    "date" : ISODate("2015-07-31T04:45:57.260Z"),
    "myState" : 1,
    "members" : [
            {
                    "_id" : 0,
                    "name" : "BOSPROD9:27017",
                    "health" : 1,
                    "state" : 1,
                    "stateStr" : "PRIMARY",
                    "uptime" : 63104,
                    "optime" : Timestamp(1438257913, 1),
                    "optimeDate" : ISODate("2015-07-30T12:05:13Z"),
                    "electionTime" : Timestamp(1438254975, 2),
                    "electionDate" : ISODate("2015-07-30T11:16:15Z"),
                    "configVersion" : 7,
                    "self" : true
            },
            {
                    "_id" : 1,
                    "name" : "10.235.96.12:27017",
                    "health" : 1,
                    "state" : 0,
                    "stateStr" : "STARTUP",
                    "uptime" : 62663,
                    "optime" : Timestamp(0, 0),
                    "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                    "lastHeartbeat" : ISODate("2015-07-31T04:45:56.520Z"),
                    "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                    "pingMs" : 0,
                    "configVersion" : -2
            },
            {
                    "_id" : 2,
                    "name" : "10.235.96.13:27017",
                    "health" : 1,
                    "state" : 0,
                    "stateStr" : "STARTUP",
                    "uptime" : 60043,
                    "lastHeartbeat" : ISODate("2015-07-31T04:45:55.786Z"),
                    "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                    "pingMs" : 0,
                    "configVersion" : -2
            }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)

当我尝试rs.conf在 Secondary 或 Arbiter 上执行 a时,我收到消息

2015-07-31T05:23:07.927+0000 E QUERY    Error: Could not retrieve replica set config: {
    "info" : "run rs.initiate(...) if not yet done for the set",
    "ok" : 0,
    "errmsg" : "no replset config has been received",
    "code" : 94
}
Run Code Online (Sandbox Code Playgroud)

我确实多次尝试清理所有机器中的所有 local.0、local.1 文件,并且还从日志文件夹中删除了所有日志文件。我仍然遇到同样的问题。有人能告诉我我在这里做错了什么吗?

我已经为所有成员设置了 replset。尝试在独立模式下启动,它工作正常。

ald*_*win 6

从“BOSPROD9”,尝试用 mongoshell 连接到其他服务:

$ mongo --host 10.235.96.12 --port 27017

$ mongo --host 10.235.96.13 --port 27017
Run Code Online (Sandbox Code Playgroud)

(Telnet 不一样。)如果这不起作用,则可能是防火墙或 BindIP。

检查 bind_ip(应该是 0.0.0.0,在 mongodb.conf 中更改为 127.0.0.1):

$ netstat -nap | grep :27017 | grep LISTEN
tcp        0      0 0.0.0.0:27018           0.0.0.0:*               LISTEN      -     
Run Code Online (Sandbox Code Playgroud)

尝试查看 10.235.96.12 和 10.235.96.13 上的日志文件,为什么它们会卡住。他们收到配置了吗?

尝试以这种方式重新配置:

mongo> var cfg = {_id:"ReplicaSet1",members:[{_id:0, host:"BOSPROD9:27017"},{_id:1, host:"10.235.96.12:27017"},{_id:2, host:"10.235.96.13:27017",arbiterOnly:true}]};
mongo> rs.reconfig(cfg);
Run Code Online (Sandbox Code Playgroud)

解决方案:

使用主机名而不是 ip:给所有服务器一个主机名,更新主机文件并在 rs-configuration 中使用主机名。似乎 mongodb 建议不要使用 ip 地址,而是使用主机名。