切片集群中,数据会按照一定的规则分散到不同的实例上,这样就会导致数据倾斜;
- 数据量倾斜 :实例上的数据分布不均衡,部分实例上的数据特别多
- 数据访问倾斜 : 某个实例上的数据就是热点数据,被频繁的访问
数据量倾斜的成因和应对方法

主要有三个原因:bigkey,Slot 分配不均衡 以及Hash Tag
bigkey
bigkey 的 Value 值很大或者是保存了大量的集合元素,导致数据量的增加和内存消耗增加;而且会阻塞IO 导致其他请求的处理速度降低
解决方案
- 业务层:避免过多的数据放到相同的键中
- 如果是集合类型,可以拆解成多个小的集合类型数据,分散保存在不同的实例上
Slot 分配不均匀
没有均衡的分配Slot,导致大量的数据分配到一个实例上
解决方案
- 规范分配Slot
- 数据迁移
- CLUSTER SETSLOT:使用不同的选项进行三种设置,分别设置Slot要迁入的目标实例,Slot要迁出的源实例,以及Slot所属的实例
- CLUSTER GETKEYSINSLOT :获取某个Slot 中一定数量的可key
- MIGRATE : 把一个key 从源实例迁移到目标实例
实例操作
假设我们要把 Slot 300 从源实例(ID 为 3)迁移到目标实例(ID 为 5)
- 在目标 5 上执行下面的命令,将Slot 300 的源实例设置为 3
CLUSTER SETSLOT 300 IMPORTING 3
- 在目标 3 上执行下面的命令,表示Slot 300 目标实例设置为5
CLUSTER SETSLOT 300 MIGRATING 5
- 从Slot 300 中获取100 个key
CLUSTER GETKEYSINSLOT 300 100
- 把刚才获取的 100 个 key 中的 key1 迁移到目标实例 5 上(IP 为 x.x.x.x),同时把要迁入的数据库设置为 0 号数据库,把迁移的超时时间设置为 timeout
MIGRATE x.x.x.x 6379 key1 0 timeout
- 重复3 、4 直到 所有的Slot中所有的key迁移完成
Hash Tag
Hash Tag 是指加在键值对 key 中的一对花括号{}。这对括号会把 key 的一部分括起来,客户端在计算 key 的 CRC16 值时,只对 Hash Tag 花括号中的 key 内容进行计算。如果没用 Hash Tag 的话,客户端计算整个 key 的 CRC16 的值
一般用在事务操作和范围查询,把相关的数据映射到同一实例
如果使用Hash Tag 带来巨大的访问压力,优先避免数据量的倾斜
数据访问倾斜成因和解决方案
成因:实例上存在热点数据
解决方案:热点数据多副本方法应对,只针对只读数据的热点数据
总结

在构建切片集群时,尽量使用大小配置相同的实例(例如实例内存配置保持相同),这样可以避免因实例资源不均衡而在不同实例上分配不同数量的 Slot
