【问题标题】:Can't access MongoDB cluster after primary node fails主节点故障后无法访问 MongoDB 集群
【发布时间】:2018-02-27 12:21:23
【问题描述】:

我有一个不寻常的问题。我使用 MongoDB Community edition 3.6.2 配置了一个 3 节点副本集,带有 SSL 和 Basic-Auth。当 PRIMARY 节点是我运行 rs.initiate() 的节点时,我可以连接到集群。

Node1 = 我运行 rs.initiate() 并添加了其他副本的初始节点。

Node2 = 次要

Node3 = 次要

副本集中所有节点的优先级为 10,票数为 1。

如果我在 Node1 是 PRIMARY 时停止它,我可以看到其他节点之一切换为 PRIMARY,当前是我的服务器上的 Node3,但之后我无法连接到集群。即使有可用的主节点。

事实上,我唯一能建立的连接是直接连接到成为 PRIMARY 的那个节点。正常的集群连接字符串根本不起作用。连接到该节点后,我可以运行 rs.status() 并且可以看到两个节点当前都可用,Node3 为主,Node2 为辅助,Node1 无法访问。

我只是想知道是否有人知道这里可能出了什么问题。

我正在使用集群的标准连接字符串格式

mongodb://user:password@node1:27017,node2:27017,node3:27017/dbName??maxIdleTimeMS=60000&readPreference=primary&ssl=true

【问题讨论】:

  • 您的连接字符串似乎缺少建立副本集连接所需的replicaSet name。如果未提供 replicaSet 名称,您的客户端将创建与种子列表的第一个成员的独立连接。独立连接不支持服务器发现或故障转移。
  • 感谢您的指点,但也没有帮助。
  • 您使用什么工具或驱动程序(和版本)连接到 MongoDB?初级的变化会发生什么?使用副本集连接的驱动程序/客户端应该检测到故障转移并自动发现当前的主节点,但可能存在重试或短暂的间隔,此时没有可用的主节点(例如,在选举期间)。您能否更新一个包含副本集名称的新连接字符串示例?

标签: mongodb


【解决方案1】:

最终想通了。这里有两件事在起作用。

  1. 与集群连接公共 DNS 名称这一事实有关,当集群中的一个节点发生故障时,它会忽略连接字符串上的节点并尝试使用它注册的 DNS 名称连接到节点在集群中。这些注册位于私有子网内,因此无法公开访问,并且外部客户端无法看到。 当我设置集群时,我已经在我的主机文件中注册,以使用它的公共 IP 地址指向集群中的初始节点。这就是为什么如果其他节点之一发生故障并且主节点可用并被指定为主节点时,它可以重新连接。

  2. 我需要将公共和私有 DNS 名称都放入我为集群中每个节点创建的数字证书中。我将公共 DNS 作为主题备用名称放入证书中。

无论如何,这对我来说有两个要点

  1. MongoDB 仅将连接字符串用于它的初始连接和设置,之后在集群中它会忽略连接字符串并使用内部集群注册来访问节点。

  2. 记下我在以后执行此类操作时所做的所有该死的事情(例如更改我的私有主机文件)。如果我记得这会让我的生活变得更简单。

干杯 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多