Redis Sentinel 哨兵集群部署方案
Redis Sentinel 集群部署文档
1. 部署概述
Redis Sentinel 提供高可用的 Redis 主从管理功能,包括:
自动故障转移(Failover)
集群健康监控
客户端主节点地址发现
本部署方案包含:
1 个 Redis 主节点(Master)
1 个 Redis 从节点(Replica)
3 个 Sentinel 节点,负责监控主从节点
所有节点均在同一自定义 Docker 网络下,便于通信。
2. Docker 网络
创建自定义网络:
networks:
base_net:
driver: bridge
所有容器通过 base_net 网络互联。
3. Redis 主从配置
3.1 主节点(Redis Master)
配置文件/命令行示例:
redis-master:
image: redis:7-alpine
container_name: redis-master
command: >
redis-server
--port 6379
--appendonly yes
--protected-mode no
--requirepass 123456
ports:
- "16379:6379"
networks:
- base_net
说明:
--requirepass 123456:客户端访问主节点需要密码--appendonly yes:开启 AOF 持久化--protected-mode no:关闭保护模式,允许外部连接
3.2 从节点(Redis Replica)
redis-replica:
image: redis:7-alpine
container_name: redis-replica
depends_on:
- redis-master
command: >
redis-server
--port 6380
--replicaof redis-master 6379
--masterauth 123456
--requirepass 123456
--protected-mode no
ports:
- "16380:6380"
networks:
- base_net
说明:
--replicaof redis-master 6379:指定主节点--masterauth 123456:从节点访问主节点需要认证--requirepass 123456:客户端访问从节点需要密码
4. Sentinel 节点配置
4.1 Sentinel 配置文件示例(sentinel-26379.conf)
port 26379
sentinel resolve-hostnames yes
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster 123456 # 访问主节点密码
requirepass sentinelStrongPwd # 客户端访问哨兵密码
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
protected-mode no
说明:
auth-pass:哨兵访问主节点密码requirepass:客户端访问哨兵密码resolve-hostnames yes:允许通过主机名访问protected-mode no:关闭保护模式,允许外部访问
4.2 Sentinel 容器部署示例
sentinel-1:
image: redis:7-alpine
container_name: sentinel-1
depends_on:
- redis-master
volumes:
- ./sentinel-26379.conf:/etc/redis/sentinel.conf
command: >
sh -c "
until redis-cli -h redis-master -p 6379 -a 123456 ping; do
echo 'waiting for redis-master...';
sleep 1;
done;
redis-sentinel /etc/redis/sentinel.conf --port 26379
"
ports:
- "26379:26379"
networks:
- base_net
其他 Sentinel 节点(26380、26381)同理,只需修改配置文件和端口。
5. 客户端访问说明
5.1 访问 Redis 主从节点
redis-cli -h <host> -p <port> -a 123456 ping
# 返回 PONG
5.2 访问 Sentinel 节点
redis-cli -h <sentinel_host> -p <sentinel_port> -a sentinelStrongPwd SENTINEL get-master-addr-by-name mymaster
说明:
如果哨兵设置了
requirepass,客户端必须提供密码哨兵命令返回主节点 IP 和端口,便于客户端自动切换
6. 高可用策略
Sentinel 自动监控主节点,当主节点不可用时触发 Failover
从节点提升为主节点,其他 Sentinel 节点更新配置
客户端通过 Sentinel API 获取当前主节点信息,实现透明故障切换
7. 部署注意事项
所有节点建议放在同一 Docker 网络中,保证主从和哨兵通信
Sentinel 的
auth-pass和requirepass密码必须和 Redis 主节点保持一致建议使用 至少 3 个 Sentinel 保证选举稳定
客户端应用应支持 Sentinel 模式连接,自动获取主节点
二、以下是使用docker-compose部署方式
下面是一个 完整的 docker-compose.yml 示例,包含:
Redis 主节点 + 从节点
3 个 Sentinel 节点
Redis 主从密码认证
Sentinel 访问主节点密码 + Sentinel 自身密码认证
启动时等待主节点就绪
下面是示例配置:
version: "3.9"
networks:
base_net:
driver: bridge
services:
# ---------------- Redis 主节点 ----------------
redis-master:
image: redis:7-alpine
container_name: redis-master
command: >
redis-server
--port 6379
--appendonly yes
--protected-mode no
--requirepass 123456
ports:
- "16379:6379"
networks:
- base_net
# ---------------- Redis 从节点 ----------------
redis-replica:
image: redis:7-alpine
container_name: redis-replica
depends_on:
- redis-master
command: >
redis-server
--port 6380
--replicaof redis-master 6379
--masterauth 123456
--requirepass 123456
--protected-mode no
ports:
- "16380:6380"
networks:
- base_net
# ---------------- Sentinel 1 ----------------
sentinel-1:
image: redis:7-alpine
container_name: sentinel-1
depends_on:
- redis-master
volumes:
- ./sentinel-26379.conf:/etc/redis/sentinel.conf
command: >
sh -c "
until redis-cli -h redis-master -p 6379 -a 123456 ping; do
echo 'waiting for redis-master...';
sleep 1;
done;
redis-sentinel /etc/redis/sentinel.conf --port 26379
"
ports:
- "26379:26379"
networks:
- base_net
# ---------------- Sentinel 2 ----------------
sentinel-2:
image: redis:7-alpine
container_name: sentinel-2
depends_on:
- redis-master
volumes:
- ./sentinel-26380.conf:/etc/redis/sentinel.conf
command: >
sh -c "
until redis-cli -h redis-master -p 6379 -a 123456 ping; do
echo 'waiting for redis-master...';
sleep 1;
done;
redis-sentinel /etc/redis/sentinel.conf --port 26380
"
ports:
- "26380:26380"
networks:
- base_net
# ---------------- Sentinel 3 ----------------
sentinel-3:
image: redis:7-alpine
container_name: sentinel-3
depends_on:
- redis-master
volumes:
- ./sentinel-26381.conf:/etc/redis/sentinel.conf
command: >
sh -c "
until redis-cli -h redis-master -p 6379 -a 123456 ping; do
echo 'waiting for redis-master...';
sleep 1;
done;
redis-sentinel /etc/redis/sentinel.conf --port 26381
"
ports:
- "26381:26381"
networks:
- base_net
Sentinel 配置示例(三个节点分别为 26379、26380、26381)
示例文件:sentinel-26379.conf
port 26379
sentinel resolve-hostnames yes
sentinel monitor mymaster redis-master 6379 2
sentinel auth-pass mymaster 123456 # Sentinel 访问主节点密码
requirepass sentinelStrongPwd # 客户端访问 Sentinel 密码
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
protected-mode no
注意:26380、26381 的配置文件类似,只需修改端口号
port。密码保持一致。
🔑 使用说明
- 启动:
docker-compose up -d
- 客户端访问主节点:
redis-cli -h <host> -p 6379 -a 123456 ping
- 客户端访问哨兵:
redis-cli -h <host> -p 26379 -a sentinelStrongPwd SENTINEL get-master-addr-by-name mymaster
- 哨兵自动监控主节点,主节点故障时会自动切换到从节点,并更新 Sentinel 状态。
三、自动生成多哨兵配置文件
自动生成三个 Sentinel 配置文件(26379、26380、26381),并且支持配置:
主节点名称与端口
主节点访问密码
哨兵自身访问密码
哨兵端口
sentinel-gen.sh
#!/bin/bash
# ------------------ 配置参数 ------------------
MASTER_NAME="mymaster" # Redis 主节点名称
MASTER_HOST="redis-master" # Redis 主节点容器/主机名
MASTER_PORT=6379 # Redis 主节点端口
MASTER_PASSWORD="123456" # Redis 主节点密码
SENTINEL_PASSWORD="sentinelStrongPwd" # 哨兵自身访问密码
SENTINEL_PORTS=(26379 26380 26381) # 三个哨兵端口
QUORUM=2 # 哨兵投票数
# 输出目录
OUTPUT_DIR="./"
# --------------------------------------------
for port in "${SENTINEL_PORTS[@]}"; do
FILE="$OUTPUT_DIR/sentinel-$port.conf"
cat > "$FILE" <<EOF
port $port
sentinel resolve-hostnames yes
sentinel monitor $MASTER_NAME $MASTER_HOST $MASTER_PORT $QUORUM
sentinel auth-pass $MASTER_NAME $MASTER_PASSWORD
requirepass $SENTINEL_PASSWORD
sentinel down-after-milliseconds $MASTER_NAME 5000
sentinel failover-timeout $MASTER_NAME 10000
sentinel parallel-syncs $MASTER_NAME 1
protected-mode no
EOF
echo "生成 $FILE 完成"
done
使用方法
保存脚本为
sentinel-gen.sh修改脚本顶部参数:
MASTER_NAME # Redis 主节点名称
MASTER_HOST # Redis 主节点容器名
MASTER_PORT # 主节点端口
MASTER_PASSWORD # 主节点密码
SENTINEL_PASSWORD # 哨兵访问密码
- 运行生成:
chmod +x sentinel-gen.sh
./sentinel-gen.sh
- 脚本会生成三个配置文件:
sentinel-26379.confsentinel-26380.confsentinel-26381.conf
内容已经包含:
监控主节点
主节点密码认证
哨兵自身访问密码
投票、故障检测参数
这样,你的 docker-compose.yml 里的 Sentinel 容器直接挂载生成的配置文件即可,无需手动修改。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu