37 | 数据分布优化:如何应对数据倾斜?

288 阅读3分钟

基本概念

  • 数据切片的概念

    • 据都会先按照 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进行数据切片,造成实例不稳定,服务不可用

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/46750430c11c4614899c28fda0f54f8b~tplv-k3u1fbpfcp-zoom-1.image)\


# 数据访问倾斜

-   导致数据访问倾斜的原因是存在热点数据
-   解决办法:可以通过热点数据多副本来应对
-   具体实施:增加随机前缀,让他和其他副本不映射到一个slot中(注意,只适用于只读热点数据,又读又写会导致数据不一致)

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/32a4b3d2527649b2bbf4d602e0b4e4fe~tplv-k3u1fbpfcp-zoom-1.image)\


# 总结

-   造成数据倾斜的原因

    -   1数据中存在bigkey
    -   2slot手动分配不均
    -   3使用了hash tag,导致数据集中在某些实例上

-   尽量使用相同配置的实例

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ed293b5fcfd64499a658e79e60c229e6~tplv-k3u1fbpfcp-zoom-1.image)