上篇文章主要說了Redis 複製的內容,但 Redis 複製有一個缺點,當主機 Master 宕機之後,咱們須要人工解決切換,好比使用slaveof no one 。實際上主從複製並無實現,高可用, 高可用側重備份機器, 利用集羣中系統的冗餘,當系統中某臺機器發生損壞的時候,其餘後備的機器能夠迅速的接替它來啓動服務。redis
一旦主節點宕機,寫服務沒法使用,就須要手動去切換,從新選取主節點,手動設置主從關係。docker
那麼如何解決呢?若是咱們有一個監控程序可以監控各個機器的狀態及時做出調整,將手動的操做變成自動的。Sentinel的出現就是爲了解決這個問題。segmentfault
Redis Sentinel 是一個分佈式架構,其中包含若干個 Sentinel 節點和 Redis 數據節點,每一個 Sentinel 節點會對數據節點和其他 Sentinel 節點進行監控,當它發現節點不可達時,會對節點作下線標識。若是被標識的是主節點,它還會和其餘 Sentinel 節點進行「協商」,當大多數 Sentinel 節點都認爲主節點不可達時,它們會選舉出一個 Sentinel 節點來完成自動故障轉移的工做,同時會將這個變化實時通知給 Redis 應用方。整個過程徹底是自動的,不須要人工來介入,因此這套方案頗有效地解決了 Redis 的高可用問題。架構
如圖所示:併發
1)主節點出現故障,此時兩個從節點與主節點失去鏈接,主從複製失敗。分佈式
2)每一個 Sentinel 節點經過按期監控發現主節點出現了故障學習
3)多個 Sentinel 節點對主節點的故障達成一致會選舉出其中一個節點做爲領導者負責故障轉移。spa
4)Sentinel 領導者節點執行了故障轉移,整個過程基本是跟咱們手動調整一致的,只不過是自動化完成的。3d
5)故障轉移後整個 Redis Sentinel 的結構,從新選舉了新的主節點。code
使用docker建立以下redis容器,這裏能夠參考 [進階篇]docker編排PHP開發壞境、 Linux docker-compose 實戰學習下容器技術
redis-sentinel1 172.10.0.9 22530 -> 22530 sentinel redis-sentinel2 172.10.0.10 22531 -> 6379 sentinel redis-sentinel3 172.10.0.11 22532 -> 6379 sentinel redis-master2 172.10.0.5 6383 -> 6379 Master redis-slave2 172.10.0.6 6384 -> 6379 Slave redis-slave3 172.10.0.7 6385 -> 6379 Slave
Sentinel 的核心配置
sentinel monitor mymaster 127.0.0.1 7000 2
監控的主節點的名字、IP 和端口,最後一個2的意思是有幾臺 Sentinel 發現有問題,就會發生故障轉移,例如 配置爲2,表明至少有2個 Sentinel 節點認爲主節點不可達,那麼這個不可達的斷定纔是客觀的。對於設置的越小,那麼達到下線的條件越寬鬆,反之越嚴格。通常建議將其設置爲 Sentinel 節點的一半加1。
sentinel down-after-millseconds mymaster 30000
這個是超時的時間(單位爲毫秒)。打個比方,當你去 ping 一個機器的時候,多長時間後仍 ping 不通,那麼就認爲它是有問題。
sentinel parallel-syncs mymaster 1
當 Sentinel 節點集合對主節點故障斷定達成一致時,Sentinel 領導者節點會作故障轉移操做,選出新的主節點,原來的從節點會向新的主節點發起復制操做,parallel-syncs 就是用來限制在一次故障轉移以後,每次向新的主節點發起復制操做的從節點個數,指出 Sentinel 屬於併發仍是串行。1表明每次只能複製一個,能夠減輕 Master 的壓力。
sentinel auth-pass <master-name> <password>
若是 Sentinel 監控的主節點配置了密碼,sentinel auth-pass 配置經過添加主節點的密碼,防止 Sentinel 節點對主節點沒法監控。
sentinel failover-timeout mymaster 180000
表示故障轉移的時間。
1)Sentinel 節點不該該部署在一臺物理「機器」上。
這裏特地強調物理機是由於一臺物理機作成了若干虛擬機或者現今比較流行的容器,它們雖然有不一樣的 IP 地址,但實際上它們都是同一臺物理機,同一臺物理機意味着若是這臺機器有什麼硬件故障,全部的虛擬機都會受到影響,爲了實現 Sentinel 節點集合真正的高可用,請勿將 Sentinel 節點部署在同一臺物理機器上。
2)部署至少三個且奇數個的 Sentinel 節點。
3個以上是經過增長 Sentinel 節點的個數提升對於故障斷定的準確性,由於領導者選舉須要至少一半加1個節點,奇數個節點能夠在知足該條件的基礎上節省一個節點。