4. Redis 容器化部署:单机、主从、哨兵模式

本章聚焦于使用 Docker 部署 Redis 的三种经典架构:单机、主从复制与哨兵高可用。核心要点包括配置文件挂载、数据持久化卷映射以及容器间网络通信。通过容器化手段,开发者可以在本地快速复现生产级缓存拓扑,为后续的缓存一致性闭环调试奠定基础设施。

4.1 部署模式对比与选型

模式 节点数 数据冗余 自动故障转移 适用场景
单机 1 无 无 开发测试、低风险缓存
主从 ≥2(1主N从) 有(从节点备份) 无(需手动切换) 读写分离、数据备份
哨兵 ≥3(1主2从+3哨兵) 有 有(哨兵选举新主) 生产高可用、自动故障恢复
选型建议: 单机模式适合本地调试;主从模式适合需要读扩展的场景;哨兵模式是生产环境的最低高可用配置,至少需要 3 个哨兵实例防止脑裂。

4.2 单机模式部署

单机模式是最简单的部署形态,重点在于配置文件挂载与数据持久化。以下命令启动一个 Redis 容器,将宿主机自定义配置与数据目录映射到容器内。

# 创建配置与数据目录
mkdir -p /data/redis/conf /data/redis/data

# 写入最小配置 redis.conf
cat << 'EOF' > /data/redis/conf/redis.conf
bind 0.0.0.0
port 6379
daemonize no
logfile ""
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfilename "appendonly.aof"
EOF

# 启动单机 Redis
docker run -d \
  --name redis-standalone \
  -p 6379:6379 \
  -v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
  -v /data/redis/data:/data \
  redis:7.2-alpine \
  redis-server /usr/local/etc/redis/redis.conf
关键参数说明:
-v 挂载配置文件,确保容器重启后配置不变;
-v /data 持久化 RDB/AOF 文件,防止数据随容器删除而丢失;
appendonly yes 开启 AOF 持久化,保证数据安全性。

4.3 主从模式部署

主从模式通过 REPLICAOF 指令实现数据复制。以下示例部署 1 个主节点和 2 个从节点,使用自定义 Docker 网络隔离通信。

# 创建网络
docker network create redis-net

# 启动主节点
docker run -d \
  --name redis-master \
  --network redis-net \
  -p 6380:6379 \
  -v /data/redis/master/conf:/usr/local/etc/redis \
  -v /data/redis/master/data:/data \
  redis:7.2-alpine \
  redis-server --appendonly yes

# 启动从节点1
docker run -d \
  --name redis-slave1 \
  --network redis-net \
  -p 6381:6379 \
  -v /data/redis/slave1/conf:/usr/local/etc/redis \
  -v /data/redis/slave1/data:/data \
  redis:7.2-alpine \
  redis-server --appendonly yes --replicaof redis-master 6379

# 启动从节点2
docker run -d \
  --name redis-slave2 \
  --network redis-net \
  -p 6382:6379 \
  -v /data/redis/slave2/conf:/usr/local/etc/redis \
  -v /data/redis/slave2/data:/data \
  redis:7.2-alpine \
  redis-server --appendonly yes --replicaof redis-master 6379
注意: 从节点默认是只读模式(slave-read-only yes),写入操作会被拒绝。主从复制是异步的,主节点宕机后从节点不会自动提升为主。
Redis 主从复制架构 主节点 (Master) redis-master:6379 从节点1 (Slave) redis-slave1:6379 从节点2 (Slave) redis-slave2:6379 REPLICAOF REPLICAOF 数据流向:主节点写入 → 异步复制到所有从节点,从节点提供读服务

4.4 哨兵模式部署

哨兵模式在主从基础上增加监控与自动故障转移能力。需要部署 1 个主节点、2 个从节点和 3 个哨兵实例(哨兵数量建议为奇数)。

4.4.1 哨兵配置文件

# sentinel.conf
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
sentinel resolve-hostnames yes
参数解读:
mymaster 是主节点逻辑名称;
2 表示至少 2 个哨兵同意主节点下线才执行故障转移;
down-after-milliseconds 5000 表示 5 秒无响应即判定主观下线。

4.4.2 启动哨兵容器

# 创建哨兵配置目录
mkdir -p /data/redis/sentinel1/conf /data/redis/sentinel2/conf /data/redis/sentinel3/conf

# 复制哨兵配置到各目录(略,实际需分别修改端口或使用相同配置)

# 启动哨兵1
docker run -d \
  --name redis-sentinel1 \
  --network redis-net \
  -p 26379:26379 \
  -v /data/redis/sentinel1/conf/sentinel.conf:/usr/local/etc/redis/sentinel.conf \
  redis:7.2-alpine \
  redis-sentinel /usr/local/etc/redis/sentinel.conf

# 启动哨兵2、3(命令类似,仅容器名与端口不同)
高可用验证: 手动停止主节点容器(docker stop redis-master),观察哨兵日志,约 10-15 秒后哨兵会选举其中一个从节点提升为新主节点,应用端通过哨兵获取新主地址即可继续写入。
Redis 哨兵高可用架构 主节点 (Master) redis-master:6379 从节点1 (Slave) redis-slave1:6379 从节点2 (Slave) redis-slave2:6379 哨兵1 sentinel1:26379 哨兵2 sentinel2:26379 哨兵3 sentinel3:26379 故障转移流程:哨兵检测主节点下线 → 选举 Leader 哨兵 → 从从节点中选举新主节点 → 更新所有哨兵配置 → 通知客户端新主地址(需客户端支持哨兵协议)

4.5 持久化策略与配置挂载最佳实践

持久化方式 文件 触发条件 恢复速度 数据安全性
RDB dump.rdb 定时快照(如 save 900 1) 快 可能丢失最后一次快照后的数据
AOF appendonly.aof 每写命令追加(everysec/always) 慢(需重放命令) 高(可配置每秒同步,最多丢1秒数据)
混合 两者结合 RDB做全量基座 + AOF增量 中等 高(Redis 4.0+ 默认推荐)
配置挂载原则:
• 配置文件使用 -v 宿主机路径:容器路径 绑定挂载,便于版本管理;
• 数据目录使用 Docker 卷(docker volume create)或绑定挂载,确保容器重建后数据不丢失;
• 生产环境建议将配置文件放入 Git 仓库,通过 CI/CD 分发到各宿主机。

4.6 部署验证与常用调试命令

# 验证主从复制状态
docker exec redis-slave1 redis-cli -p 6379 INFO replication

# 验证哨兵状态
docker exec redis-sentinel1 redis-cli -p 26379 SENTINEL masters

# 查看主节点角色
docker exec redis-master redis-cli -p 6379 ROLE

# 手动触发故障转移(测试用)
docker exec redis-sentinel1 redis-cli -p 26379 SENTINEL failover mymaster
快速检查清单:
1. 所有容器是否处于 Up 状态(docker ps);
2. 从节点 master_link_status:up 表示复制正常;
3. 哨兵 sentinel masters 输出中 flags 字段为 master 表示主节点健康;
4. 写入主节点一条数据,在从节点能立即查询到。