docker搭建redis哨兵集群
准备工作
目录结构
markdown
redis-sentinel/
├── docker-compose.yml
├── master/
│ ├── conf/redis.conf
│ ├── data/
│ └── logs/
├── slave1/
│ ├── conf/redis.conf
│ ├── data/
│ └── logs/
├── slave2/
│ ├── conf/redis.conf
│ ├── data/
│ └── logs/
└── sentinel/
├── sentinel1.conf
├── sentinel2.conf
└── sentinel3.confdocker-compose.yml
yaml
services:
# Redis 主节点
redis-master:
image: redis:6.2
container_name: redis-master
ports:
- "7381:7381"
- 17381:17381
volumes:
- ./master/conf/redis.conf:/etc/redis/redis.conf
- ./master/data:/data
- ./master/logs:/logs
command: ["redis-server", "/etc/redis/redis.conf"]
networks:
redis-sentinel:
ipv4_address: 172.28.0.10
# Redis 从节点1
redis-slave1:
image: redis:6.2
container_name: redis-slave1
ports:
- "7382:7382"
- 17382:17382
volumes:
- ./slave1/conf/redis.conf:/etc/redis/redis.conf
- ./slave1/data:/data
- ./slave1/logs:/logs
command: ["redis-server", "/etc/redis/redis.conf"]
depends_on:
- redis-master
networks:
redis-sentinel:
ipv4_address: 172.28.0.11
# Redis 从节点2
redis-slave2:
image: redis:6.2
container_name: redis-slave2
ports:
- "7383:7383"
- 17383:17383
volumes:
- ./slave2/conf/redis.conf:/etc/redis/redis.conf
- ./slave2/data:/data
- ./slave2/logs:/logs
command: ["redis-server", "/etc/redis/redis.conf"]
depends_on:
- redis-master
networks:
redis-sentinel:
ipv4_address: 172.28.0.12
# 哨兵节点1
redis-sentinel1:
image: redis:6.2
container_name: redis-sentinel1
ports:
- "7384:7384"
- 17384:17384
volumes:
- ./sentinel/sentinel1.conf:/etc/redis/sentinel.conf
- ./sentinel/logs:/logs
command: ["redis-sentinel", "/etc/redis/sentinel.conf"]
depends_on:
- redis-master
- redis-slave1
- redis-slave2
networks:
redis-sentinel:
ipv4_address: 172.28.0.20
# 哨兵节点2
redis-sentinel2:
image: redis:6.2
container_name: redis-sentinel2
ports:
- "7385:7385"
- 17385:17385
volumes:
- ./sentinel/sentinel2.conf:/etc/redis/sentinel.conf
- ./sentinel/logs:/logs
command: ["redis-sentinel", "/etc/redis/sentinel.conf"]
depends_on:
- redis-master
- redis-slave1
- redis-slave2
networks:
redis-sentinel:
ipv4_address: 172.28.0.21
# 哨兵节点3
redis-sentinel3:
image: redis:6.2
container_name: redis-sentinel3
ports:
- "7386:7386"
- 17386:17386
volumes:
- ./sentinel/sentinel3.conf:/etc/redis/sentinel.conf
- ./sentinel/logs:/logs
command: ["redis-sentinel", "/etc/redis/sentinel.conf"]
depends_on:
- redis-master
- redis-slave1
- redis-slave2
networks:
redis-sentinel:
ipv4_address: 172.28.0.22
networks:
redis-sentinel:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.1各节点配置文件
port 7381
bind 0.0.0.0
daemonize no
pidfile /var/run/redis.pid
logfile "/logs/redis.log"
dir /data
# 持久化配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
# 主从配置
masterauth "123456"
requirepass "123456"
# 集群配置
cluster-enabled no
appendonly yes
appendfilename "appendonly.aof"
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 7381
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 17381port 7382
bind 0.0.0.0
daemonize no
pidfile /var/run/redis.pid
logfile "/logs/redis.log"
dir /data
# 持久化配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
# 主从配置
slaveof 10.1.62.102 7381
masterauth "123456"
requirepass "123456"
# 集群配置
cluster-enabled no
appendonly yes
appendfilename "appendonly.aof"
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 7382
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 17382port 7383
bind 0.0.0.0
daemonize no
pidfile /var/run/redis.pid
logfile "/logs/redis.log"
dir /data
# 持久化配置
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
# 主从配置
slaveof 10.1.62.102 7381
masterauth "123456"
requirepass "123456"
# 集群配置
cluster-enabled no
appendonly yes
appendfilename "appendonly.aof"
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 7383
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 17383# 哨兵服务监听端口(默认26379,这里自定义为7384)
port 7384
# 绑定IP地址(0.0.0.0表示监听所有网络接口)
bind 0.0.0.0
# 以守护进程方式运行(no表示前台运行,适合Docker环境)
daemonize no
# 哨兵进程ID文件路径
pidfile /var/run/redis-sentinel.pid
# 日志文件路径(哨兵日志)
logfile "/logs/sentinel.log"
# 工作目录(用于存储临时文件,如sentinel的配置文件)
dir /tmp
# ================== 哨兵监控配置 ==================
# 监控主节点配置
# mymaster: 自定义主节点标识名(需与后续配置一致)
# 10.1.62.102: 主节点的IP地址(必须是能被哨兵访问的IP)
# 7381: 主节点的端口号(与主节点配置中的port一致)
# 2: 哨兵最低通过票数(quorum),表示需要至少2个哨兵同意才能进行故障转移
sentinel monitor mymaster 10.1.62.102 7381 2
# 设置主节点的认证密码
# mymaster: 与sentinel monitor中定义的标识名一致
# 123456: 主节点的密码(与主节点配置中的requirepass一致)
sentinel auth-pass mymaster 123456
# 主节点主观下线检测时间(毫秒)
# 5000: 如果主节点连续5000毫秒无响应,则标记为主观下线
sentinel down-after-milliseconds mymaster 5000
# 故障转移时并行同步的从节点数量
# 1: 故障转移时,同时最多有1个从节点进行同步(避免主节点负载过高)
sentinel parallel-syncs mymaster 1
# 故障转移超时时间(毫秒)
# 10000: 如果故障转移过程超过10000毫秒未完成,则视为失败
sentinel failover-timeout mymaster 10000
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 7384
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 17384port 7385
bind 0.0.0.0
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile "/logs/sentinel.log"
dir /tmp
sentinel monitor mymaster 10.1.62.102 7381 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 7385
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 17385port 7386
bind 0.0.0.0
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile "/logs/sentinel.log"
dir /tmp
sentinel monitor mymaster 10.1.62.102 7381 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 10000
# 集群节点通告 IP(客户端连接时使用的 IP)
# 重要:必须设置为节点真实公网 IP 或内网 IP
# 注意:如果使用 Docker,需设置为宿主机 IP 或容器网络 IP
cluster-announce-ip 10.1.62.102
# 集群节点通告端口(客户端连接时使用的端口)
# 重要:必须与实际服务端口一致(6381)
cluster-announce-port 7386
# 集群节点通告集群总线端口(节点间通信端口)
# 说明:通常为主端口 + 10000(6381 + 10000 = 16381)
# 重要:必须开放此端口(防火墙/安全组)
cluster-announce-bus-port 17386启动和验证
shell
# 文件权限
chmod -R 777 redis-sentinel
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 检查主从复制状态
docker exec -it redis-master redis-cli -a 123456 info replication
# 检查哨兵状态
docker exec -it redis-sentinel1 redis-cli -p 26379 info sentinelspringboot配置示例
yml
spring:
redis:
password: 123456
database: 0
timeout: 6000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
sentinel:
master: mymaster
nodes:
- 10.1.62.102:7384
- 10.1.62.102:7385
- 10.1.62.102:7386