我尝试使用Mongodb 3.4设置mongo db replicaset。
服务器A:
服务器B:
arb不应该在ServerA上托管srv1,计划稍后再搬。
服务器端口已打开,连接mongo shell适用于所有实例。
在srv1上运行rs.status()
显示一切正常。
然而,在srv2上运行它会显示:
{
"_id" : 2,
"name" : "ServerA:27027",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"lastHeartbeat" : ISODate("2017-11-17T14::36:48.088Z"),
"lastHeartbeatMessage" : "Permission denied",
"configVersion" : -1
}
对于仲裁部分(其余都没问题)。 srv2上的日志重复这三行:
2017-11-17T09:19:02.758-0500 | ASIO [NetworkInterfaceASIO-Replication-0] Failed to connect to ServerA:27027 - HostUnreachable: Permission denied
2017-11-17T09:19:02.758-0500 | ASIO [NetworkInterfaceASIO-Replication-0] Dropping all pooled connections to ServerA:27027 due to failed operation on a connection
2017-11-17T09:19:02.758-0500 | REPL [ReplicationExecutor] Error in heartbeat request to ServerA:27027; HostUnreachable: Permission denied
它们都没有任何身份验证集,并且托管在同一台计算机上的srv1对仲裁服务器没有心跳问题。 Srv2对srv1没有心跳问题。 谷歌搜索,我已经看到人们无法连接,因为IP地址没有绑定在mongod.config,或被防火墙,但在这里不是这样。
答案 0 :(得分:0)
我明白了。事实证明SELinux阻止了27027上的通信。我猜mongo shell和telnet没有阻止tcp流量的策略。我认为ServerA没有任何问题,因为两个mongo实例都在同一个主机上。
所以除了允许27017之外,我还必须允许27027:
semanage port -a -t mongod_port_t -p tcp 27027
如果您不关心增加的安全性,另一种解决方案是完全禁用SELinux。
看起来,如果您在具有SELinux的服务器上运行副本集,则需要允许在副本集成员之间使用的所有端口。
这是运行RedHat 7.4,其他发行版可能附带不同的政策。