Redis安裝之叢集-哨兵模式(sentinel)模式

DeepInThought發表於2024-03-12

官網說明:https://redis.io/docs/management/sentinel/

一、背景

Redis 主從複製模型在一定程度上解決了讀寫分離、容災恢復、資料備份、水平擴容支撐高併發的問題,但仍存在單點故障問題,即 Mater 當機後,叢集將無法提供寫服務。

二、方案原理

  1. 主從複製的問題在於 Mater 當機後,Slave 不會取而代之。
  2. 引入 哨兵(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

相關文章