对仲裁心跳的Mongodb副本集权限被拒绝

时间:2017-11-17 15:20:13

标签: mongodb

我尝试使用Mongodb 3.4设置mongo db replicaset。

服务器A:

  • srv1:27017 - primary
  • arb:27027 - 仲裁者

服务器B:

  • srv2:27017 - secondary

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,或被防火墙,但在这里不是这样。

1 个答案:

答案 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,其他发行版可能附带不同的政策。