mongo副本集:只开启主节点和仲裁无法选主问题分析

时间:2021-02-02 02:36:53

背景:

在自己主机上开3个虚拟机,用桥接模式,固定IP,确保可以联网。搭建副本集,测试可行。

问题描述:

为了学习mongodb操作的方便(我只要能找到主节点,能连到数据库即可),所以我只开启两台虚拟机:1主+1仲裁,理论上可以正常工作,但没有备份,即无法实现高可用。问题来了:两台虚拟机开启后,开始时可以正常选主。但当我主动重启仲裁节点(模拟副本集中一个节点宕机的情形)后,主节点会频繁的变为从节点(SECONDARY),查看副本集信息,显示:mongo副本集:只开启主节点和仲裁无法选主问题分析

过几分钟后,又能够正常选主。不过持续时间很短,接着重复上述主变从的情况。

分析:

1、防火墙问题:考虑可能是重启仲裁节点后,防火墙也自动开了,导致连不上。

  尝试:开端口,关闭防火墙都不能解决问题。

2、网络问题:可能是网络不通。

尝试:在主和仲裁间相互ping,可以ping通。(悲剧的开始,事实上是间歇性ping通,而我ping的时候刚刚好,网络是通的。。。)所以排除了网络问题。

3、没办法就Google:

尝试:以下是网上搜的内容,讲的很详细,和我遇到的问题很像,但不一样,所以把我带坑里了,,,让我坚信是mongodb自身的tcp链接的bug(下面的链接中有bug地址)。

https://yq.aliyun.com/articles/57920(内有tcp链接bug地址)

http://www.cppblog.com/peakflys/archive/2013/05/27/200350.html

补充:虽然不能解决我的问题,但也发现了一个tcp问题:一台虚拟机(仲裁)宕掉后,主节点tcp链接可能还在,而且状态是ESTAB,mongo副本集:只开启主节点和仲裁无法选主问题分析

但此时,重启仲裁,并查看相应的tcp链接,是不存在的,具体如下图:

mongo副本集:只开启主节点和仲裁无法选主问题分析


结论:

后来,在同事的提醒下,又检查了下网络,发现ping通,但丢包率为78%!!!此时查看mongodb副本集,没有长成选主。现在开始怀疑是网络问题,再ping,正常,这时立即查看mongodb副本集,选出了主节点!!!所以初步分析,是网络问题导致的节点间tcp通信超时。

后记:

考虑到桥接模式,每个虚拟机都有自己独立的IP,且为了配置副本集,需要固定IP,而我们局域网的IP是动态分配的(每次自己主机开机后IP是不固定的)。所以可能出现在同一个局域网内挣用IP的问题。