基本概念
-
数据切片的概念
-
据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模\
-
slot分布在不同实例上
-
-
因为slot的分布可能导致数据倾斜
- 数据量倾斜:实例上的数据分布不均匀,某个实例上数据特别多
- 数据访问倾斜:数据量相差不大,但是存在访问倾斜
数据量倾斜的成因和应对方法
-
基本概念:数据量倾斜,是因为大量数据集中在一个或多个实例上
-
产生的原因:
-
bigkey\
-
Slot 分配不均衡\
-
Hash Tag\
-
bigkey 导致倾斜
-
产生原因:实例中存在bigkey
- bigkey的缺点:造成实例 IO 线程阻塞
-
解决办法:避免将过多数据保存在同一个键值对中
- 如果bigkey是集合类型,可以拆分成很多个小的集合类型数据,分散保存在不同的实例上\
Slot 分配不均衡
-
基本概念
-
Redis Cluster 一共有 16384 个 Slot\
-
codis有1024个slot
-
-
尽量保证实例均匀分配在不同的实例上
-
查看实例分布的指令
- Redis Cluster CLUSTER SLOTS
- codis使用dashboard查看\
-
在Redis Cluster中,使用三个命令完成slot迁移
-
CLUSTER SETSLOT 目标实例 源实例 slot所属实例\
-
CLUSTER GETKEYSINSLOT 获取某个 Slot 中一定数量的 key\
-
MIGRATE 执行具体迁移过程\
-
-
redis CLUSTER\
-
实操
- CLUSTER SETSLOT 300 IMPORTING 3 设置源实例3
- CLUSTER SETSLOT 300 MIGRATING 5 设置目标实例5
- CLUSTER GETKEYSINSLOT 300 100 从实例3中获取100个key 迁出准备
- MIGRATE 192.168.10.5 6379 key1 0 timeout 将刚才的100个迁移到实例5
- 重复3,4步骤即可完成迁移
-
可以一次浅出多个key MIGRATE 192.168.10.5 6379 "" 0 timeout KEYS key1 key2 key3
-
-
codis
- codis-admin --dashboard=ADDR -slot-action --create --sid=300 --gid=6
| ``` 127.0.0.1:6379> cluster slots 1) 1) (integer) 0 2) (integer) 4095 3) 1) "192.168.10.3" 2) (integer) 6379 2) 1) (integer) 12288 2) (integer) 16383 3) 1) "192.168.10.5" 2) (integer) 6379
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
## Hash Tag
- 基本概念:键值对 key 中的一对花括号{},客户端只会对{}内的数据进行计算
- hash tag的好处
- 可以将相同的key储存到一个slot中
- 使用场景
- 为了支持事务操作和范围查询\
- 跨实例不支持的操作
- 建议不要使用hash tag进行数据切片,造成实例不稳定,服务不可用
\
# 数据访问倾斜
- 导致数据访问倾斜的原因是存在热点数据
- 解决办法:可以通过热点数据多副本来应对
- 具体实施:增加随机前缀,让他和其他副本不映射到一个slot中(注意,只适用于只读热点数据,又读又写会导致数据不一致)
\
# 总结
- 造成数据倾斜的原因
- 1数据中存在bigkey
- 2slot手动分配不均
- 3使用了hash tag,导致数据集中在某些实例上
- 尽量使用相同配置的实例
