標籤:redis 高效能分布式緩衝 sentinel 高可用性 sentinelstate
Sentinel是Redis的高可用性解決方案,由一個或多個Sentinel執行個體組成Sentinel系統,可以用來監視任意多個主伺服器和主伺服器下的所有從伺服器,當監視到主伺服器下線之後會自動將下線主伺服器下的從伺服器升級為新的主伺服器,由新主伺服器代替已下線主伺服器處理命令請求。
Sentinel是一個特殊的Redis伺服器執行個體,Redis由一個或多個Sentinel執行個體構成Sentinel系統,Sentinel可以用來監測任意多個主伺服器和從伺服器,當Sentinel由於故障下線之後,Sentinel會進行容錯移轉,推選出新的主伺服器。
啟動Sentinel執行個體
可以通過下列命令啟動Sentinel執行個體:
redis-sentinel /path/to/your/sentinel.conf
或者:
redis-server /path/to/your/sentinel.conf --sentinel
sentinel.conf設定檔樣本:
sentinel monitor master1 127.0.0.1 6379 2
sentinel down-after-milliseconds master1 30000
sentinel parallel-syncs master1 1
sentinel failover-timeout master1 900000
Sentinel伺服器和普通的Redis伺服器使用的命令不一樣,Sentinel不使用資料庫所以不能使用SET等跟資料庫有關的命令,在初始化時也不用載入RDB或AOF檔案。
資料結構
Redis中通過sentinelState結構維護Sentinel相關的狀態,其中有一個master字典維護被監視的主伺服器,字典key是主伺服器名稱,value為一個sentinelRedisInstance結構。
Sentinel和普通伺服器會建立兩個串連,一個用來發送普通命令,一個用來訂閱頻道,用來訂閱伺服器的_sentinel_:hello頻道,Sentinel會發布資訊到該頻道,在建立訂閱串連之後會向伺服器發送SUBSCRIBE _sentinel_:hello命令同時也訂閱該頻道的資訊,當主伺服器被多個Sentinel監視時,Sentinel可以通過該頻道自動探索其它監視同一台主伺服器的Sentinel,並把它添加到sentinelRedisInstance結構的sentinels屬性中,並且和新發現的sentinel建立命令串連(不會建立訂閱串連)。
Sentinel以預設十秒一次的頻率,通過命令串連向主伺服器發送INFO命令,並通過分析INFO命令的回複來擷取主伺服器的當前資訊。當主伺服器接收到INFO命令時會向Sentinel回複當前主伺服器的runid、以及該主伺服器下所有從伺服器的ip和連接埠並把這些從伺服器資訊儲存到主伺服器對應的sentinelRedisInstance結構的slaves屬性對應的字典中。
當Sentinel發現了主伺服器的新從伺服器時會和從伺服器建立命令串連和訂閱串連,並且發送INFO命令向從伺服器擷取從伺服器的runid、主伺服器的ip連接埠、主從伺服器串連狀態、主伺服器優先順序、從伺服器複製位移量。並發這些資訊儲存到sentinelRedisInstance結構中。
節點通訊
預設情況下,Sentinel每兩秒一次的頻率通過命令串連向所有被監視的主從伺服器發送一下格式的命令:
PUBLISH _sentinel_:hello "<s_ip>,<s_port>,<s_runid>,<s_epoch>,<m_name>,<m_ip>,<m_port>,<m_epoch>"
該命令向_sentinel_:hello頻道發送了一條訊息,把Sentinel ip、Sentinel連接埠、Sentinel運行id、Sentinel當前配置紀元、主伺服器 ip、主伺服器連接埠、主伺服器運行id、主伺服器當前配置紀元發送到_sentinel_:hello頻道,因為所有的Sentinel執行個體都訂閱了_sentinel_:hello頻道,所以這條發布訊息會被所有的Sentinel執行個體收到,所有各個Sentinel可以通過這條訂閱訊息實現自動探索,並把新發現的Sentinel添加到sentinelRedisInstance結構的sentinels屬性中。
Sentinel以每秒一次的頻率向所有與它建立了命令串連的執行個體(包括主從伺服器、Sentinel伺服器)發送PING命令,根據PING的回複來判斷執行個體是否線上,回複+PONG、-LOADING、-MASTERDOWN三種的一種說明線上,否則說明不線上,Sentinel配置了down-after-milliseconds選項,當連續down-after-milliseconds毫秒內都沒有回複有效回複,那麼Sentinel會把該執行個體標識為主觀下線,把sentinelRedisInstance結構中的flags置成SRI_S_DOWN。
當Sentinel將一個主伺服器標識為主觀下線後,通過發送SENTINEL is-master-down-by-addr <ip> <port> <curent_epoch> <runid>向其它sentinel詢問該主伺服器是否下線,當收到足夠多的下線判斷之後,會把該主伺服器標識成客觀下線,把flags置成SRI_O_DOWN。主伺服器被標識成客觀下線之後,各個Sentinel執行個體會進行協商,推舉出一個領頭Sentinel,對下線的主伺服器進行容錯移轉,推舉出新的主伺服器,並且更改相關從伺服器的複製目標,如果舊主伺服器重新上線,把它變成從伺服器。
推舉領頭Sentinel採用了Raft演算法。
《Redis設計與實現》學習筆記-Sentinel(哨崗、哨兵)