1. Redis集群概述与Docker部署优势
Redis集群作为分布式缓存解决方案,通过数据分片(sharding)实现横向扩展,每个分片由主从节点组成,既保证高可用又提升整体吞吐量。传统物理机部署集群需要配置多台服务器,而Docker容器化方案让这一切变得轻量化:
- 环境一致性:容器镜像确保所有节点运行环境完全相同,避免"在我机器上能跑"的经典问题
- 资源隔离:每个Redis实例独占容器,CPU/内存限制防止单个节点耗尽主机资源
- 快速编排:docker-compose或Kubernetes可一键部署完整集群拓扑
- 端口管理:容器网络模型自动处理复杂的端口映射关系
实测在16GB内存的开发机上,用Docker可轻松运行包含6节点(3主3从)的Redis集群,而传统方式至少需要6台虚拟机。
2. 集群规划与节点配置
2.1 集群拓扑设计
采用官方推荐的3主3从架构,数据分片分布在3个主节点,每个主节点配备1个从节点实现故障转移。节点规划如下:
| 节点角色 | 容器名称 | 映射端口 | 数据卷挂载 |
|---|---|---|---|
| Master1 | redis-7001 | 7001 | /data/redis/7001 |
| Slave1 | redis-7002 | 7002 | /data/redis/7002 |
| Master2 | redis-7003 | 7003 | /data/redis/7003 |
| Slave2 | redis-7004 | 7004 | /data/redis/7004 |
| Master3 | redis-7005 | 7005 | /data/redis/7005 |
| Slave3 | redis-7006 | 7006 | /data/redis/7006 |
提示:生产环境建议主从节点分散在不同物理主机,此处演示使用单机多容器
2.2 Redis配置文件模板
每个节点需要独立的redis.conf,关键参数如下:
conf复制port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
dir /data
protected-mode no
使用环境变量动态注入端口号,通过数据卷挂载配置文件:
bash复制for port in {7001..7006}; do
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data
done
3. Docker容器编排实战
3.1 单命令快速启动
使用docker run逐个启动节点(适合调试):
bash复制for port in {7001..7006}; do
docker run -d --name redis-${port} \
-p ${port}:${port} -p 1${port}:1${port} \
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v $PWD/${port}/data:/data \
redis:7.0 redis-server /usr/local/etc/redis/redis.conf
done
注意:1${port}用于集群总线端口,固定为客户端端口+10000
3.2 docker-compose自动化部署
正式环境推荐使用docker-compose.yml:
yaml复制version: '3'
services:
redis-7001:
image: redis:7.0
ports:
- "7001:7001"
- "17001:17001"
volumes:
- ./7001/conf/redis.conf:/usr/local/etc/redis/redis.conf
- ./7001/data:/data
command: redis-server /usr/local/etc/redis/redis.conf
networks:
- redis-cluster-net
# 其他节点配置类似...
networks:
redis-cluster-net:
driver: bridge
启动集群:docker-compose up -d && docker-compose ps
4. 集群初始化与验证
4.1 创建Redis集群
进入任意容器执行集群创建命令:
bash复制redis-cli --cluster create \
172.20.0.2:7001 172.20.0.3:7003 172.20.0.4:7005 \
172.20.0.5:7002 172.20.0.6:7004 172.20.0.7:7006 \
--cluster-replicas 1
关键参数说明:
- 使用Docker内部IP而非127.0.0.1
--cluster-replicas 1表示每个主节点配1个从节点
输入yes确认槽位分配方案
4.2 集群状态检查
bash复制redis-cli -p 7001 cluster nodes | grep master
正常输出应显示3个主节点及其槽位范围:
code复制d186... 172.20.0.2:7001@17001 myself,master - 0 1650000000 1 connected 0-5460
a220... 172.20.0.3:7003@17003 master - 0 1650000000 2 connected 5461-10922
7e12... 172.20.0.4:7005@17005 master - 0 1650000000 3 connected 10923-16383
5. 生产环境优化要点
5.1 内存与持久化配置
在redis.conf中增加:
conf复制maxmemory 2gb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
根据容器内存限制调整maxmemory,建议为容器内存的70%
5.2 集群弹性扩展
添加新主节点:
bash复制redis-cli --cluster add-node 新节点IP:端口 现有节点IP:端口
重新分片:
bash复制redis-cli --cluster reshard 现有节点IP:端口
6. 故障排查手册
6.1 常见错误与解决
| 现象 | 原因分析 | 解决方案 |
|---|---|---|
| CLUSTERDOWN Hash slot not served | 主节点宕机且从节点未接管 | 手动执行failover: redis-cli -p 从节点端口 cluster failover |
| MOVED重定向循环 | 客户端未启用集群模式 | 使用-c参数启动redis-cli |
| 节点显示fail状态 | 心跳检测超时 | 检查容器网络连通性,调整cluster-node-timeout |
6.2 集群数据备份方案
- 在从节点执行BGSAVE生成RDB文件
- 备份所有节点的/var/lib/redis目录
- 记录cluster nodes输出的节点拓扑关系
恢复时先重建集群拓扑,再加载RDB文件。
7. 性能测试与监控
7.1 redis-benchmark压测
bash复制redis-benchmark -p 7001 -t set,get -c 50 -n 100000 --cluster
关键指标解读:
- 单节点QPS应达到8万以上(set+get混合场景)
- 平均延迟应低于2ms
7.2 Prometheus监控配置
在redis.conf中启用:
conf复制loadmodule /usr/lib/redis/modules/redis-prometheus.so
Grafana仪表盘导入ID 7635,监控关键指标:
- 内存使用率
- 键空间命中率
- 集群分区状态
8. 容器化最佳实践
-
资源限制:每个容器设置内存上限
yaml复制deploy: resources: limits: memory: 2G -
健康检查:
yaml复制healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 3 -
日志收集:
bash复制
docker logs -f redis-7001 > redis_7001.log 2>&1 & -
版本升级:
- 逐个替换容器镜像版本
- 使用
redis-cli --cluster check验证数据一致性