因此必須有高可用方案,當故障發生時可自動從主切換,程序也不用重啓,沒必要手動運維。Redis 官方就提供了這樣一種方案 —— Redis Sentinel(哨兵)。java
sentinal,哨兵,redis集羣架構中很是重要的一個組件,主要功能以下node
監控Redis master和slave進程的正常工做git
若是某個Redis實例有故障,那麼哨兵負責發送報警消息給管理員github
若master node宕機,會自動轉移到slave node上redis
若發生故障轉移,通知client客戶端新的master地址算法
哨兵自己也是分佈式,做爲一個集羣運行:bash
目前採用的是sentinal 2版本,sentinal 2相對於sentinal 1來講,重寫了不少代碼,主要是讓故障轉移的機制和算法變得更加健壯和簡單服務器
哨兵 + Redis主從的部署架構不保證數據零丟失,只保證redis集羣的高可用性。markdown
必須部署2個以上的節點。若僅部署2個實例,quorum=1網絡
+----+ +----+
| M1 |---------| R1 |
| S1 | | S2 |
+----+ +----+
複製代碼
Configuration: quorum = 1
master宕機,s1和s2中只要有1個哨兵認爲master宕機就能夠進行切換,同時會在s1和s2中選舉出一個執行故障轉移. 但此時,須要majority,也就是大多數哨兵都是運行的,2個哨兵的majority就是2
2個哨兵的majority=2 3個哨兵的majority=2 4個哨兵的majority=2 5個哨兵的majority=3
2個哨兵都運行着,就能夠容許執行故障轉移
若整個M1和S1運行的機器宕機了,那麼哨兵僅剩1個,此時就無majority來容許執行故障轉移,雖然另一臺機器還有一個R1,但故障轉移不會執行
+----+
| M1 |
| S1 |
+----+
|
+----+ | +----+
| R2 |----+----| R3 |
| S2 | | S3 |
+----+ +----+
複製代碼
Configuration: quorum = 2,majority
若M1節點宕機了,還剩下2個哨兵,S2和S3能夠一致認爲master宕機了,而後選舉出一個來執行故障轉移
同時3個哨兵的majority
是2,因此餘存的2個哨兵運行着,就可執行故障轉移
Redis 主節點
[啓動]
redis-server redis- 7000.conf
[配置]
port 7000
daemonize yes
pidfile /var/run/redis-7000.pid
logfile "7000.log"
dir "/opt/soft/redis/data/"
複製代碼
Redis 從節點
[啓動]
redis-server redis-7001.conf
redis-server redis-7002.conf
slave-1[配置]
port 7001
daemonize yes
pidfile /var/run/redis-7001.pid
logfile "7001.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
slave-2[配置]
port 7002
daemonize yes
pidfile /var/run/redis-7002.pid
logfile "7002.log"
dir "/opt/soft/redis/data/"
slaveof 127.0.0.1 7000
複製代碼
Sentinel 主要配置
port $(port)
dir "/opt/soft/redis/data/"
logfile " $(port).log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
複製代碼
JedisSentinelPool sentinelPool = new JedisSentinelPool(masterName, sentinelSet, poolConfig, timeout);
Jedis jedis = null;
try {
jedis = redisSentinelPool.getResource();
//jedis command
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
if (jedis != null)
jedis.close();
}
複製代碼
單個
Sentinel 節點對服務器作出的下線判斷,即單個 Sentinel 認爲某個服務下線(有多是接收不到訂閱,之間的網絡不通等一系列緣由)。
注意主觀下線是每一個sentinel節點對Redis節點失敗的"偏見」。因此還須要客觀下線機制。
多個
Sentinel 實例在對同一個服務器作出 SDOWN 判斷,而且經過命令互相交流以後,得出的服務器下線判斷,而後開啓 failover。
只有在足夠數量( 超過quorum個)的 Sentinel 都將一個服務器標記爲主觀下線以後, 服務器纔會被標記爲客觀下線(ODOWN)。只有當 Master 被認定爲客觀下線時,纔會發生故障遷移。
仲裁指配置文件中的 quorum
參數。某個 Sentinel 先將 Master 節點標記爲主觀下線,而後會將這個斷定經過 sentinel is-master-down-by-addr
命令詢問其餘 Sentinel 節點是否也一樣認爲該 addr 的 Master 節點要作主觀下線。
sentinel monitor <masterName> <ip> < port> <quorum>
sentinel monitor myMaster 127.0.0.1 6379 2
#
sentinel down-after-milliseconds < masterName> < timeout>
sentinel down-after-milliseconds mymaster 30000
複製代碼
最後當達成這一共識的 Sentinel 個數達到前面說的 quorum 設置的值時,該 Master 節點會被認定爲客觀下線並進行故障轉移。 quorum
值通常設爲 Sentinel 個數的二分之一加 1,例如 3 個 Sentinel 就設爲 2。
綜上可得
down-after-milliseconds
,則該實例會被 Sentinel 標記爲 主觀下線緣由:只有一個sentinel節點完成故障轉移。 選舉:經過sentinel is-master-down-by-addr命令都但願成爲領導者:
繼續。 3. 選擇runId最小的slave節點。
主節點 sentinel failover <masterName>
節點下線
節點上線
從節點的做用
因爲Redis Sentinel只會對主節點進行故障轉移,對從節點採起主觀的下線,因此須要自定義一個客戶端來監控對應的事件
三個消息
故障發現、故障自動轉移、配置中心、客戶端通知。
Sentinel只是配置中心,並不是代理
其他Sentinel節點的監控
參考