一直在用一個五台機器組成的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 -LChain INPUT (policy ACCEPT)target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHEDACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:sshREJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain FORWARD (policy ACCEPT)target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT)target prot opt source destination
解決方案即是關閉iptables,設定開機不啟動。
service iptables stopchkconfig --level 2345 iptables off
PS. 以上廢話太多,總結起來就是MongoDB分區的服務可能會被iptables防火牆所阻止,如果在排除了網路和服務的可能性之後,最可能的原因就是查看防火牆設定。