1. 程式人生 > >Redis叢集-哨兵模式

Redis叢集-哨兵模式

文章目錄

概述

哨兵模式是Redis官方推薦的叢集部署方式,與主從複製方式不同,哨兵模式可以在Master宕機時,自動實現主備切換。哨兵本身也是一個獨立執行的程序,它用來監控多個主從複製叢集。下圖為哨兵模式簡易呼叫圖:
在這裡插入圖片描述

優勢

  • 不定時監控Redis叢集是否執行良好。
  • 若Redis節點出現故障,可以及時同事其他程序,如客戶端。
  • 能夠自動程序主備切換。

哨兵叢集

很顯然,哨兵程序也存在單點部署的問題,即哨兵程序掛掉後,導致整個叢集不可用,故哨兵程序也應該支援叢集部署。部署哨兵叢集的優勢有以下幾點:

  • 即便某些哨兵程序掛掉,依然可以進行主備切換。
  • 客戶端可以連線任意一個哨兵程序服務,以獲取叢集資訊。

啟動方式

  • 第一種
    redis-sentinel sentinel.conf
  • 第二種
    redis-server sentinel.conf --sentinel
    兩種啟動方式均需要指定哨兵配置檔案,哨兵程序預設監聽埠為26379。

哨兵配置解析

sentinel monitor mymaster 127.0.0.1 6379 2

表示監控的master節點名稱為mymaster,ip為127.0.0.1,埠為6379,2的含義為大於等於2個哨兵程序認為master不可用時,才會真正認為master不可用,這個我們後續會詳細敘述。

sentinel down-after-milliseconds mymaster 3000

哨兵通過PING來確認master是否存活,上述配置表示單個哨兵在3000毫秒內未收到PING的有效回覆,則認為master已經不可用。

sentinel parallel-syncs mymaster 2

上述配置表示為,主備切換時可以最多有2個slave與master進行同步,這個數字越小,完成同步時間越長,數字越大,完成同步時間短,但是意味著更多slave處於不可用狀態,所以應合理配置這個數值。

主備切換策略

如何判斷節點不可用

哨兵向redis節點發送PING命令,若時間超過down-after-milliseconds未收到有效回覆,則認為該節點不可用。

主觀下線

簡稱SDOWN,指的是某個哨兵判斷為節點不可用時(檢測頻率為1秒),將該節點標註為主觀下線,節點範圍適用於Master和Slave。

客觀下線

簡稱ODOWN,指的是一定數量(通過配置指定)的哨兵判斷為節點不可用時,將該節點標註為客觀下線,節點範圍只適用於Master。

若沒有足夠數量的哨兵同意Master已經下線,Master 的客觀下線狀態就會被移除。
若Master重新對哨兵的PING命令返回有效回覆,Master的主觀下線狀態就會被解除。

切換條件

當master被標記為客觀下線後,若哨兵群中大多數(majority)哨兵都認為master已經不可用,通過投票從剩餘的slave選舉一個作為新的master並修改相關配置。

上面說的“大多數哨兵”具體指的是多少哨兵呢,請看下面的對應關係。

2 個哨兵,majority=2
3 個哨兵,majority=2
4 個哨兵,majority=2
5 個哨兵,majority=3

那麼如何從slave選舉出一個作為master呢?請看如下參考條件:

  1. slave節點處於SDOWN,ODOWN,DISCONNECTED不會作為備選master節點。
  2. 最近一次ping應答時間超過5倍ping的間隔不會作為備選master節點。
  3. slave 跟 master 斷開連線的時間已經超過了down-after-milliseconds的 10 倍+master 宕機的時長,不會作為備選master節點。

如果通過了上面的篩選,則按如下流程篩選master節點:

  1. 按照優先順序排序,優先順序數值(配置檔案設定)越低,則備選master的優先順序越高。
  2. 如果優先順序相同,則取replica offset較大的slave作為master備選節點。
  3. 如果replica offset也相同,則選取run id較小的作為master備選節點。(每個redis例項,都會有一個runid,通常是一個40位的隨機字串,在redis啟動時生成)

作者Redis系列文章大全

Redis入門
CentOS-7下安裝redis-2.8
Redis配置詳解
Redis資料淘汰策略
Redis快取一致性問題
Redis穿透與雪崩的預防與解決方案
阻塞IO、非阻塞IO和非同步IO
Redis事物探祕
Redis持久化淺析
IO多路複用及select、poll和epoll
Redis叢集-主從複製模式
Redis叢集-哨兵模式