Redis集群的核心是数据分片,使用16384个哈希槽(hash slot)来分配数据,每个节点负责一部分槽位。当客户端写入数据时,通过CRC16(key) % 16384计算槽位,找到对应节点。集群模式下,主节点处理读写,从节点只负责高可用,主从复制异步进行。一旦某个主节点故障,从节点会自动提升为主节点,继续服务。集群要求至少3个主节点,每个主节点至少一个从节点,确保高可用。遇到的坑:网络分区时,可能出现脑裂,Redis集群使用gossip协议选举集群状态,多数派胜出。
1. Redis集群的架构原理
Redis Cluster将数据分片存储在多个Redis节点上,每个节点负责一部分数据和对应的哈希槽。客户端通过MOVED和ASK重定向访问正确节点。集群节点间通过TCP bus端口(默认+10000)进行gossip通信,交换信息、故障检测。故障转移:节点发现主节点不可达,发送FAIL消息,从节点竞争超时时间(节点数*150ms+随机延迟),获胜者广播PONG提升为主。
2. Redis集群的搭建步骤
创建6个配置文件,每个实例指定cluster-enabled yes、cluster-config-file nodes.conf、cluster-node-timeout 15000。启动6个Redis实例,先逐个redis-cli --cluster create ip:port ... --cluster-replicas 1自动分配槽位。验证:redis-cli -c -p 7000 cluster nodes,cluster info。扩容:cluster add-node新节点,cluster reshard重新分配槽位,手动或自动。
3. Redis集群的常见故障及处理
槽位不均衡:使用cluster reshard手动迁移槽。节点下线:cluster forget强制移除,cluster del-node删除。脑裂:确保网络稳定,调整cluster-node-timeout避免误判。数据丢失:开启AOF/RDB持久化,主从复制延迟监控。客户端连接:使用集群模式客户端如JedisCluster,处理重定向。
4. Redis集群与哨兵模式的区别
哨兵模式是主从复制+自动故障转移,但不分片,所有数据在一个主节点,适合小规模高可用。集群模式内置分片和高可用,无需哨兵,支持海量数据。哨兵有单点瓶颈,集群去中心化。实际选择:数据量大用集群,小数据或读多写少用哨兵。
5. 生产环境Redis集群优化
节点数:至少3主3从,生产建议6+。超时调优:cluster-node-timeout 15s~60s,根据网络。内存:预分配,避免swap。监控:Prometheus+Grafana,关注槽分布、复制延迟。安全:cluster-requirepass密码,外部防火墙。管道化批量操作提升性能。
6. 面试高频题:Redis集群如何保证强一致性?
Redis集群是最终一致性,不是强一致。异步复制可能丢失数据(少数派故障)。可用性优先(CAP理论AP)。若需强一致,可结合Lua脚本原子性、WATCH乐观锁,但集群跨槽事务不支持多键操作。
FAQ
Q: Redis集群支持事务吗?
A: 单节点支持MULTI/EXEC,集群只支持单槽多键,跨槽用SCAN分批或Pipeline。
Q: 如何迁移Redis集群到新集群?
A: 先同步槽配置,reshard迁移数据,逐步切换客户端。
Q: 集群节点内存不均怎么处理?
A: 监控hash-tag使用,避免热点key;定期reshard均衡。
Q: Redis集群最大节点数?
A: 理论1000个,实际100个以内稳定。