一、Redis Cluster核心原理
1.1 为什么需要分布式集群?
单机瓶颈:单实例内存限制(通常不超过64GB)、单点故障风险、QPS瓶颈(约10万/秒)。
高可用需求:通过主从复制实现自动故障转移,确保服务连续性。
横向扩展:动态扩容应对业务增长,支持海量数据存储。
1.2 哈希槽分片机制详解
虚拟槽位分配:
整个集群划分为16384个逻辑槽位(slot),每个键通过
CRC16(key) % 16384
计算所属槽位。槽位均匀分配到各主节点,例如3主节点时,每个节点约5461个槽。
动态重平衡:
新增节点时,通过迁移部分槽实现负载均衡。
节点下线时,槽位迁移到其他存活节点。
客户端路由:
客户端缓存槽位映射表,首次访问可能收到
MOVED
重定向响应。迁移中的槽位返回
ASK
临时重定向,确保数据一致性。
1.3 集群通信协议(Gossip)
节点发现:每个节点维护集群元数据,通过PING/PONG消息广播状态。
故障检测:节点间定期通信,若某节点超时(默认15秒),标记为疑似下线(PFAIL),超过半数节点确认则标记为下线(FAIL)。
自动故障转移:从节点发现主节点FAIL后,发起选举成为新主节点。
二、集群部署全流程
2.1 环境准备
硬件规划建议
最小集群:3主3从(6节点),生产环境建议跨物理机部署。
端口开放:每个节点需开放业务端口(如6379)和集群总线端口(业务端口+10000,如16379)。
目录结构:
/data/redis/ ├── 6379 │ ├── redis.conf │ ├── nodes-6379.conf │ └── appendonly.aof └── 6380 ├── redis.conf ├── nodes-6380.conf └── appendonly.aof
配置文件模板(redis.conf)
port 6379
cluster-enabled yes # 启用集群模式
cluster-config-file nodes-6379.conf # 集群元数据文件
cluster-node-timeout 15000 # 节点超时时间(毫秒)
appendonly yes # 开启AOF持久化
daemonize yes # 后台运行
dir /data/redis/6379 # 数据目录
logfile "/var/log/redis_6379.log" # 日志路径
requirepass yourpassword # 集群密码(可选)
masterauth yourpassword # 主从认证密码(与requirepass一致)
2.2 启动节点
# 启动所有节点
redis-server /path/to/redis_6379.conf
redis-server /path/to/redis_6380.conf
# 检查进程状态
ps aux | grep redis-server
2.3 构建集群
使用redis-cli创建集群
redis-cli --cluster create \
192.168.1.10:6379 192.168.1.11:6380 \
192.168.1.12:6379 192.168.1.13:6380 \
192.168.1.14:6379 192.168.1.15:6380 \
--cluster-replicas 1 \
-a yourpassword # 如果设置了密码
参数解析:
--cluster-replicas 1
:每个主节点配置1个从节点。节点列表顺序:前N个为主节点,后N*replicas个为从节点。
执行过程示例输出
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.11:6380 to 192.168.1.10:6379
Adding replica 192.168.1.13:6380 to 192.168.1.12:6379
Adding replica 192.168.1.15:6380 to 192.168.1.14:6379
M: 3b5f... 192.168.1.10:6379
S: 8d7c... 192.168.1.11:6380 replicates 3b5f...
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
...
[OK] All 16384 slots covered.
三、节点扩缩容实战
3.1 扩容操作
步骤1:添加新主节点
# 新节点配置并启动后,加入集群
redis-cli --cluster add-node 192.168.1.16:6381 192.168.1.10:6379 -a yourpassword
步骤2:迁移槽位
redis-cli --cluster reshard 192.168.1.10:6379 -a yourpassword
交互式提示输入:
迁移槽数量(如1000)
目标节点ID(新主节点)
源节点ID(输入'all'从所有节点平均迁移)
步骤3:添加从节点
redis-cli --cluster add-node 192.168.1.17:6382 192.168.1.10:6379 \
--cluster-slave --cluster-master-id <新主节点ID> -a yourpassword
3.2 缩容操作
步骤1:迁移待删除节点的槽位
redis-cli --cluster reshard 192.168.1.10:6379 -a yourpassword
# 输入源节点ID(待删除节点)、目标节点ID、迁移槽数量
步骤2:删除节点
# 删除从节点
redis-cli --cluster del-node 192.168.1.10:6379 <从节点ID> -a yourpassword
# 删除主节点(需确保槽位已清空)
redis-cli --cluster del-node 192.168.1.10:6379 <主节点ID> -a yourpassword
四、数据分片与迁移监控
4.1 集群状态检查
# 查看节点信息
redis-cli -h 192.168.1.10 -p 6379 -a yourpassword cluster nodes
# 检查槽位覆盖
redis-cli --cluster check 192.168.1.10:6379 -a yourpassword
4.2 键值路由测试
# 启用集群模式连接
redis-cli -c -h 192.168.1.10 -p 6379 -a yourpassword
# 插入测试数据
127.0.0.1:6379> set user:10001 "Alice"
-> Redirected to slot [14982] located at 192.168.1.14:6379
OK
# 查看键所在槽位
127.0.0.1:6379> CLUSTER KEYSLOT user:10001
(integer) 14982
4.3 迁移过程监控
# 查看迁移状态
watch -n 1 'redis-cli -h 192.168.1.10 -p 6379 cluster nodes | grep migrating'
# 查看槽位迁移进度
redis-cli --cluster info 192.168.1.10:6379 -a yourpassword
五、生产环境调优
5.1 性能优化
内存管理:
maxmemory 32gb maxmemory-policy allkeys-lru # 根据业务选择淘汰策略
网络优化:
cluster-node-timeout 5000 # 适当减少超时时间(需权衡故障检测灵敏度) tcp-backlog 512 # 高并发场景增大backlog
持久化配置:
appendfsync everysec # 平衡性能与数据安全 auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
5.2 安全加固
ACL访问控制:
# 创建受限账号 redis-cli -h 127.0.0.1 -p 6379 ACL SETUSER clusteruser on >password +@all ~*
防火墙规则:
# 仅允许集群节点间通信 iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 16379 -j ACCEPT
六、故障排查手册
6.1 常见问题解决
槽位未完全覆盖:
redis-cli --cluster fix 192.168.1.10:6379 -a yourpassword
主从切换失败:
# 手动触发故障转移 redis-cli -h 192.168.1.11 -p 6380 CLUSTER FAILOVER FORCE
节点无法加入集群:
检查防火墙设置
确认所有节点使用相同的密码
验证集群总线端口(主端口+10000)可访问
6.2 关键日志分析
# 查看集群相关日志
grep -E 'Cluster|Node' /var/log/redis_6379.log
# 典型错误信息:
# - Failover auth denied: 故障转移投票失败
# - Marking node as failing: 节点被标记为下线
七、进阶扩展
7.1 跨机房部署
配置调整:
cluster-announce-ip 公网IP # 节点公告地址 cluster-announce-port 6379 cluster-announce-bus-port 16379
拓扑策略:
主节点分散在不同机房
从节点与主节点跨机房部署
7.2 客户端实践
Java客户端示例(Jedis):
JedisCluster jedis = new JedisCluster( new HostAndPort("192.168.1.10", 6379), 5000, // 超时时间 3, // 最大重试 "yourpassword" ); jedis.set("key", "value");
7.3 监控方案
Prometheus监控指标:
redis_cluster_known_nodes
:集群已知节点数redis_cluster_slots_ok
:健康槽位数
告警规则:
槽位覆盖率 < 100% 持续5分钟
主节点数量变化告警
通过本文的实践指南,您将能够从零开始构建高可用的Redis Cluster集群,掌握节点扩缩容、数据迁移等核心运维技能。在生产环境中,建议结合监控系统定期检查集群状态,并通过混沌工程进行故障演练,以确保集群的稳定性和可靠性。