背景
我們在客戶機房部署的的Redis是3主3從的集群,共占用3臺服務(wù)器(100,101,102),沒有使用哨兵系統(tǒng),昨天客戶機房按照機器輪著停機維護,先停了100維護,再停101維護,停100的時候還沒啥問題,在100恢復之后再停101的時候我們的后臺服務(wù)突然報could not get resource from jedis poo。硬著腦門排查,寫下這篇博客記錄。
原理
- 3臺服務(wù)器,分別部署(100機器:master1,slave3)、(101機器:master2,slave1)、(102機器:master3,slave2),master槽位平分,形成集群
- 停機維護100的時候,master1的slave1把自己設(shè)置為master1,此時的狀態(tài)是(100:宕機)(101:master2,master1),(102:master3,slave2)
- 100機器恢復之后,原來該機器上的master會變?yōu)閟lave1,此時的狀態(tài)是(100:slave1,slave3),(101:master2,master1),(102:master3,slave2)
- 停掉101機器之后master1和master2全掛掉,集群中有半數(shù)(2個)master掛掉,那么集群處于fail狀態(tài),也就是Redis不可用。
解決
- 臨時方案:停機或者宕機恢復后使用redis 的cluster info 查看集群狀態(tài)信息,如果有兩個master位于同一臺機器上,那么kill掉這個master,讓master重新回到原來的機器。
- 較好方案:master和slave分別占用1臺機器,有資源的條件下可以這樣部署。