
1.数据倾斜
切片集群中,数据会按照一定的算法分布在slot上,而slot会分配到集群中每个redis实例上,而这个时候就会产生数据倾斜。
数据倾斜分为两类:
- 数据量倾斜:某个实例上的数据量远大于其他实例
- 数据访问倾斜:某个实例上数据量相差不大,但是某个实例都是存储的热点数据,访问的非常频繁
2.数据倾斜的原因和解决措施
2.1.数据量倾斜
-
原因一:bigke导致数据倾斜,bigkey的value过大,导致数据倾斜
解决措施:如果bigkey是集合类型,就将bigkey进行拆分为不同的一些小集合,再分散到每个实例上
-
原因二:Slot分配不均衡,进行slot分配时,将过多的slot分配到某个实例
解决措施:使用下面的命令完成数据迁移:
- CLUSTER SETSLOT:使用不同的选项进行三种设置,分别是设置Slot要迁入的目标实例,Slot要迁出的源实例,以及Slot所属的实例。
- CLUSTER GETKEYSINSLOT:获取某个Slot中一定数量的key。
- MIGRATE:把一个key从源实例实际迁移到目标实例。
例如:假设我们要把Slot 300从源实例(ID为3)迁移到目标实例(ID为5),那要怎么做呢
第1步,我们先在目标实例5上执行下面的命令,将Slot 300的源实例设置为实例3,表示要从实例3上迁入Slot 300。
CLUSTER SETSLOT 300 IMPORTING 3
第2步,在源实例3上,我们把Slot 300的目标实例设置为5,这表示,Slot 300要迁出到实例5上,如下所示:
CLUSTER SETSLOT 300 MIGRATING 5
第3步,从Slot 300中获取100 个key。因为Slot中的key数量可能很多,所以我们需要在客户端上多次执行下面的这条命令,分批次获得并迁移key。
CLUSTER GETKEYSINSLOT 300 100
第4步,我们把刚才获取的100个key中的key1迁移到目标实例5上(IP为192.168.10.5),同时把要迁入的数据库设置为0号数据库,把迁移的超时时间设置为timeout。我们重复执行MIGRATE命令,把100个key都迁移完。
MIGRATE 192.168.10.5 6379 key1 0 timeout
最后,我们重复执行第3和第4步,直到Slot中的所有key都迁移完成。
从Redis 3.0.6开始,你也可以使用KEYS选项,一次迁移多个key(key1、2、3),这样可以提升迁移效率。
MIGRATE 192.168.10.5 6379 "" 0 timeout KEYS key1 key2 key3
-
原因三:hash tag 导致数据倾斜
Hash Tag是指加在键值对的一对花括号,客户端在计算Slot时候会根据花括号中的key计算CRC的值
例如:假设key是user:profile:3231,我们把其中的3231作为Hash Tag,此时,key就变成了user:profile:{3231}。当客户端计算这个key的CRC16值时,就只会计算3231的CRC16值
解决措施:使用hash tag的场景往往都是涉及到范围查询,或者事务相关的,这里不建议使用hash tag,可以在代码中进行事务处理
2.2.访问量倾斜
数据访问量倾斜往往都是由于hot key导致,这里我们可以考虑hot key是否涉及写的场景,如果只有只读场景的话,我们可以将hot key的key拷贝多分,通过key的设置散列到多个实例,如果有读的场景就不能这样做了。
