有道無術,術尚可求,有術無道,止于術。
本系列Redis 版本 7.2.5
源碼地址:https://gitee.com/pearl-organization/study-redis-demo
文章目錄
- 1. 概述
- 2. 工作原理
- 2.1 監控
- 2.2 標記下線
- 2.3 哨兵領袖
- 2.4 新的主節點
- 2.5 通知更新
- 3. 搭建演示
- 3.1 安裝
- 3.2 修改配置
- 3.3 啟動
- 3.4 測試
1. 概述
官方文檔
主從復制模式常用于數據備份和讀寫分離,當主節點故障時,需要人工干預來處理主節點故障和從節點的升級,在實際應用中,可用性并不高。
Redis
提供了基于哨兵(Sentinel
)的高可用解決方案,Sentinel
是一個運行在特殊模式下的 Redis
服務端,本身不存儲任何數據,而是作為主從復制模式下的監控和管理工具。當主節點出現故障時,可以提供自動故障轉移功能,從而保證 Redis
服務的連續性和穩定性。
核心功能:
- 監控:持續檢查主節點和從節點實例是否按預期工作
- 通知:可以通過
API
通知系統管理員或其他計算機程序,被監控的Redis
實例出現問題 - 自動故障轉移:如果主節點未按預期工作,啟動故障轉移過程,將其中一個從節點被提升為主節點,其他的從節點重新配置使用新的主節點,并且通知在連接時使用的新地址
- 配置中心:客戶端通過連接哨兵來獲得當前
Redis
服務的主節點地址
2. 工作原理
2.1 監控
Redis Sentinel
在啟動完成后,首先需要連接到到主從節點進行監控:
在 Sentinel
配置文件中,首先需要配置主節點的地址,首次上線時,會根據該地址連接到主節點,并定期(通常是每1
秒)向主節點發送 PING
命令來檢查其狀態。
Sentinel
連接到主節點后,還會通過 INFO
命令獲取所有從節點的地址信息,建立和從節點的連接,并同樣采用心跳機制進行狀態檢查。
多個 Sentinel
節點之間,也需要進行通信,會在主節點中建立一個 __sentinel__:hello
專用通道,利用發布訂閱機制進行數據交互。可以使用可視化工具查看:
2.2 標記下線
當某個 Sentinel
節點發送 PING
命令后,主節點在規定的時間內沒有響應,則會標記為主觀下線(Subjectively Down
)狀態,其他 Sentinel
節點同樣也會檢測到主節點下線,并標記為主觀下線。當主節點被足夠數量的 Sentinel
節點都標記為 S_DOWN
,則標記為客觀下線(Objectively Down
)狀態。
在 sentinel monitor
配置項中,可以設置主節點被多少個 Sentinel
標記為 S_DOWN
時,則標記為O_Down
:
sentinel monitor mymaster 127.0.0.1 6379 2
從主觀下線到客觀下線,需要多個哨兵達成一致意見,才能認為主節點客觀上已經宕掉,這一步驟是為了防止單個 Sentinel
節點的誤判。
2.3 哨兵領袖
當主節點被判定為客觀下線后,哨兵節點之間會進行投票選舉,以選出哨兵領袖(Leader Sentinel
),負責后續的故障轉移工作。
整個選舉過程基于 Raft
算法,當半數以上的哨兵投票通過后就認定該哨兵為哨兵領袖,所以一般將哨兵數量部署為單數,避免腦裂。
2.4 新的主節點
Leader Sentinel
會在從節點中,選擇一個新的主節點,選擇的標準一般有:
- 響應速度,慢的就會被優先過濾掉,說明健壯性不夠
- 節點配置的優先級,優先級越高,越容易被選中
- 數據偏移量,偏移量越大,說明數據復制的完整度越高
- 節點創建時間,越早創建的節點,會優先選擇( 根據
RunId
排序)
選出新的主節點后,Leader Sentinel
會調用 REPLICAOF
命令將選出的新節點升級為主節點,其他的從節點更新配置信息,并連接到新的主節點,并確保和新主節點之間的數據同步。
2.5 通知更新
Leader Sentinel
通過發布訂閱通知其他哨兵節點,還可以通過 API
或者腳本發送通知,報告集群的狀態變化和故障情況。
3. 搭建演示
數據節點直接使用之前搭建的一主兩從環境,在此基礎上搭建三個哨兵節點,簡要部署架構圖如下:
所有節點網絡訪問地址如下 :
- 主節點:
192.168.56.101:6379
- 從節點一:
192.168.56.102:6379
- 從節點二:
192.168.56.103:6379
- 哨兵節點一:
192.168.56.104:26379
- 哨兵節點二:
192.168.56.105:26379
- 哨兵節點三:
192.168.56.106:26379
3.1 安裝
Redis 7.x 系列【2】單機部署
Redis 7.x 系列【21】主從復制
Redis Sentinel
也是一個特殊的 Redis
服務端,安裝方法和普通的 Redis
一樣,參考上面的文檔,在三臺哨兵服務器上安裝即可。
3.2 修改配置
接下來需要修改所有哨兵節點的配置文件,首先從源碼中將 sentinel.conf
配置文件復制到配置目錄:
[root@localhost /]# mkdir /etc/redis
[root@localhost /]# cp ~/redis-7.2.5/sentinel.conf /etc/redis/
[root@localhost bin]# vim sentinel.conf
三個哨兵節點都需要修改配置,首先允許后臺啟動:
daemonize yes
配置當前監控的主節點的名稱、IP
、端口,以及進行故障轉移的最少的投票數:
sentinel monitor mymaster 192.168.56.101 6379 2
如果主從節點設置了密碼,還需要配置主節點名稱、認證密碼 (主從密碼需要保持一致):
sentinel auth-pass mymaster 123456
可以配置 Sentinel
節點的密碼(其他哨兵節點的密碼需要保持一致):
requirepass entinel123456
3.3 啟動
這里直接使用命令啟動,先啟動所有主從復制節點,再啟動所有哨兵節點:
[root@localhost bin]# cd /usr/local/bin
[root@localhost bin]# ./redis-sentinel /etc/redis/sentinel.conf
3.4 測試
使用 ./redis-cli
連接任一哨兵節點:
[root@localhost bin]# ./redis-cli -p 26379
127.0.0.1:26379> auth sentinel123456
OK
輸入 info sentinel
查看所有哨兵信息,可以看到當前連接的主節點地址為 192.168.56.101:6379
,以及從節點和哨兵節點的數量:
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.101:6379,slaves=2,sentinels=3
在主節點服務器上,直接 kill
掉主節點進程:
[root@localhost bin]# ps -ef | grep redis
root 16305 1 0 01:05 ? 00:00:29 ./redis-server *:6379
root 19902 19252 0 11:18 pts/2 00:00:00 grep --color=auto redis
[root@localhost bin]# kill 16305
再次執行 info sentinel
命令,可以看到主節點地址變成了 192.168.56.102:6379
,自動進行了故障轉移,并選舉了新的主節點(當之前下線的主節點重新連接后,會降級為從節點):
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.56.102:6379,slaves=3,sentinels=3
查看 sentinel.conf
配置文件,可以看到自動更新了主節點:
還會自動更新從節點 redis.conf
配置文件: