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),写入操作会被拒绝。主从复制是异步的,主节点宕机后从节点不会自动提升为主。
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 秒后哨兵会选举其中一个从节点提升为新主节点,应用端通过哨兵获取新主地址即可继续写入。
4.5 持久化策略与配置挂载最佳实践
| 持久化方式 | 文件 | 触发条件 | 恢复速度 | 数据安全性 |
|---|---|---|---|---|
| RDB | dump.rdb | 定时快照(如 save 900 1) | 快 | 可能丢失最后一次快照后的数据 |
| AOF | appendonly.aof | 每写命令追加(everysec/always) | 慢(需重放命令) | 高(可配置每秒同步,最多丢1秒数据) |
| 混合 | 两者结合 | RDB做全量基座 + AOF增量 | 中等 | 高(Redis 4.0+ 默认推荐) |
配置挂载原则:
• 配置文件使用
• 数据目录使用 Docker 卷(
• 生产环境建议将配置文件放入 Git 仓库,通过 CI/CD 分发到各宿主机。
• 配置文件使用
-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. 所有容器是否处于
2. 从节点
3. 哨兵
4. 写入主节点一条数据,在从节点能立即查询到。
1. 所有容器是否处于
Up 状态(docker ps);2. 从节点
master_link_status:up 表示复制正常;3. 哨兵
sentinel masters 输出中 flags 字段为 master 表示主节点健康;4. 写入主节点一条数据,在从节点能立即查询到。