1 需求
服务在面临机器故障重启或组件进程故障需要具备快速侦测恢复机制,减少人工干预冗长流程,提高服务可用性。
Redis中的数据结构对服务的性能有着举足轻重的影响,如果大key较多,容易形成性能瓶颈,甚至降低业务稳定性。提供内存分析功能,分析数据中存在的 大key,用户可以根据分析结果优化内存,有利于保持服务的稳定和高效。
2 需求分析
根据大key分析需求描述可以将需求细化为以下几点:
- 用户可以在前端页面查看分析结果,可以点击按钮手动提交大key分析任务
- 缓存后端服务对实例数据进行分析
- 分析结果中包含key名,数据类型、数据长度、最大数据大小、db number
- 分析过程中实例的影响尽可能降低。
3 需求方案
3.1 方案概述
常规情况下有以下几种办法分析某个Redis实例的大key:
- redis-cli 原生自带 –bigkeys 功能,可以找到某个实例 5种数据类型(String、hash、list、set、zset)的最大key。
- 通过redis-rdb-tools工具对rdb文件进行分析,找到其中的大KEY。
3.2 redis-cli --bigkeys
3.2.1 分析原理
使用scan命令去遍历所有的键,对每个键根据其类型执行"STRLEN","LLEN","SCARD","HLEN","ZCARD"这些命令获取其长度或者元素个数。
3.2.2 优缺点
- 线上使用:虽然scan命令通过游标遍历建空间并且在生产上可以通过对从服务执行该命令,但毕竟是一个线上操作。
- set,zset,list以及hash类型只能获取有多少个元素。但其实元素多的不一定占用空间大, 统计出的最大key只有string类型是以字节长度为衡量标准的。list,set,zset等都是以元素个数作为衡量标准,不能说明其占的内存就一定多。所以,如果Key主要以string类型存在,这种方法就比较适合。
- 这种方式只能获取到各种数据类型最大的一个key, 不能完全满足获取指定数量较大key的需求。
3.3 Redis rdb tools
redis-rdb-tools是一个基于Python的RDB文件解析工具,主要有以下三个功能:
- 解析rdb文件,生成内存快照;
- 将RDB文件中的数据转换为JSON格式;
- 对比两个RDB文件,发现差异。
3.3.1 分析原理
工具通过分析rdb file中的key及value,反算出该kv在内存中的大小。计算时充分考虑了数据类型的影响,key本身长度的影响,内存分配等多种因素。虽然得出的大小不是真实值,但用于key大小的比较是完全可以的。
rdb的功能不仅于此,它还可以将kv导成json格式,也可以按正则表达式只导出部分key
下方截图中是使用rdb命令分析rdb文件的前20个最大的key。可以看到返回的分析结果中包含 database,类型,key,大小,编码,过期时间等信息,完全满足需求。
3.3.2 优缺点
优点:
由于是解析rdb文件,而不是对内存中的实例数据直接操作,对实例运行的影响相对很小。
输出的信息包括数据类型,key、内存大小、编码类型、过期时间等。Rdb工具优点在于获取的key信息详细、可选参数多、支持定制化需求,结果信息可选择json或csv格式,后续处理方便。
缺点:
分要全量分析需dump全新的rdb文件,不适用实时分析。但是在我们的缓存redis组件中有定时自动全量备份和aof文件超过200M自动备份两种机制,所以在绝大多数情况下,可以直接分析自动备份的rdb文件。
3.4 推荐方案
如果key主要以string类型存在,可以使用--bigkeys方式,比较简单。
如果要做到比较完善,分析比较准确和完善,推荐rdbtools 方式。rdbtools方式分析rdb文件, 对运行实例的性能影响较小。
4. 具体实现方案
4.1 用户操作
用户在在公里平台前端页面导航到大key分析页面,页面到监控实例获取分析数据。获取到的数据展示在表格中,展示维度至少包括,key、数据类型、大小和db等数据。
如果没有获取到数据,用户可以手动点击立即分析,提交分析任务。任务执行过程中,用户可以点击刷新,尝试获取最新的分析结果。
上图表中的数据从监控实例中获取,如果监控实例中没有数据则显示为空。监控实例中的数据按实例的维度以list的结构保存,list的每一项保存的数据为大key分析的执行结果,包含db number,类型,key,大小,编码方式,元素数量,最大元素长度,过期时间等字段。数据来源于对rdb文件的分析结果。
4.2 数据分析和保存
用户点击立即分析按钮,提交分析任务,后台对各redis节点最新的rdb文件执行分析操作,按照固定数据格式将结果存储至监控实例;
由于各节点rdb文件不是全量数据,对需要更精确的结果可结合手动备份提示用户先备份再提交分析任务,需要限制用户每天提交任务频率和次数。
在监控实例上,以实例名为key,维护一个有序集合,将个实例节点的分析结果插入到集合中,集合长度维护在指定长度以内。
返回结果的数据格式如下,字段以逗号分隔,连成一个字符串。
key | DB number | 类型 | 编码 | 大小 | 元素数量 | 最大元素大小 | 过期时间 | 实例节点 |
5 附录
5.1 Bigkeys方式
使用redis-cli加—bigkeys参数即可
5.2 rdb tool
- 离线安装插件
如果是python2.7以上的环境,则自带pip,因此不需要第1、2两步。
- 安装setuptools,下载地址,不安装的话后续安装pip会报错,解压后进入目录,执行命令:
python setup.py install
- 安装pip,文件下载地址,解压后进入目录,执行命令:
python setup.py install
- 安装rdbtools依赖,文件下载地址
pip install redis-3.3.11-py2.py3-none-any.whl
- 安装rdbtools,文件下载地址
pip install --no-index -f ./ rdbtools-0.1.14.tar.gz
以上步骤已经在保定资源池实例主机172.31.204.23上验证通过。
完成以上步骤,即可在实例主机上安装rdbtools,可以使用rdb-tools分析rdb文件,了解当前实例节点的内存状况。
- 使用rdb命令分析rdb文件
rdb -c memory -l 20 /root/redis/redis-2.8.24/src/dump.rdb