redis数据倾斜处理方法

 更新时间:2022年12月20日 11:38:54   作者:wang0907  
我们在使用Redis分片集群时,集群最好的状态就是每个实例可以处理相同或相近比例的请求,但如果不是这样,则会出现某些实例压力特别大,而某些实例特别空闲的情况发生,本文就一起来看下这种情况是如何发生的以及如何处理

写在前面

我们在使用Redis分片集群时,集群最好的状态就是每个实例可以处理相同或相近比例的请求,但如果不是这样,则会出现某些实例压力特别大,而某些实例特别空闲的情况发生,本文就一起来看下这种情况是如何发生的以及如何处理。

1:什么是数据倾斜

数据倾斜分为两种,第一种是数据量倾斜,第二种是数据访问倾斜,定义如下:

  • 数据量倾斜:数据分布的不均匀,导致某些实例数据特别多,进而导致处理的请求量大
  • 数据访问倾斜:数据分布均匀,但是某些实例存在热点数据,进而导致处理的请求量大

可以看到不管是数据量倾斜,还是数据访问倾斜,最终导致的结果都是发生倾斜的实例处理了更多的数据请求,压力增大。

2:数据量倾斜

在这里插入图片描述

数据量倾斜最常见的原因就是在手动划分slot时,分配不均匀,除此之外,还有big key,hash tag,分别来看下。

2.1:slot分配不均匀

slot分配不均匀一般是由于手动分配造成,或者是因为某个实例节点配置较高,为了更加充分的利用其计算机资源,有意的给其分配更多的slot,但是这个多出的量其实是不好预估的,所以对于因为计算机性能差异有意分配的造成的slot不均匀还是要尽量避免,即保证所有的实例节点都具有相同的配置,然后将slot进行均匀分配。如果是已经发生了slot分配不均匀,我们可以通过迁移slot的方式来处理,首先通过cluster slots命令查看当前slot的分配情况:

在这里插入图片描述

上图slot0~4095分配到了实例192.168.10.3:6379,slot12288~16383分配到了实例192.168.10.5:6379。如下是一个slot迁移的例子。

假设我们要把 Slot 300 从源实例(ID 为 3)迁移到目标实例(ID 为 5),那要怎么做呢?

第1步,我们先在目标实例5上执行下面的命令,将Slot 300的源实例设置为实例 3,表示要从实例 3 上迁入 Slot 300。

在这里插入图片描述

第2步,在源实例 3 上,我们把 Slot 300 的目标实例设置为 5,这表示,Slot 300 要迁出到实例 5 上,如下所示:

在这里插入图片描述

第3步,从 Slot 300 中获取 100 个 key。因为 Slot 中的 key 数量可能很多,所以我们需要在客户端上多次执行下面的这条命令,分批次获得并迁移 key。

在这里插入图片描述

第4步,我们把刚才获取的 100 个 key 中的 key1 迁移到目标实例 5 上(IP 为 192.168.10.5),同时把要迁入的数据库设置为 0 号数据库,把迁移的超时时间设置为 timeout。我们重复执行 MIGRATE 命令,把 100 个 key 都迁移完。

在这里插入图片描述

最后,我们重复执行第 3 和第 4 步,直到 Slot 中的所有 key 都迁移完成。

从Redis3.0.6开始,你也可以使用KEYS选项,一次迁移多个key(key1、2、3),这样可以提升迁移效率。

在这里插入图片描述

2.2:big key

bigkey,主要包括string的值特别大,和集合类型的元素特别多两种情况,对于string,我们需要在业务上处理,分散到多个key存储,然后在业务上多次获取,并进行合并,比如如下划分:

key:
    names
划分为
key:
    name:1_1000 ... name:100001_101001 

其实这里是用到了分片的思想,对于集合的处理方式和string也是类似的,比如有一个包含100万个元素的hash集合user:info,分片存储后如下:

key: 
    user:info
key: 
    user:info:1_100000,user:info:100001_20000,...,user:info:900001_1000000

对于bigkey我们还是要在业务上尽量避免,因为bigkey的副作用不仅仅如此,还有如数据同步慢,数据恢复慢,删除慢等。

2.3:hash tag

我们正常设置key,计算其slot值的方式是crc16(key)%16384,但是如果是使用了{},比如keypart1:{keypart2},则计算的逻辑就变成了crc16(keypart2)%16384,一般用在希望某几类key分布到同一个实例,进而可以方便的进行某些操作的场景,如事务,简单的计算等,但是一般带来的的负面影响要比收益大的多,比如造成这里分析的数据倾斜问题,数据倾斜影响的是整个Redis实例,影响更大,所以在实践中要尽量避免使用hash tag。

3:数据访问倾斜

在这里插入图片描述

数据访问倾斜出现的场景一般就是热点数据,比如首页的新闻,某明星出轨离婚等爆点新闻,对于这类问题一般有如下的解决方法:

1:拷贝几份数据,以分散到不同的实例
    比如news:1,可以虚拟出几份数据,如news:1:A,news:1:B,...news:1:Z,客户端访问时随机的增加A~Z的后缀,分散压力,这种方法可以用于只读的热点数据
2:增加机器配置
    这种方法是针对读写数据,因为如果是按照方案1,数据的一致性将会带来额外的性能开销,以及更多潜在的bug。

到此这篇关于redis之数据倾斜如何处理的文章就介绍到这了,更多相关redis数据倾斜内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis链表底层实现及生产实战

    Redis链表底层实现及生产实战

    Redis 的 List 是一个双向链表,链表中的每个节点都包含了一个字符串。是redis中最常用的数据结构之一,本文主要介绍了Redis链表底层实现及生产实战,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • redis热key问题怎样解决

    redis热key问题怎样解决

    这篇文章主要介绍了redis热key问题怎样解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Redis增减库存避坑的实现

    Redis增减库存避坑的实现

    在电商平台或者仓库管理系统中,库存的管理是非常重要的一项任务,本文主要介绍了Redis增减库存避坑的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 详解Redis数据结构之跳跃表

    详解Redis数据结构之跳跃表

    这篇文章主要介绍了Redis数据结构中的跳跃表的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)

    redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)

    这篇文章主要介绍了redis的hGetAll函数的性能问题,需要的朋友可以参考下
    2016-02-02
  • 在Ubuntu 14.04系统上备份和恢复Redis数据详细步骤

    在Ubuntu 14.04系统上备份和恢复Redis数据详细步骤

    这篇文章主要给大家介绍了关于在Ubuntu 14.04系统上备份和恢复Redis数据的详细步骤,文中通过代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-04-04
  • redis基本安装判断、启动使用方法示例

    redis基本安装判断、启动使用方法示例

    这篇文章主要介绍了redis基本安装判断、启动使用方法,结合实例形式分析了Redis针对是否安装的判断、启动等使用方法,需要的朋友可以参考下
    2020-02-02
  • 高效异步redis客户端aredis优劣势原理解析

    高效异步redis客户端aredis优劣势原理解析

    这篇文章主要介绍了高效异步redis客户端aredis优劣势原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • redis三种高可用方式部署的实现

    redis三种高可用方式部署的实现

    这篇文章主要介绍了redis三种高可用方式部署的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 详解Redis高效恢复策略内存快照与AOF

    详解Redis高效恢复策略内存快照与AOF

    这篇文章主要为大家介绍了Redis高效恢复策略内存快照与AOF及对比详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论