官網說明:https://redis.io/docs/management/sentinel/
一、背景
Redis 主從複製模型在一定程度上解決了讀寫分離、容災恢復、資料備份、水平擴容支撐高併發的問題,但仍存在單點故障問題,即 Mater 當機後,叢集將無法提供寫服務。
二、方案原理
- 主從複製的問題在於 Mater 當機後,Slave 不會取而代之。
- 引入 哨兵(sentinel) 角色,在後臺監控 Mater 主機的健康狀態,若 Mater 發生故障,根據哨兵投票數自動將一個 Slave 轉換為 Mater,從而保證高可用。
哨兵作用:
- 主從監控:監控主從redis庫執行是否正常
- 訊息通知:哨兵可以將故障轉移的結果傳送給客戶端
- 故障轉移:master 當機,自動根據投票數將 slave 切換為新 master
- 配置中心:客戶端透過連線哨兵來獲得當前Redis服務的主節點地址
三、方案部署
3.1. 環境準備
- 172.19.223.161(主) 埠:6379
- 172.19.223.162(從1) 埠:6380
- 172.19.223.163(從2) 埠:6381
- 172.19.223.164(哨兵1)埠:26379
- 172.19.223.165(哨兵2)埠:26380
- 172.19.223.166(哨兵3)埠:26381
3.2. 環境部署
3.2.1. 配置一主二從模式
在 172.19.223.161、172.19.223.161、172.19.223.163上執行。
參考:https://www.cnblogs.com/DeepInThought/p/18059921 中的 《3.3 一主二從(命令版》。
3.2.2. 安裝sentinel
在 172.19.223.164、172.19.223.165、172.19.223.166上執行。
## 下載
mkdir -p /opt/package
wget https://github.com/redis/redis/archive/7.2.4.tar.gz
## 解壓
tar -zxvf 7.2.4.tar.gz -C ../
cd /opt/redis-7.2.4
## 編譯
make && make install
## 複製配置檔案
cp /opt/redis-7.2.4/sentinel.conf /opt/redis-7.2.4/sentinel.conf.bak
## 配置 172.19.223.164:26379
vi /opt/redis-7.2.4/sentinel.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 23679
logfile "/home/redis/sentinel/23679.log"
pidfile /home/redis/sentinel/23679.pid
dir /home/redis/sentinel/
## redis6.2以上才會解析主機名,且預設不啟用
sentinel resolve-hostnames yes
## 配置監聽主伺服器。mymaster:自定義服務名稱;172.19.223.161:監控主伺服器;6379:端⼝;2:兩個或以上哨兵認為主伺服器不可⽤時,才會進⾏failover操作。
sentinel monitor mymaster 172.19.223.161 6379 2
## 配置服務密碼。mymaster:服務名稱(與上一致),269527:Redis伺服器密碼
sentinel auth-pass mymaster 269527
## 超過5s未連線上 master,則認為 master 已當機
sentinel down-after-milliseconds mymaster 5000
## 超過30000ms未完成 failover,則認為本次 failover 失敗
sentinel failover-timeout mymaster 30000
:wq
## 配置 172.19.223.165:26380
vi /opt/redis-7.2.4/sentinel.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 23680
logfile "/home/redis/sentinel/23680.log"
pidfile /home/redis/sentinel/23680.pid
dir /home/redis/sentinel/
## redis6.2以上才會解析主機名,且預設不啟用
sentinel resolve-hostnames yes
## 配置監聽主伺服器。mymaster:自定義服務名稱;172.19.223.161:監控主伺服器;6379:端⼝;2:兩個或以上哨兵認為主伺服器不可⽤時,才會進⾏failover操作。
sentinel monitor mymaster 172.19.223.161 6379 2
## 配置服務密碼。mymaster:服務名稱(與上一致),269527:Redis伺服器密碼
sentinel auth-pass mymaster 269527
## 超過5s未連線上 master,則認為 master 已當機
sentinel down-after-milliseconds mymaster 5000
## 超過30000ms未完成 failover,則認為本次 failover 失敗
sentinel failover-timeout mymaster 30000
:wq
## 配置 172.19.223.166:26381
vi /opt/redis-7.2.4/sentinel.conf
bind 0.0.0.0
daemonize yes
protected-mode no
port 23681
logfile "/home/redis/sentinel/23681.log"
pidfile /home/redis/sentinel/23681.pid
dir /home/redis/sentinel/
## redis6.2以上才會解析主機名,且預設不啟用
sentinel resolve-hostnames yes
## 配置監聽主伺服器。mymaster:自定義服務名稱;172.19.223.161:監控主伺服器;6379:端⼝;2:兩個或以上哨兵認為主伺服器不可⽤時,才會進⾏failover操作。
sentinel monitor mymaster 172.19.223.161 6379 2
## 配置服務密碼。mymaster:服務名稱(與上一致),269527:Redis伺服器密碼
sentinel auth-pass mymaster 269527
## 超過5s未連線上 master,則認為 master 已當機
sentinel down-after-milliseconds mymaster 5000
## 超過30000ms未完成 failover,則認為本次 failover 失敗
sentinel failover-timeout mymaster 30000
:wq
3.2.3. 啟動sentinel
## 在 172.19.223.164 上執行
./redis-server /opt/redis-7.2.4/sentinel.conf --sentinel
## 在 172.19.223.165 上執行
./redis-server /opt/redis-7.2.4/sentinel.conf --sentinel
## 在 172.19.223.166 上執行
./redis-server /opt/redis-7.2.4/sentinel.conf --sentinel
四. SpringBoot整合哨兵模式
## 配置檔案示例
spring:
redis:
lettuce:
pool:
max-idle: 10 # 連線池中的最大空閒連線
max-wait: 500 # 連線池最大阻塞等待時間(使用負值表示沒有限制)
max-active: 8 # 連線池最大連線數(使用負值表示沒有限制)
min-idle: 0 # 連線池中的最小空閒連線
sentinel:
master: mymaster
nodes:
- 172.19.223.164:26380
- 172.19.223.165:26381
- 172.19.223.166:26382