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又是缓存技术栈中的一个佼佼者,广泛的应用于各种服务系统中.在大型互联网服务中,每天需要处理的请求和存储的缓存数 ...
- 阿龙学堂-Spark 数据倾斜如何处理
1.处理方式 数据倾斜的问题优先从数据源解决,以下方法是辅助缓解: spark-sql任务,可以尝试distribute by () 某个字段 参考文档调优: https://blog.csdn.ne ...
- 如何应对 Redis 集群的数据倾斜问题
前言 在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存.比如,在使用 Redis Cluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模,同时, ...
- 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例
大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...
- 面试高频题:Hash一致性算法是如何解决数据倾斜问题的?
一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案. 本文将介绍一致性H ...
- sqoop数据倾斜_北京卓越讯通大数据岗位面试题分享
北京卓越讯通面试题 学长1 1)笔试 (1)JAVA支持的数据类型有哪些?什么是自动拆装箱? (2)AtomicInteger和Volatile等线程安全操作的关键字的理解个使用 (3)创建线程有几种 ...
- Spark中Data skew(数据倾斜)Java+Python+Scala三种接口完整代码
起因 代码中shuffle的算子存在的地方,groupByKey.countByKey.reduceByKey.join等 判断一个算子是shuffle算子可以通过[20] 出现的问题有两种 ①大部分 ...
- hive数据倾斜及处理案例
什么是数据倾斜 数据倾斜其实是进行分布式计算的时候,某些节点的计算能力比较强或者需要计算的数据比较少,早早执行完了,某些节点计算的能力较差或者由于此节点需要计算的数据比较多,导致出现其他节点的redu ...
- Hive学习之路 (十九)Hive的数据倾斜
1.什么是数据倾斜? 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 2.Hadoop 框架的特性 A.不怕数据大,怕数据倾斜 B.Jobs 数比较多的作业运行效率相对比较低,如子查询比较 ...
最新文章
- 用于目标检测的半自动视频标注
- windows下搭建hadoop-2.6.0本地idea开发环境
- Zabbix2.4安装和问题总结(一)
- Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
- qq推广 qq在线客服工具
- 系列笔记 | 深度学习连载(4):优化技巧(上)
- C# winform 窗体怎么隐藏标题栏,不显示标题栏
- PWN-PRACTICE-BUUCTF-18
- 分享3段平时很实用的微代码,高手莫喷
- (01)odoo模型中调用窗体动作
- docker hub push_Docker系列-(2) 镜像制作与发布
- 电商扣减库存_电商系统秒杀架构设计
- 移动的宽带真的很垃圾
- 数据分析——如何构建数据指标体系
- 如果你用过这些电子产品 证明你老了
- Python实现消息发送
- phpstorm 突然打开不了了
- Netty,Nginx严重落后;网络IO框架最新性能排名
- 大闹天宫游戏 大闹天宫游戏机详解说明
- 关于欧姆龙PLC-CP1系列输入输出故障分析总结
热门文章
- 麦克风阵列杂音很重解决方案(科大讯飞麦克风阵列+6.0)
- appollo-参考线平滑设定
- 数据结构(C语言版)——顺序栈(代码版)
- Python之判断一个数是否为素数
- Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
- 《零起点,python大数据与量化交易》
- idea为web项目添加tomcat并配置Artifacts
- 广义线性模型--Generalized Linear Models
- MySQL 创建函数入门
- 【国内博客】国内常见的 博客 主页 (IT)