1. Redis集群与Docker的天然契合
Redis Cluster作为Redis官方提供的分布式解决方案,通过数据分片(sharding)实现横向扩展,每个节点存储部分数据,配合主从复制提供高可用性。而Docker作为轻量级容器技术,能够快速部署和隔离应用环境。两者结合的优势在于:
- 环境一致性:Docker镜像确保所有节点运行完全相同的Redis版本和配置
- 资源隔离:每个Redis节点作为独立容器运行,避免端口和文件系统冲突
- 快速部署:通过Docker可以分钟级搭建完整集群环境
- 易于扩展:新增节点只需启动新的容器并加入集群
重要提示:生产环境建议使用host网络模式,这是Redis Cluster官方推荐的Docker部署方式,可避免容器网络带来的额外复杂性。
2. 集群规划与准备工作
2.1 基础环境要求
建议准备至少2台物理机或虚拟机,每台机器配置:
- 2核CPU及以上
- 2GB内存及以上
- 10GB磁盘空间
- Docker 19.03+版本
- 开放6371-6376端口及对应的16371-16376集群总线端口
2.2 集群架构设计
我们采用3主3从架构,数据分片分布在3个主节点,每个主节点有1个从节点作为备份:
code复制节点A(主:6371) —— 节点D(从:6376)
节点B(主:6372) —— 节点E(从:6375)
节点C(主:6373) —— 节点F(从:6374)
3. 详细部署步骤
3.1 配置文件准备
创建配置文件模板redis-cluster.tmpl:
bash复制port ${PORT}
requirepass your_secure_password
masterauth your_secure_password
protected-mode no
daemonize no
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip ${HOST_IP}
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
关键参数说明:
cluster-announce-ip:必须设置为宿主机的真实IPcluster-announce-bus-port:主端口+10000,用于节点间通信requirepass和masterauth:建议设置强密码
3.2 批量创建节点配置
在第一台主机(192.168.1.100)执行:
bash复制for port in {6371..6373}; do
mkdir -p ${port}/{conf,data}
PORT=${port} HOST_IP=192.168.1.100 envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf
done
在第二台主机(192.168.1.101)执行:
bash复制for port in {6374..6376}; do
mkdir -p ${port}/{conf,data}
PORT=${port} HOST_IP=192.168.1.101 envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf
done
3.3 启动Redis容器
使用host网络模式启动容器:
第一台主机:
bash复制for port in {6371..6373}; do
docker run -d --name redis-${port} --net host \
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v $PWD/${port}/data:/data \
redis:6.2 redis-server /usr/local/etc/redis/redis.conf
done
第二台主机:
bash复制for port in {6374..6376}; do
docker run -d --name redis-${port} --net host \
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v $PWD/${port}/data:/data \
redis:6.2 redis-server /usr/local/etc/redis/redis.conf
done
4. 集群初始化与验证
4.1 创建集群
任意节点执行:
bash复制redis-cli -a your_secure_password --cluster create \
192.168.1.100:6371 192.168.1.100:6372 192.168.1.100:6373 \
192.168.1.101:6374 192.168.1.101:6375 192.168.1.101:6376 \
--cluster-replicas 1
执行过程会显示槽分配方案,输入yes确认。
4.2 集群状态检查
bash复制redis-cli -a your_secure_password --cluster check 192.168.1.100:6371
正常输出应显示所有16384个槽位都已分配,类似:
code复制[OK] All 16384 slots covered.
4.3 数据读写测试
bash复制redis-cli -c -a your_secure_password -h 192.168.1.100 -p 6371
> set foo bar
> get foo
观察键值被正确分配到不同节点。
5. 运维与问题排查
5.1 常见问题处理
节点无法加入集群
- 检查防火墙是否开放了节点端口和集群总线端口
- 确认所有节点配置文件中的
cluster-announce-ip设置正确 - 查看容器日志:
docker logs redis-6371
槽位未完全分配
- 手动修复:
redis-cli --cluster fix 192.168.1.100:6371 - 重新分配槽位:
redis-cli --cluster reshard 192.168.1.100:6371
5.2 集群管理命令
- 添加新节点:
redis-cli --cluster add-node new_host:new_port existing_host:existing_port - 移除节点:
redis-cli --cluster del-node host:port node_id - 重新平衡槽位:
redis-cli --cluster rebalance host:port
5.3 备份与恢复
创建备份
bash复制redis-cli -a your_secure_password --cluster backup 192.168.1.100:6371 /path/to/backup.rdb
从备份恢复
- 停止所有Redis容器
- 用备份文件替换各节点的dump.rdb
- 重新启动容器
6. 性能优化建议
-
合理设置内存限制:通过
--memory限制容器内存使用,避免单个节点占用过多资源bash复制
docker run -d --memory 1g --memory-swap 1g ... -
启用持久化:AOF和RDB同时启用可提供更好的数据安全性
code复制appendonly yes appendfsync everysec save 900 1 save 300 10 save 60 10000 -
监控配置:使用Redis自带的监控命令或集成Prometheus监控
bash复制redis-cli -a your_secure_password --stat -
连接池配置:客户端应使用连接池并设置合理的超时时间
-
定期维护:每月执行一次
redis-cli --cluster check和内存碎片整理bash复制
redis-cli -a your_secure_password --cluster check host:port redis-cli -a your_secure_password MEMORY PURGE
这套方案已经在多个生产环境稳定运行,关键是要确保网络配置正确和密码安全。当需要扩展时,可以通过相同方式添加新节点,然后使用reshard命令重新分配槽位。
