写在前面

我们在使用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之数据倾斜如何处理相关推荐

  1. redis中数据倾斜问题的产生和解决方案

    在服务端系统服务开发中,缓存是一种常用的技术,它可以提高系统对请求的处理效率,而redis又是缓存技术栈中的一个佼佼者,广泛的应用于各种服务系统中.在大型互联网服务中,每天需要处理的请求和存储的缓存数 ...

  2. 阿龙学堂-Spark 数据倾斜如何处理

    1.处理方式 数据倾斜的问题优先从数据源解决,以下方法是辅助缓解: spark-sql任务,可以尝试distribute by () 某个字段 参考文档调优: https://blog.csdn.ne ...

  3. 如何应对 Redis 集群的数据倾斜问题

    前言 在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存.比如,在使用 Redis Cluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模,同时, ...

  4. 大数据技术之_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. ...

  5. 面试高频题:Hash一致性算法是如何解决数据倾斜问题的?

    一致性Hash是一种特殊的Hash算法,由于其均衡性.持久性的映射特点,被广泛的应用于负载均衡领域,如nginx和memcached都采用了一致性Hash来作为集群负载均衡的方案. 本文将介绍一致性H ...

  6. sqoop数据倾斜_北京卓越讯通大数据岗位面试题分享

    北京卓越讯通面试题 学长1 1)笔试 (1)JAVA支持的数据类型有哪些?什么是自动拆装箱? (2)AtomicInteger和Volatile等线程安全操作的关键字的理解个使用 (3)创建线程有几种 ...

  7. Spark中Data skew(数据倾斜)Java+Python+Scala三种接口完整代码

    起因 代码中shuffle的算子存在的地方,groupByKey.countByKey.reduceByKey.join等 判断一个算子是shuffle算子可以通过[20] 出现的问题有两种 ①大部分 ...

  8. hive数据倾斜及处理案例

    什么是数据倾斜 数据倾斜其实是进行分布式计算的时候,某些节点的计算能力比较强或者需要计算的数据比较少,早早执行完了,某些节点计算的能力较差或者由于此节点需要计算的数据比较多,导致出现其他节点的redu ...

  9. Hive学习之路 (十九)Hive的数据倾斜

    1.什么是数据倾斜? 由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点 2.Hadoop 框架的特性 A.不怕数据大,怕数据倾斜 B.Jobs 数比较多的作业运行效率相对比较低,如子查询比较 ...

最新文章

  1. 用于目标检测的半自动视频标注
  2. windows下搭建hadoop-2.6.0本地idea开发环境
  3. Zabbix2.4安装和问题总结(一)
  4. Struts2-整理笔记(三)结果处理跳转、获得servletAPI原生
  5. qq推广 qq在线客服工具
  6. 系列笔记 | 深度学习连载(4):优化技巧(上)
  7. C# winform 窗体怎么隐藏标题栏,不显示标题栏
  8. PWN-PRACTICE-BUUCTF-18
  9. 分享3段平时很实用的微代码,高手莫喷
  10. (01)odoo模型中调用窗体动作
  11. docker hub push_Docker系列-(2) 镜像制作与发布
  12. 电商扣减库存_电商系统秒杀架构设计
  13. 移动的宽带真的很垃圾
  14. 数据分析——如何构建数据指标体系
  15. 如果你用过这些电子产品 证明你老了
  16. Python实现消息发送
  17. phpstorm 突然打开不了了
  18. Netty,Nginx严重落后;网络IO框架最新性能排名
  19. 大闹天宫游戏 大闹天宫游戏机详解说明
  20. 关于欧姆龙PLC-CP1系列输入输出故障分析总结

热门文章

  1. 麦克风阵列杂音很重解决方案(科大讯飞麦克风阵列+6.0)
  2. appollo-参考线平滑设定
  3. 数据结构(C语言版)——顺序栈(代码版)
  4. Python之判断一个数是否为素数
  5. Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
  6. 《零起点,python大数据与量化交易》
  7. idea为web项目添加tomcat并配置Artifacts
  8. 广义线性模型--Generalized Linear Models
  9. MySQL 创建函数入门
  10. 【国内博客】国内常见的 博客 主页 (IT)