Redis高可用方案之Sentinel
來自: http://my.oschina.net/fifadxj/blog/614086
很多網站都使用Redis作為自己的緩存系統,網站要做到高可用,它使用的緩存系統自然也必須支持高可用,這里就介紹一下Redis的高可用方案Sentinel。
Sentinel是Redis官方提供的一種高可用方案(除了Sentinel,Redis Cluster是另一種方案),它可以自動監控Redis master/slave的運行狀態,如果發現master無法訪問了,就會啟動failover把其中一臺可以訪問的slave切換為master,并且通過pub/sub事件通知Redis客戶端新的master的ip地址。
支持Sentinel的Redis客戶端(例如java得Jedis)會在連接Redis服務器的時候向Sentinel詢問master的ip,并且會在收到master切換的pub/sub事件后自動重新連接到新的master。對調用Redis客戶端的業務系統來說,這些都是完全透明的。
下圖是redis sentinel的部署和運行機制
下圖是master宕機后,failover的發起流程
現在我們來實戰一下,我們的例子中有3臺server,3個sentinel,1個master和2個slave。由于我們只有3臺server,所以每個sentinel和一個master或者slave放在一個server上。采用的部署結構如下圖所示
- 配置master(redis.conf):
requirepass 123456 #設置master的密碼
masterauth 123456 #設置slave連接master進行同步時使用的密碼(雖然當前是master不需要密碼,但是當master掛了以后再重啟以后,這個時候可能failover已經完成了,master會自動被降級為slave)
- 分別配置slave1和slave2(redis.conf):
slaveof 172.17.138.94 6379 #指定slave1和slave2的master
requirepass 123456 #設置slave的密碼
masterauth 123456 #設置slave連接master進行同步時使用的密碼
- 分別配置sentinel1,sentinel2,sentinel3(sentinel.conf):
sentinel monitor mymaster 172.17.138.94 6379 2 #指定sentinel監控的master(組id為mymaster,當前master ip為172.17.138.94,端口6379,最后的2指定quorum的值,表明如果有2個sentinels無法連接master,才認為master掛了),slave不用指定,sentinel會通過pub/sub機制自動發現所有slave
sentinel auth-pass mymaster 123456 #設置sentinel連接的master和slave的密碼(只能設置一個密碼,所以master和slaves的密碼必須相同)
- 啟動master和slave1,slave2:
分別ssh到master,slave1,slave2,運行redis-server redis.conf &
- 查看master-slave分布情況,redis-cli info Replication
master應該看到類似下圖信息
slave1和slave2應該看到類似下圖信息
- 啟動sentinel1,sentinel2,sentinel3:
分別ssh到每個sentinel,運行redis-sentinel sentinel.conf &
- 通過sentinel查看master,slave的情況
分別ssh到每個sentinel,運行redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
將能看到當前的master的ip地址,redis客戶端(jedis)就是通過這個命令來獲知應該連接到哪個redis服務器的,如下圖
- 現在我們來演示failover,我們先把master關了來模擬master宕機了
這時候查看sentinel的日志,當有2臺(達到quorum)sentinel發現master無法訪問后,sentinels進行投票,自動把master切換為slave2(172.17.138.92)
現在再詢問sentinel當前master的地址,發現master已經變成了slave2(172.17.138.92)。
而且當掛掉的master重新啟動后,它將被自動配置成新master的slave。
如果你這時查看redis.conf和sentinel.conf,你會發現它們的內容已經自動修改成172.17.138.92作為master相對應的配置了,也就是說sentinel的failover是永久性的,下次重啟所有redis和sentinels的時候還是有效。
總結:sentinel是一種有效的高可用方案,不過如果你是通過切片(sharding/partition)的可擴展方式使用Redis的話,目前好像還沒有成熟的sentinel和切片集成使用的方法。如果你需要同時擁有高可用和可擴展的Redis方案的話,不妨考慮一下Redis3新推出的Redis Cluster方案。
參考資料:
http://redis.io/topics/sentinel
http://redis.io/topics/sentinel-clients