Skip to content

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.conf

docker-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 17381
port 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 17382
port 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 17384
port 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 17385
port 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 sentinel

springboot配置示例

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
/src/technology/dateblog/2025/10/20251029-docker%E6%90%AD%E5%BB%BAredis%E5%93%A8%E5%85%B5%E9%9B%86%E7%BE%A4.html