Docker版Redis部署

Updated on with 0 views and 0 comments

Docker版Redis一主两从三哨兵

image.png

一、整体架构

1.1 环境规划

  • 服务器:3台,Docker环境
  • 192.168.1.19:Redis Master + Sentinel
  • 192.168.1.20:Redis Slave + Sentinel
  • 192.168.1.21:Redis Slave + Sentinel
  • Redis端口:6379
  • Sentinel端口:26379
  • Redis密码:Redis@123

1.2 架构说明

  • Redis:1主2从,主写从读,自动全量数据同步
  • Sentinel:3节点哨兵集群,负责监控、自动故障转移、选主
  • 持久化:同时开启RDB+AOF,保障数据不丢失
  • 所有Redis数据挂载宿主机,防止容器删除数据丢失

1.3 统一目录规划(三台机器全部执行)

# 创建统一目录
mkdir -p /data/redis/data
mkdir -p /data/redis/sentinel
mkdir -p /data/redis/backup

# 创建docker内网(三台全部创建)
docker network create redis-net

二、Redis持久化说明

  • RDB:定时快照,用于快速恢复、冷备份
  • AOF:记录所有写命令,防止宕机丢失数据
  • 生产策略:RDB+AOF同时开启
  • 所有持久化文件统一存放:/data/redis/data

三、部署Redis主从

3.1 19.主机(Master)启动命令

docker run -d \
--name redis \
--network redis-net \
-p 6379:6379 \
-v /data/redis/data:/data \
--restart always \
redis:latest \
redis-server \
--requirepass "Redis@123" \
--masterauth "Redis@123" \
--appendonly yes \
--save 60 10

3.2 20.从机(Slave)启动命令

docker run -d \
--name redis \
--network redis-net \
-p 6379:6379 \
-v /data/redis/data:/data \
--restart always \
redis:latest \
redis-server \
--requirepass "Redis@123" \
--masterauth "Redis@123" \
--replicaof 192.168.1.19 6379 \
--appendonly yes \
--save 60 10

3.3 21.从机(Slave)启动命令

docker run -d \
--name redis \
--network redis-net \
-p 6379:6379 \
-v /data/redis/data:/data \
--restart always \
redis:latest \
redis-server \
--requirepass "Redis@123" \
--masterauth "Redis@123" \
--replicaof 192.168.1.19 6379 \
--appendonly yes \
--save 60 10

3.4 校验主从

docker exec -it redis redis-cli -a Redis@123
info replication

主库能看到2个slave,代表主从搭建成功。

四、部署Sentinel哨兵(三台机器相同配置)

4.1 编写sentinel.conf(三台机器全部)

路径:/data/redis/sentinel/sentinel.conf

port 26379
daemonize no
bind 0.0.0.0
sentinel monitor mymaster 192.168.1.19 6379 2
sentinel auth-pass mymaster Redis@123
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

参数解释:quorum=2,三台哨兵至少2个投票才判定下线。

4.2 启动哨兵(三台机器全部执行)

docker run -d \
--name redis-sentinel \
--network redis-net \
-p 26379:26379 \
-v /data/redis/sentinel/sentinel.conf:/etc/redis/sentinel.conf \
--restart always \
redis:latest \
redis-sentinel /etc/redis/sentinel.conf

4.3 校验哨兵

docker exec -it redis-sentinel redis-cli -p 26379
info sentinel

正常显示:1主2从、3个哨兵节点即为成功。

五、业务连接方式

业务禁止硬编码主库IP,直接连接哨兵集群自动获取主库:

  • Sentinel节点列表:192.168.1.19:26379,192.168.1.20:26379,192.168.1.21:26379
  • Master名称:mymaster
  • 密码:Redis@123

5.1 核心答疑

问题:如果其中一台服务器关机,该节点Redis和哨兵同时宕机,程序是否直接报错?

答案:程序完全不受影响,依旧正常运行,原理如下:

  1. 客户端配置的是一整个哨兵节点集群,并非单一哨兵地址;客户端内部自带轮询机制,会随机连接列表内任意可用哨兵。
  2. 举例:192.168.1.19服务器关机,此节点哨兵宕机;客户端连接19哨兵失败后,自动重试连接20、21存活哨兵,不会阻塞业务。
  3. 哨兵集群设计规则:3个哨兵(奇数),最多容忍1台哨兵宕机,剩余2个哨兵满足quorum=2投票阈值,依旧具备故障转移能力。

5.2 错误写法 & 正确写法

错误(禁止使用):程序只配置单个哨兵地址,单点故障直接导致业务无法获取主库地址。

# 错误:只写19单节点,19关机直接GG
spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.1.19:26379

正确(生产强制规范):完整写入3台哨兵节点,实现哨兵层面高可用。

# 正确写法
spring:
  redis:
    sentinel:
      master: mymaster
      nodes:
        - 192.168.1.19:26379
        - 192.168.1.20:26379
        - 192.168.1.21:26379
    password: Redis@123

5.3 补充关键机制

  • 哨兵角色:仅负责地址调度、故障选举,不转发数据流量;业务读写请求直连Redis6379端口,不经过哨兵26379端口。
  • 极端场景:两台服务器同时宕机,集群彻底失效;该架构仅支持单节点故障,无法抵御多节点同时宕机。
  • 故障联动:若宕机节点原本是Redis主库,剩余存活哨兵会自动在两台正常节点中选举新主库,业务无感。

六、数据备份与恢复

6.1 备份原理

  • 哨兵不存业务数据,无需备份数据,仅备份配置文件
  • 所有业务数据全部存在Redis Master,只备份主库即可
  • 数据持久化目录:/data/redis/data(rdb+aof)

6.2 一键备份命令(主库执行)

BAK=$(date +%Y%m%d_%H%M)
tar -zcvf /data/redis/backup/redis_${BAK}.tar.gz /data/redis/data
# 自动清理7天旧备份
find /data/redis/backup -name "redis_*.tar.gz" -mtime +7 -delete

6.3 数据恢复步骤

  1. 停止Redis容器:docker stop redis
  2. 清空旧数据:rm -rf /data/redis/data/*
  3. 解压备份包:tar -zxvf 备份包 -C /data/redis/data
  4. 重启Redis:docker start redis
  5. 哨兵自动识别主从,无需额外配置

七、运维重点总结

  1. 所有Redis必须挂载宿主机目录,禁止容器内部存储;
  2. 必须开启AOF+RDB双持久化,最大限度防止数据丢失;
  3. 主库宕机哨兵5秒内检测,自动选举新主,从库自动重新指向;
  4. 旧主恢复后,自动降级为从库,加入集群;
  5. 业务读写分离:写走master,读分散到两台slave。

标题:Docker版Redis部署
作者:zhongts
地址:http://zhongts.cc:8080/articles/2026/06/13/1781328864257.html