Redis bigkey分析

摘要:
但是,业务使用的Redis服务CPU负载为100%,无法提供外部服务,从而影响整体业务访问。2.2验证和猜测,因为相应版本不支持日志审核功能。在0:00,大量访问这些大密钥的业务请求将不可避免地导致高CPU。Bigkey,顾名思义,是一个值占用了大量内存空间的键。bigkey操作时间的增加将阻止主线程处理其他业务请求。bigkey的存在将导致一个比其他节点大得多的数据碎片。

一 现象

某个业务最近2个月每月1号凌晨0点都有业务高峰,但是业务所使用的 Redis 服务 cpu 负载100% ,无法对外提供服务进而影响整体业务访问。

二 分析

2.1 问题分析

因为该业务使用的是云Redis ,我们通过监控看 CPU,QPS ,带宽。

Redis bigkey分析第1张

Redis bigkey分析第2张

 

出现问题时系统的QPS 大约为 1200 左右,但是对应时刻的出口带宽竟然达到500MB/s ,猜测该业务使用的Redis 有bigkey。

2.2 验证猜测

因为对应的版本暂不支持日志审计功能。让驻场的同学抓取Redis的统计数据,如下

Redis bigkey分析第3张

从统计数据中可以看到top 5 的key 均为大于1MB的可以,而且 第一个hash 类型的key 里面有10w级别的元素。因为Redis的单线程模型,0点时刻业务请求大量访问这些大key 势必造成 CPU 飙高,网卡流量暴涨。

2.3 解决

原因分析到位,剩下的就好办了,对于hash类型的结构,让客户侧的开发对打 key 进行拆分打散。优化之后的单个key 大约88Byte 。等9月1号凌晨观察效果。

三 Redis的 bigkey 有哪些影响

上面分析一个 bigkey的案例,接下来我们看看bigkey到底带来哪些副作用。bigkey 顾名思义是 value 占用的内存空间比较大的key,对于redis而言存在两种类型 :

  1. 字符串类型:value 大小大于特点值比如 5KB 的string 类型的key。
  2. 非字符串/集合类型: 比如存储非常多元素的hash, set ,zset,list类型,如本文案例的存储情况。

对于Redis的维护人员而言,bigkey就是 一个不稳定因素,时不时带稳定性风险。

3.1 影响性能

因为 Redis 单线程的工作机制,主线程处理所有key的增删改查。对bigkey的操作耗时增加将阻塞主线程处理其他业务请求,进而影响整体吞吐量。

3.2 影响带宽

前面的案例即是一个例子,单个key 7MB ,如果每秒100次查询,则带来700MB 的带宽,虽然现在大部分是万兆网卡,业务请求量再大一些,网卡也有被打满的风险。

3.3 数据倾斜

对于分片的redis集群,存在bigkey 会导致单个分片数据量远大于其他节点,整体不均衡。如果一个分片空间容量满了,对系统造成不可访问,而且也不能随意扩容,因为不拆分key的情况下扩容,单个分片还是存在数据倾斜。更惨的是,数据量比较大,那么访问就增加,容易形成热点。热点不都是因为数据倾斜导致,数据倾斜会大概率导致热点。

3.4 影响主从同步

Redis Server 的输出大小通常是不可控制的。存在bigkey的时候,就会产生体积庞大的返回数据。另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送的速率,导致服务器堆积大量消息,从而导致输出缓冲区越来越大,占用过多内存,甚至导致系统崩溃。Redis 通过设置client-output-buffer-limit 来保护系统安全。

Redis bigkey分析第4张

此时如果主从配置 sentinel,sentinel 会让 slave 继续向 master 发起全量同步请求,然后 buffer 又溢出同步失败,如此反复,会形成复制风暴,这会耗费 master 大量的 CPU、内存、带宽资源,也会让 master 产生阻塞的风险。

案例 https://blog.csdn.net/damanchen/article/details/101075757

四 如何解决大key?

其实就是一个字 "拆"。

  1. 对于字符串类型的key,我们通常要在业务层面将value的大小控制在10KB左右,如果value确实很大,可以考虑采用序列化算法和压缩算法来处理,推荐常用的几种序列化算法:Protostuff、Kryo或者Fst。
  2. 对于集合类型的key,我们通常要通过控制集合内元素数量来避免bigKey,通常的做法是将一个大的集合类型的key拆分成若干小集合类型的key来达到目的。

来自 yangyidba公众号

免责声明:文章转载自《Redis bigkey分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Flex :直接显示ToolTip和errorTip(不需要将鼠标移到组件上)TIDB3.0下线tikv节点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

在MAC下使用github

一 安装git 这个咱们就不说了,一般安装xcode都会自带git 如果不知道有没有下载git, 在终端运行$which git 会打印出git的安装路径/usr/local/bin/git,如果未安装,就去问度娘吧! 安装完git后,咱们就来配置ssh 二 配置SSH 1.生成SSH的KEY 在生成ssh公钥前,先查看是否已经存在公钥,默认情况下,用户的...

plsql导出导入 表结构、表数据、存储过程等

导出:首先点击   TOOLS,选择  EXPORT TABLES  选中你需要导出的表,   勾选  “Create tables” 是因为在导入的数据库中没有此表 如果勾选"Drop tables" 而没有勾选 “Create tables” ,而数据库中没有此表,会报表和视图不存在 Output file 为导出的路径   如果你想导的表  数据记录...

openstack之Glance介绍

什么是Glance glance即image service(镜像服务),是为虚拟机的创建提供镜像服务 为什么要有Glance 我们基于openstack是构建基本的Iaas平台对外提供虚机,而虚机在创建的时候必须为其选择操作系统,glance服务器就是为该选择提供不同的系统镜像 Glance的功能 glance服务使用户能够发现,注册,检索虚拟机的镜像,...

NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构

本文摘自《用Python做科学计算》,版权归原作者所有。 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构 一、多维数组的存取 多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下标需要用多个值来表示,NumPy采用组元(tuple)作为数组...

UNIX环境高级编程——网络基础概念

TCP协议分成两个不同的协议:1、网络传输中差错的传输控制协议TCP 2、专门负责对不同网络进行互联的互联网协议IP 网络体系结构概念: 网络体系结构即是指网络的层次结构和每层所使用协议的集合 OSI:(Open System Interconnect Reference Model) ISO:国际标准化组织(International Standard...

C++ STL hash表用法

C++ STL unordered_map用法 在C++11中,unordered_map作为一种关联容器,替代了hash_map,unordered_map的底层实现是hash表,所以被称为无序关联容器。不管是map还是unordered_map都是一种 key-map(value) 映射的容器,提供非常高的查找效率,下面我们来了解unordered_m...