使用 docker-compose 1 分鐘搭建好 1主2從3哨兵的 redis 哨兵集群
目錄結構
redis-sentinel-cluster
├── check_redis.sh
├── docker-compose.yml
├── redis
│ └── redis.conf
├── sentinel
│ └── sentinel.conf
docker-compose.yml 配置
version: '3.8'services:# --- Redis 主節點 ---redis-master:image: redis:7.2container_name: redis-masterhostname: redis-mastercommand: redis-server /usr/local/etc/redis/redis.confports:- "7000:6379"volumes:- ./redis/redis.conf:/usr/local/etc/redis/redis.conf- redis-master-data:/datanetworks:redis-net:ipv4_address: 192.168.80.1# --- Redis 從節點 1 ---redis-slave-1:image: redis:7.2container_name: redis-slave-1hostname: redis-slave-1# 啟動時,指定它復制 redis-mastercommand: redis-server /usr/local/etc/redis/redis.conf --replicaof redis-master 6379ports:- "7001:6379"volumes:- ./redis/redis.conf:/usr/local/etc/redis/redis.conf- redis-slave-1-data:/datanetworks:redis-net:ipv4_address: 192.168.80.2depends_on:- redis-master# --- Redis 從節點 2 ---redis-slave-2:image: redis:7.2container_name: redis-slave-2hostname: redis-slave-2command: redis-server /usr/local/etc/redis/redis.conf --replicaof redis-master 6379ports:- "7002:6379"volumes:- ./redis/redis.conf:/usr/local/etc/redis/redis.conf- redis-slave-2-data:/datanetworks:redis-net:ipv4_address: 192.168.80.3depends_on:- redis-master# --- 哨兵節點 1 ---redis-sentinel-1:image: redis:7.2container_name: redis-sentinel-1hostname: redis-sentinel-1# 使用 sentinel.conf 啟動哨兵模式command: redis-sentinel /usr/local/etc/redis/sentinel.confmem_limit: 256mports:- "27000:26379"volumes:- ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.confnetworks:redis-net:ipv4_address: 192.168.80.4depends_on:- redis-master- redis-slave-1- redis-slave-2# --- 哨兵節點 2 ---redis-sentinel-2:image: redis:7.2container_name: redis-sentinel-2hostname: redis-sentinel-2command: redis-sentinel /usr/local/etc/redis/sentinel.confports:- "27001:26379"volumes:- ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.confnetworks:redis-net:ipv4_address: 192.168.80.5depends_on:- redis-master- redis-slave-1- redis-slave-2# --- 哨兵節點 3 ---redis-sentinel-3:image: redis:7.2container_name: redis-sentinel-3hostname: redis-sentinel-3command: redis-sentinel /usr/local/etc/redis/sentinel.confports:- "27002:26379"volumes:- ./sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.confnetworks:redis-net:ipv4_address: 192.168.80.6depends_on:- redis-master- redis-slave-1- redis-slave-2# 定義網絡,讓所有容器都在同一個網絡下,可以通過服務名互相通信
networks:redis-net:driver: bridgeipam:config:- subnet: 192.168.80.0/20gateway: 192.168.80.255# 定義數據卷,用于持久化 Redis 數據
volumes:redis-master-data:redis-slave-1-data:redis-slave-2-data:
redis/redis.conf 配置
根據實際情況進行密碼修改
# 綁定到所有網絡接口,以便容器間可以互相訪問
bind 0.0.0.0# 開啟保護模式(建議在有密碼時關閉,通過防火墻保護)
protected-mode no# 設置密碼,這是生產環境的最佳實踐,根據實際安全要求進行密碼修改
# 主從和哨兵都需要用這個密碼來認證
requirepass "your_redis_password"# 當本實例作為從節點時,連接主節點所用的密碼
masterauth "your_redis_password"# 開啟 AOF 持久化,保證數據安全
appendonly yes
sentinel/sentinel.conf 配置
# 綁定到所有網絡接口
bind 0.0.0.0# 后臺啟動
#daemonize yes# 哨兵的工作端口
port 26379# 監控名為 'mymaster' 的主節點,其地址是 redis-master:6379
# '2' 是 quorum(法定人數),意味著至少需要 2 個哨兵同意,才能判定主節點下線并觸發故障轉移
# docker-compose 網絡會通過服務名 'redis-master' 解析到正確的容器 IP
sentinel monitor mymaster 192.168.80.1 6379 2# 主節點被判定為主觀下線(SDOWN)所需的毫秒數
# 如果一個哨兵在 5000 毫秒內沒有收到主節點的有效回復,就認為它主觀下線
sentinel down-after-milliseconds mymaster 5000# 故障轉移的超時時間(毫秒)
# 如果一個哨兵在 180000 毫秒內沒有完成對該 master 的故障轉移,
# 其他哨兵可以接替它繼續進行
sentinel failover-timeout mymaster 180000# 在故障轉移后,最多允許多少個從節點同時與新的主節點進行同步
# '1' 是最安全的選擇,可以防止新主節點因大量同步請求而過載
sentinel parallel-syncs mymaster 1# 指定連接 Redis 主從節點所需的密碼
sentinel auth-pass mymaster "your_redis_password"
# 哨兵密碼,根據實際安全要求進行密碼修改
requirepass "your_sentinel_password"
啟動并驗證
啟動
docker-compose up -d
類似如下輸出
[+] Running 7/7? Network redis-sentinel-cluster_redis-net Created 0.2s ? Container redis-master Started 0.7s ? Container redis-slave-2 Started 0.9s ? Container redis-slave-1 Started 0.9s ? Container redis-sentinel-1 Started 1.2s ? Container redis-sentinel-2 Started 1.2s ? Container redis-sentinel-3 Started
查看 啟動狀態
docker-compose ps
類似如下輸出
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
redis-master redis:7.2 "docker-entrypoint.s…" redis-master 5 seconds ago Up 4 seconds 0.0.0.0:7000->6379/tcp, :::7000->6379/tcp
redis-sentinel-1 redis:7.2 "docker-entrypoint.s…" redis-sentinel-1 5 seconds ago Up 3 seconds 6379/tcp, 0.0.0.0:27000->26379/tcp, :::27000->26379/tcp
redis-sentinel-2 redis:7.2 "docker-entrypoint.s…" redis-sentinel-2 5 seconds ago Up 3 seconds 6379/tcp, 0.0.0.0:27001->26379/tcp, :::27001->26379/tcp
redis-sentinel-3 redis:7.2 "docker-entrypoint.s…" redis-sentinel-3 5 seconds ago Up 3 seconds 6379/tcp, 0.0.0.0:27002->26379/tcp, :::27002->26379/tcp
redis-slave-1 redis:7.2 "docker-entrypoint.s…" redis-slave-1 5 seconds ago Up 3 seconds 0.0.0.0:7001->6379/tcp, :::7001->6379/tcp
redis-slave-2 redis:7.2 "docker-entrypoint.s…" redis-slave-2 5 seconds ago Up 3 seconds 0.0.0.0:7002->6379/tcp, :::7002->6379/tcp
驗證集群狀態
./check_redis_sentinel.sh -h 192.168.80.1 -p 6379 -a your_redis_password
類似有如下輸出:
成功連接到 Redis (192.168.80.1:6379)--- 正在檢查單機/主從模式 ---
模式判斷: 主從復制模式 或 單機模式
----------------------------------------
Redis 版本 : 7.2.10
運行時間 : 0 天
已連接客戶端 : 7
使用內存 : 1.29M
當前節點角色 : MASTER
----------------------------------------
節點角色: MASTER
發現 2 個從節點:- slave0:192.168.80.2:6379- slave1:192.168.80.3:6379提示: 如果這是一個由 Sentinel 管理的集群, 請使用 -s <sentinel_port> 參數來獲取詳細的哨兵和主從信息.
./check_redis.sh -h 192.168.80.4 -s 26379 -a your_sentinel_password
類似有如下輸出
--- 正在檢查哨兵 (Sentinel) 模式 ---
成功連接到 Redis (192.168.80.4:26379)
模式判斷: 哨兵 (Sentinel) 模式監控組: mymaster
----------------------------------------
[Master 節點]- 192.168.80.1:6379
[Slave 節點]- 192.168.80.3:6379- 192.168.80.2:6379
[Sentinel 節點]- 192.168.80.6:26379 (284f5f39749c4461097f19df31d6df2b1042f2d9)- 192.168.80.5:26379 (522a29a38455cc8d74e11f05626dd01b4b67d3f1)- 192.168.80.4:26379 (當前連接的節點)
check_redis_sentinel 腳本地址:https://github.com/zhengmingliang/code-fragment/blob/main/shell/linux/redis/check_redis_sentinel.sh
筆記來源
個人博客 docker 1分鐘 快速搭建 redis 哨兵集群 https://alianga.com/articles/docker-redis-sentinel