總有人問起配置ReplicaSet不成功,總結了一下基本上的可能性就幾種,檢查步驟如下:
假設三台機器的IP分別是
A: 192.168.1.2 a.test.com B:192.168.1.3 b.test.com C: 192.168.1.4 c.test.com
1. mongod有在運行嗎?
雖然這是個很低級的問題,但是還是要不厭其煩地說一句,請先檢查是否真的運行了mongod。
# ps awx | grep mongod 7393 ? Sl 42:32 /usr/bin/mongod -f /etc/mongod.conf <--正在運行的mongod進程 24663 pts/1 S+ 0:00 grep mongod
2. bind_ip不正確
如果是從YUM源安裝,CentOS默認bind_ip配置為127.0.0.1,所以是絕對不可能從其他機器連上的。驗證辦法為:
netstat -pln | grep mongod
如果綁定地址為:0.0.0.0:27017或192.168.1.2(局域網IP):27017則沒有問題。
如需修改,編輯/etc/mongod.conf中
bind_ip=192.168.1.2
再重啟mongod即可。
注意:在生產環境下不建議使用bind_ip=0.0.0.0,因為這樣極易向公網暴露mongodb服務,造成不安全隱患。這也是為什么默認bind_ip是127.0.0.1的原因——讓配置人員必須關注一下這個配置。
3. 防火牆未打開端口
經過以上步驟后,在正常情況下在任意一台機器上應該可以連接其他兩台機器的27017端口。比如在A上時
mongo 192.168.1.3 mongo 192.168.1.4
應該都是可以順利連接的,如果不行,那應該檢查一下防火牆是否有在運作並阻止了你的訪問。
這是一個關於iptables的基本操作問題,請查閱iptables相關使用方法,在此不再贅述。
4. 使用域名添加成員時請注意
跟步驟3一樣的原因,因為任意兩台實例必須能夠互相連接,所以如果使用域名,應該確保使用到的域名在各個結點上都能夠正常解析。在本例中三個實例都必須能夠正常解析a/b/c.test.com到對應的機器
ping a.test.com ping b.test.com ping c.test.com
同時可見為什么不允許使用localhost/127.0.0.1作為地址添加進去,因為大家都會把localhost/127.0.0.1解析為自己,導致混亂。
5. keyfile配置問題
replica set成員必須使用同一個keyfile,內容可以隨自己意願。注意這個文件可以放在任意地方,但是權限必須是600,所屬用戶必須是啟動mongod的用戶
比如如果用service啟動mongod,則該文件應該屬於mongod:mongod;如果是用root用戶啟動,則該文件應該屬於root:root。配置錯誤的情況下是會在日志中看到一個錯誤的。
以上是近期遇到的常見情況,隨時補充。
6. 從庫都宕機后,不能提供服務了:
注意:在副本集的環境中,要是所有的Secondary都宕機了,只剩下Primary。最后Primary會變成Secondary,不能提供服務。