主题切换
Redis分片集群(Cluster集群)
一、分片集群诞生背景
主从+哨兵架构仅能实现读高可用、主节点故障自动切换,无法解决以下两大问题:
- 海量数据存储:所有数据集中在单个主节点,受单机内存上限限制。
- 高并发写入:所有写请求都落到单一主节点,存在写入性能瓶颈。
分片集群采用多主分片模式,分散数据存储与写入压力,同时搭配从节点保障服务高可用。
二、集群架构特征
- 多Master分片:集群包含多个主节点,每个主节点负责一部分数据,实现数据分片存储,完成写请求分布式扩容。
- 主从高可用:每个主节点可挂载多个从节点,主节点宕机后,对应从节点自动晋升为新主节点,依靠节点间心跳完成故障转移。
- 节点互相探活:所有主节点之间通过
PING/PONG心跳包,实时检测彼此运行状态。 - 请求自动转发:客户端可连接集群内任意节点,若当前节点不负责对应Key的哈希槽,会返回
MOVED指令,引导客户端跳转至目标节点。
三、哈希槽(Slot)数据分片规则
1. 基础参数
Redis Cluster 固定划分 16384 个哈希槽,编号范围 0~16383,所有槽位均匀分配至集群内各个主节点。
2. Key路由计算公式
CRC16(Key有效内容) % 16384 = 哈希槽编号,根据计算出的槽号,定位到对应负责的主节点完成数据存取。
3. HashTag 规则
- 普通Key:以完整的Key字符串作为CRC16计算内容。
- 带大括号格式
{aaa}name:仅将大括号内部的aaa作为有效计算内容。 - 作用:实现哈希槽定向,大括号内内容相同的Key会落到同一个哈希槽、同一个主节点,以此支持集群环境下使用Redis事务、管道命令。
四、数据读写流程
- 客户端发起读写命令,连接集群中任意一个节点。
- 节点提取Key的有效内容,通过
CRC16 % 16384计算出对应哈希槽。 - 若该槽位归属当前节点,直接执行命令并返回结果。
- 若槽位归属其他节点,节点返回
MOVED 槽号 ip:port,客户端根据提示重定向访问目标节点。
五、面试高频问题解析
问:Redis Cluster分片集群有什么作用?
答: 一是通过多主节点分片,横向扩展内存容量与写入并发能力,解决单机存储和写性能瓶颈;二是每个主节点搭配从节点,主节点故障可自动切换,保证高可用;三是集群节点互相探活,客户端可连接任意节点访问全量数据。
问:Redis Cluster数据分片原理是什么?
答: 集群一共划分16384个哈希槽并分配给各个主节点。存取数据时,根据Key有效内容做CRC16哈希运算,对16384取模得到哈希槽编号,再路由到对应主节点完成读写。支持HashTag语法,可强制一批Key落到同一节点。
问:Redis Cluster为什么设置16384个哈希槽?
答: 槽位数量兼顾集群元数据传输开销与分片粒度,16384对应2字节范围,节点间同步槽位信息开销低,也是Redis官方规定的固定槽位总数。
问:HashTag的用途是什么?
答: 强制多个关联Key计算出同一个哈希槽,使其存储在同一个主节点。因为Redis事务、管道要求命令执行在同一节点,借助HashTag即可在集群中使用这类功能。
问:客户端连接集群任意节点都能正常读写吗?
答: 可以。若当前节点不负责目标Key的槽位,会返回MOVED重定向指令,客户端跳转至对应节点继续访问。