【问题标题】:Mongodb replica set permission denied on arbiter heartbeatMongodb 副本集权限在仲裁器心跳上被拒绝
【发布时间】:2017-11-17 15:20:12
【问题描述】:

我正在尝试设置一个 mongo db 副本集,使用 Mongodb 3.4。

服务器A:

  • srv1:27017 - 主要
  • arb:27027 - 仲裁者

服务器B:

  • srv2:27017 - 次要

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 没有心跳问题。 谷歌搜索,我看到人们无法连接,因为 mongod.config 中没有绑定 IP 地址,或者被防火墙,但这里不是这种情况。

【问题讨论】:

  • srv1 和 arb 共享同一个主机,因此它们可能会尝试通过本地环回进行通信。你能确认服务器在两个接口上都监听吗?
  • 我尝试将 mongo shell 从 ServerB 连接到 ServerA:27017 和 ServerA:27027,效果很好。此外,srv2 显示副本集中的 srv1 没有问题,只有 arb 存在。你还有别的意思吗?
  • telnet serv1 27027 form serv 2 工作吗?
  • Telnet 确实有效。

标签: mongodb


【解决方案1】:

我想通了。事实证明 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,其他发行版可能附带不同的政策。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2012-03-31
    • 2013-11-26
    相关资源
    最近更新 更多