设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间18 现在时间18 缓存数据 凭什么要把我教给你的东西,都给下一个女孩子。

凭什么要把我教给你的东西,都给下一个女孩子。 -- 还是分开

查看: 597|回复: 2

redis数据倾斜处理方法

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
41
主题
37
精华
0
金钱
125
积分
78
注册时间
2023-9-29
最后登录
2025-6-1

发表于 2025-3-12 13:37:15 | 显示全部楼层 |阅读模式

写在前面

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

1:什么是数据倾斜

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

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

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

2:数据量倾斜

1.png

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

2.1:slot分配不均匀

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

2.png

上图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。

3.png

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

4.png

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

5.png

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

6.png

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

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

7.png

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:数据访问倾斜

8.png

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

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

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2025-3-12 16:11:03 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2025-4-2 01:54:09 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表