MongoDB故障排查记录 [rsHealthPoll] couldn't connect to server

一直在用一个五台机器组成的MongoDB集群(192.168.40.80 ~ 84),5个shard,分了3个分片。之前一直运行正常,最近一段时间发现服务很不稳定,show db老提示说shard 4 error,并且有时候有机器会因为负载过高而宕机。

今日偶然查看MongoDB日志,发现跟shard 4相关的几台机器都在报同样地错误:

[rsHealthPoll] couldn't connect to 192.168.40.83:29022: couldn't connect to server 192.168.40.83:29022

而在40.83上查看shard4的日志发现也报错:

[rsHealthPoll] replset info 192.168.40.80:29022 thinks that we are down

这很奇怪,network没问题为什么每个分片的服务都正常却外边连不上呢?冲其他几台机器能ping通,telnet 29022却不能成功。后来发现原来是83的iptables随着某次系统维护重启机器而开启了,所以默认阻止了对其上MongoDB的服务(其实其他几个分片都有问题),结果可能是在shard4上的数据被访问次数过多,而这个分片只有两个机器在值班,所以一旦另外有一个发生问题,则会造成整个数据集的失效。有机器死机(非40.83)也应该跟这个有关。

[root@mongodb04 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere             reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

解决方法即是关闭iptables,设置开机不启动。

service iptables stop

chkconfig --level 2345 iptables off

PS. 以上废话太多,总结起来就是MongoDB分片的服务可能会被iptables防火墙所阻止,如果在排除了网络和服务的可能性之后,最可能的原因就是查看防火墙设置。

你可能感兴趣的:(mongodb,防火墙,iptables,故障)