主节点发生故障后无法访问MongoDB集群

时间:2018-02-27 12:21:23

标签: mongodb

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

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

Node2 =次要

Node3 =次要

副本集中的所有节点都具有10的优先级和1的投票。

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

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

我只是想知道是否有人对这里可能出现的问题有所了解。

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

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

1 个答案:

答案 0 :(得分:0)

最终想出来了。这里有两件事情。

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

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

  3. 无论如何,对我来说两个要点

    1. MongoDB仅使用连接字符串进行初始连接和设置,然后在集群中忽略连接字符串并使用内部集群注册来访问节点。

    2. 在做这样的事情时记下我做的所有血腥事情(比如更改我的私人主文件)。如果我记得它会让我的生活更简单。

    3. 干杯 ...