redis sentinel 簡介
Redis Sentinel 是 Redis 官方提供的高可用(HA)解決方案,用于監控主從架構中的故障并自動完成故障轉移。當主節點(Master)宕機時,Sentinel 能自動選舉新的主節點,通知從節點(Slave)和客戶端更新配置,實現服務無縫切換。其核心功能包括:
- 監控:持續檢查 Redis 主從節點的健康狀態
- 自動故障轉移:主節點故障時,自動將從節點提升為主節點。
- 配置提供:為客戶端動態推送最新的主節點地址。
- 通知:通過 API 通知管理員節點故障信息。
本次使用 1主 + 2從 + 3 Sentinel 的架構進行部署。
準備環境
-
獲取 redis docker 鏡像
docker pull redis:7.4.4 docker images
-
創建目錄
/home/docker/redis-sentinel
,將后續相關的配置文件都集中存放在該目錄mkdir -p /home/docker/redis-sentinel
-
依次創建 master、salve、sentinel的目錄文件夾
mkdir -p /home/docker/redis-sentinel/master-data mkdir -p /home/docker/redis-sentinel/salve1-data mkdir -p /home/docker/redis-sentinel/salve2-data mkdir -p /home/docker/redis-sentinel/sentinel1-data mkdir -p /home/docker/redis-sentinel/sentinel2-data mkdir -p /home/docker/redis-sentinel/sentinel3-data
-
創建用于 redis 通信的專屬 bridge
docker network create --driver bridge --subnet 172.16.0.0/24 --gateway 172.16.0.1 redis-bridge
-
查看是否創建成功
docker network ls
關于 docker 網絡
參考文檔:https://outmanzzq.github.io/2019/10/22/docker-network/
docker 默認有三個網絡,可以通過 docker network ls
查看
NETWORK ID NAME DRIVER SCOPE
9ac8281b182c bridge bridge local
99abdb470354 host host local
8e983d1c7d86 none null local
Docker 內置這三個網絡,運行容器時,你可以使用該 –network
標志來指定容器應連接到哪些網絡;如果不指定,則docker默認使用--network=bridge
docker run --network=host
- Host:與宿主機在同一個網絡,沒有獨立IP;
- None:該模式將容器放置在它自己的網絡棧中,但是并不進行任何配置。相當于關閉了容器的網絡功能;
- Bridge:容器連接到 docker0 虛擬網卡,通過 docker0 網橋以及 Iptables nat 表配置與宿主機通信;
通過 ifconfig
可以查看到 docker0
在 bridge 模式下,連在同一網橋上的容器可以相互通信,本文的 docker 配置將基于 bridge 模式。
單個容器分開部署
啟動 master
-
創建主節點啟動配置文件,
vim /home/docker/redis-sentinel/redis-master.conf
# redis-master.conf# 是否為守護進程 daemonize no # 指定 redis 啟動端口 port 6379 bind 0.0.0.0# 設置連接密碼 requirepass 123456 # 從節點連接主節點時使用的密碼 masterauth 123456# 使用 aop 持久化 appendonly yes
-
啟動 redis 鏡像
docker run -it -d --name redis-master \--net=redis-bridge \--ip 172.16.0.10 \-p 6379:6379 \-v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/master-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf# -it:允許在啟動時附加終端查看日志或調試(如未配置 -d 時),但此處與 -d 共存,實際以守護模式運行,可能用于保留日志輸出能力。 # -d: 后臺運行容器,返回容器 ID,不阻塞當前終端。 # --name redis-master: 指定容器的名稱 # --network redis-bridge:指定容器啟動網絡,方便后續容器之間的通信 # -p 6379:6379:端口映射,將宿主機 6379 端口映射到容器的 6379 端口 # -v /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf:掛載宿主機文件到容器內,將宿主機配置文件掛載至容器內 Redis 默認配置路徑,覆蓋鏡像默認配置;修改宿主機配置后,重啟容器即可生效。 # -v /home/docker/redis-sentinel/master-data:/data:掛載宿主機目錄到容器內的 /data 目錄,Redis 持久化文件(如 dump.rdb)存儲在宿主機目錄,避免容器刪除后數據丟失 # redis:7.4.4:指定使用的 Docker 鏡像及版本 # redis-server /etc/redis/redis.conf:覆蓋鏡像默認的啟動命令,指定 Redis 啟動時加載的配置文件
-
查看是否成功啟動
docker ps
-
進入容器
docker exec -it redis-master redis-cli -a 123456
啟動 salve
-
創建從節點啟動配置文件,
vim /home/docker/redis-sentinel/redis-salve1.conf
# redis-salve1.conf# 是否為守護進程 daemonize no # 指定 redis 啟動端口 port 6379 bind 0.0.0.0# 設置連接密碼 requirepass 123456 # 從節點連接主節點時使用的密碼 masterauth 123456# 使用 aop 持久化 appendonly yes# 指定主節點的IP和端口,使用容器名稱即可 replicaof redis-master 6379
-
啟動從節點鏡像
docker run -it -d --name redis-salve1 \--network redis-bridge \--ip 172.16.0.11 \-p 6479:6379 \-v /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/salve1-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf
-
查看是否啟動成功
docker ps
-
進入從容器,嘗試 set 會被拒絕
docker exec -it redis-salve1 redis-cli -a 123456
-
驗證是主從是否成功
docker exec redis-master redis-cli -a 123456 INFO replication
啟動第二個從節點
-
創建從節點啟動配置文件,
vim /home/docker/redis-sentinel/redis-salve2.conf
# redis-salve2.conf# 是否為守護進程 daemonize no # 指定 redis 啟動端口 port 6379 bind 0.0.0.0# 設置連接密碼 requirepass 123456 # 從節點連接主節點時使用的密碼 masterauth 123456# 使用 aop 持久化 appendonly yes# 指定主節點的IP和端口,使用容器名稱即可 replicaof 172.16.0.10 6379
-
啟動從節點鏡像
docker run -it -d --name redis-salve2 \--network redis-bridge \--ip 172.16.0.12 \-p 6579:6379 \-v /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf \-v /home/docker/redis-sentinel/salve2-data:/data \redis:7.4.4 \redis-server /etc/redis/redis.conf
啟動 sentinel
-
創建 sentinel 配置文件,
vim /home/docker/redis-sentinel/redis-sentinel.conf
# redis-sentinel.conf# 端口號 port 26379daemonize no# 啟用主機名解析 sentinel resolve-hostnames yes # 監控主節點,2 個 Sentinel 同意即觸發故障轉移 sentinel monitor mymaster redis-master 6379 2 # 主節點密碼 sentinel auth-pass mymaster 123456 # 5 秒無響應視為下線 sentinel down-after-milliseconds mymaster 5000
-
啟動sentinel1
docker run -it -d --name redis-sentinel1 \--network redis-bridge \--ip 172.16.0.20 \-p 26379:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel1-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
-
啟動另外兩個 sentinel,只需要修改映射端口和容器名稱
docker run -it -d --name redis-sentinel2 \--network redis-bridge \--ip 172.16.0.21 \-p 26479:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel2-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
docker run -it -d --name redis-sentinel3 \--network redis-bridge \--ip 172.16.0.22 \-p 26579:26379 \-v /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf \-v /home/docker/redis-sentinel/sentinel3-data:/data \redis:7.4.4 \redis-sentinel /etc/redis/sentinel.conf
驗證
-
檢測主從狀態
docker exec -it redis-master redis-cli -a 123456 INFO replication
-
查看 Sentinel 監控
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
docker compose 部署
按照上述步驟,可以完整的部署 docker sentinel 集群,但是需要一個個啟動和配置容器,比較麻煩,因此可以通過 docker compose 來簡化操作。
配置文件使用前邊單個容器部署中的配置。
-
新建 docker compose 配置文件,
vim /home/docker/redis-sentinel/docker-compose.yml
networks:redis-bridge: # 自定義網絡,確保容器互通external: truename: redis-bridgeservices:# 主節點redis-master:image: redis:7.4.4container_name: redis-mastercommand: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.10volumes:- /home/docker/redis-sentinel/redis-master.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/master-data:/dataports:- "6379:6379"# 從節點(2個)redis-slave1:image: redis:7.4.4container_name: redis-slave1command: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.11depends_on:- redis-mastervolumes:- /home/docker/redis-sentinel/redis-salve1.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/salve1-data:/dataports:- "6479:6379"redis-slave2:image: redis:7.4.4container_name: redis-slave2command: redis-server /etc/redis/redis.confnetworks:redis-bridge:ipv4_address: 172.16.0.12depends_on:- redis-mastervolumes:- /home/docker/redis-sentinel/redis-salve2.conf:/etc/redis/redis.conf- /home/docker/redis-sentinel/salve2-data:/dataports:- "6579:6379"# Sentinel節點(3個)redis-sentinel1:image: redis:7.4.4container_name: redis-sentinel1command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.20volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel1-data:/dataports:- "26379:26379"redis-sentinel2:image: redis:7.4.4container_name: redis-sentinel2command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.21volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel2-data:/dataports:- "26479:26379"redis-sentinel3:image: redis:7.4.4container_name: redis-sentinel3command: redis-sentinel /etc/redis/sentinel.confnetworks:redis-bridge:ipv4_address: 172.16.0.22volumes:- /home/docker/redis-sentinel/redis-sentinel.conf:/etc/redis/sentinel.conf- /home/docker/redis-sentinel/sentinel3-data:/dataports:- "26579:26379"
-
啟動集群
docker compose up -d
-
查看容器啟動情況
docker ps
-
進入 master 驗證
docker exec -it redis-master redis-cli -a 123456
-
主從復制驗證
docker exec -it redis-master redis-cli -a 123456 INFO replication
-
查看 sentinel 狀態
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL masters
-
批量 停止/啟動/重起 容器
docker compose stop|start|restart # 也可以停止指定容器 docker compose stop|start|restart redis-salve2
-
清理并重起服務
docker compose stop docker compose rm -f docker compose
測試故障轉移
-
查看原始主節點信息
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
-
停止主節點
docker stop redis-master
-
通過容器查看是否成功停止
docker ps
-
等待10s后,再通過 sentinel 查看是否切換為新的主節點
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
-
登錄到該從節點確認是否可以執行寫入操作
docker exec -it redis-salve2 redis-cli -a 123456
-
最后,再重新啟動 redis-master 節點,確認是否加入集群
docker restart redis-master
r ps
[外鏈圖片轉存中...(img-gimuVGTV-1751711594422)]- 等待10s后,再通過 sentinel 查看是否切換為新的主節點```bash
docker exec -it redis-sentinel1 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
[外鏈圖片轉存中…(img-OWCrEdIU-1751711594422)]
-
登錄到該從節點確認是否可以執行寫入操作
docker exec -it redis-salve2 redis-cli -a 123456
[外鏈圖片轉存中…(img-abF4A76f-1751711594422)]
-
最后,再重新啟動 redis-master 節點,確認是否加入集群
docker restart redis-master