Redis RDB分析系统

简介

RDB是一款结合自身业务需求研发的Redis RDB 分析工具,基于开源RDR做了二次开发,兼容多云厂商及支持6.0版本,实现了工具化和web平台化两个版本,加入部分公司特性,主要做到了了如下功能:

  • 多维度分析,包含所有key类型的内存占用及数目
  • 趋势分析,基于无过期key的内存占用和数目近15次的趋势(趋势平台版可提供)
  • top分析,自动分析出内存占用top100 key详情(key名称,类型,元素个数,内存占用,过期时间)
  • key前缀统计,根据key的类型分析前缀key占用情况

架构

工具版

 NAME:
rdb - a tool to parse redis rdbfile

USAGE:
rdb.exe [global options] command [command options] [arguments...]

VERSION:
v0.0.1

COMMANDS:
dump dump statistical information of rdbfile to STDOUT
show show statistical information of rdbfile by webpage
keys get all keys from rdbfile
task get from redis quenue task
help, h Shows a list of commands or help for one command

GLOBAL OPTIONS:
--help, -h show help
--version, -v print the version

平台版

Redis RDB分析系统插图

原理

RDB解析

编码格式

 ----------------------------# RDB文件是二进制的,所以并不存在回车换行来分隔一行一行.
52 45 44 49 53 # 以字符串 "REDIS" 开头
30 30 30 33 # RDB 的版本号,比如左边这个表示版本号为0003
----------------------------
FE 00 # FE = FE表示数据库编号,Redis支持多个库,以数字编号,这里00表示第0个数据库
----------------------------# Key-Value 对存储开始了
FD $length-encoding # FD 表示过期时间,过期时间是用 length encoding 编码存储的,后面会讲到
$value-type # 1 个字节用于表示value的类型,比如set,hash,list,zset等
$string-encoded-key # Key 值,通过string encoding 编码,同样后面会讲到
$encoded-value # Value值,根据不同的Value类型采用不同的编码方式
----------------------------
FC $length-encoding # FC 表示毫秒级的过期时间,后面的具体时间用length encoding编码存储
$value-type # 同上,也是一个字节的value类型
$string-encoded-key # 同样是以 string encoding 编码的 Key值
$encoded-value # 同样是以对应的数据类型编码的 Value 值
----------------------------
$value-type # 下面是没有过期时间设置的 Key-Value对,为防止冲突,数据类型不会以 FD, FC, FE, FF 开头
$string-encoded-key
$encoded-value
----------------------------
FE $length-encoding # 下一个库开始,库的编号用 length encoding 编码
----------------------------
... # 继续存储这个数据库的 Key-Value 对
FF ## FF:RDB文件结束的标志

分析逻辑

通过底层解析二级制文件,并对各种数据类型结构解析后,分析模块来进行统计和分析

key前缀统计模块

根据hash、string、list、set、zset等不同类型的key,来统计key的前缀

key内存top模块

根据内存占用的大小进行排序,并取top

key输出模块

将解析出来的key,进行输出

功能

工具版

show

主要是分析完RDB后,会自动在本地起一个web服务,展示分析结果

dump

为分析完RDB后,生成统计分析结果,以json格式打印在控制台

 [{
"CTime": 1615319418,
"CurrentInstance": "test_20210310034843.rdb",
"LargestKeyPrefixes": {
"sortedset": [
{
"Type": "sortedset",
"Key": "test_user",
"Bytes": 249569429,
"Num": 603178
},
]
},
"LargestKeys": [
{
"Key": "test:list:219517294",
"Bytes": 3635240,
"Type": "sortedset",
"NumOfElem": 33383,
"LenOfLargestElem": 8,
"FieldOfLargestElem": "12212223",
"ExpireTime": 0
}],
"MemoryUse": 280592768,
"NoexpireMemUse": 249569429,
"NoexpireNum": 603178,
"TotleBytes": 249569429,
"TotleNum": 603178,
"TypeBytes": {
"sortedset": 249569429
},
"TypeNum": {
"sortedset": 603178
}
}]

keys

为分析完RDB后,将所有的key信息打印到控制台(key名称,类型,元素个数,内存占用,过期时间)

 $ ./dyrdr.exe  keys  hins11858937_data_20210413034010.rdb
key名称:cl:test_1_0 类型:hash 占用内存:127 过期时间:不过期
key名称:v1:test_486_0_0 类型:hash 占用内存:1928 过期时间:不过期
key名称:al:2_2103_2_0 类型:hash 占用内存:127 过期时间:不过期
key名称:a2:cl:2_1399_0_0 类型:hash 占用内存:135 过期时间:不过期
key名称:a1:_v1:3_1212_0_0 类型:hash 占用内存:568 过期时间:不过期
key名称:a2:test:2_1223_0_0 类型:hash 占用内存:441 过期时间:不过期

task

这个是平台涉及,从队列中获取分析任务,解析RDB文件,并将解析结果写入数据库

平台版

Redis RDB分析系统插图1

定时分析

备份系统对实例做完实例备份后,将备份结果信息写入分析队列,RDB分析系统从分析队列中读取任务,并对RDB文件进行解析

实时分析

平台上发起立即分析,会调度备份系统,待备份完成后,通过高优先级级别的队列形式告知RDB系统,然后进行分析

分析结果

Redis RDB分析系统插图2

文章来源于互联网:Redis RDB分析系统

THE END
分享
二维码