zoukankan      html  css  js  c++  java
  • 使用rdbtools工具来解析redis rdb文件

    工欲善其事必先利其器,日常工作中,好的工具能够高效的协助我们工作;今天介绍一款用来解析redis rdb文件的工具,非常好用。会之,受用无穷!

      一、rdbtools工具介绍

    源码地址:https://github.com/sripathikrishnan/redis-rdb-tools/

    redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。

    主要有以下三个功能:

    • 生成内存快照

    • 转储成 json 格式

    • 使用标准的 diff 工具比较两个 dump 文件

      二、redis-rdb-tools 安装

    redis-rdb-tools 有两种安装方式,任选其一即可。

    1、使用 PYPI 安装

    [root@VM_54_118_centos redis]# pip install rdbtools

    2、从源码安装

    [root@VM_54_118_centos redis]# git clone https://github.com/sripathikrishnan/redis-rdb-tools.git
    [root@VM_54_118_centos redis]# cd redis-rdb-tools/
    [root@VM_54_118_centos redis-rdb-tools]# python setup.py install

    下面开始使用该工具,执行一个简单的命令

    [root@VM_54_118_centos redis-rdb-tools]# rdb --command json /wjqdata/redis/rdb/dump.rdb > /wjqdata/redis/rdb/dump.json
    WARNING: python-lzf package NOT detected. Parsing dump file will be very slow unless you install it. To install, run the following command:
    pip install python-lzf

    从报错信息看,是由于缺少python-lzf包,根据提示直接使用pip install python-lzf命令进行安装

    解决方法:

    # 在安装python-lzf之前,要安装python-devel依赖包,否则安装会失败
    [root@VM_54_118_centos yum.repos.d]# yum install python-devel

    [root@VM_54_118_centos yum.repos.d]# pip install python-lzf
    DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
    Looking in indexes: http://pypi.douban.com/simple
    Collecting python-lzf
    Downloading http://pypi.doubanio.com/packages/e3/33/b8f67bbe695ccc39f868ae55378993a7bde1357a0567803a80467c8ce1a4/python-lzf-0.2.4.tar.gz
    Installing collected packages: python-lzf
    Running setup.py install for python-lzf ... done
    Successfully installed python-lzf-0.2.4

    好了,安装的工作都已经完成了,下面就是使用语法了:
    Usage: rdb [options] dump.rdb
    Example : rdb –command json -k “user.*” /var/redis/6379/dump.rdb
    Options:
    -h, –help #显示此帮助消息并退出;
    -c FILE, –command=FILE #指定rdb文件;
    -f FILE, –file=FILE #指定导出文件;
    -n DBS, –db=DBS #解析指定数据库,如果不指定默认包含所有;
    -k KEYS, –key=KEYS #指定需要导出的KEY,可以使用正则表达式;
    -o NOT_KEYS, –not-key=NOT_KEYS #指定不需要导出的KEY,可以使用正则表达式;
    -t TYPES, –type=TYPES #指定解析的数据类型,可能的值有:string,hash,set,sortedset,list;可以提供多个类型,如果没有指定,所有数据类型都返回;
    -b BYTES, –bytes=BYTES #限制输出KEY大大小;
    -l LARGEST, –largest=LARGEST #根据大小限制的top key;
    -e ESCAPE, –escape=ESCAPE #指定输出编码,默认RAW;

    转换rdb文件成json格式

    [root@VM_54_118_centos redis-rdb-tools]# rdb --command json /wjqdata/redis/rdb/dump.rdb > /wjqdata/redis/rdb/dump.json

    查看转化后的json文件

      四、生成内存报告

    生成CSV格式的内存报告。包含的列有:数据库ID,数据类型,key,内存使用量(byte),编码。内存使用量包含key、value和其他值。
    注意:内存使用量是近似的。在一般情况下,略低于实际值。可以根据key或数据库ID或数据类型对报告的内容进行过滤。
    内存报告有助于检测是否是应用程序逻辑导致的内存泄露,也有助于优化reids内存使用情况。

    [root@VM_54_118_centos rdb]# rdb -c memory /wjqdata/redis/rdb/dump.rdb --bytes 128 -f /wjqdata/redis/rdb/dump_memory.csv

    输出字段说明:

    database :key在redis的db

    type :key类型

    key :key值

    size_in_bytes :key的内存大小(byte)

    encoding :value的存储编码形式

    num_elements :key中的value的个数

    len_largest_element :key中的value的长度

    expiry :key过期时间

    按键值大小排序

    [root@VM_54_118_centos rdb]# awk -F',' '{print $4,$2,$3,$1}' dump_memory.csv | sort  > dump_memory_csv.sort

    分析内存快照
    直接将CSV的数据导入到MySQL,这样就可以利用sql语句很方便的对Redis的内存数据进行各种分析了,导入方法自行百度。
    数据导入以后,接下来想怎么分析就怎么分析了,举几个简单的例子:

    1、查询key的个数

    select count(*) from dump_memory;

    2、查询总的内存占用

    select sum(size_in_bytes) from dump_memory;

    3、查询内存占用最高的10个key

    select * from dump_memory order by size_in_bytes desc limit 10;

    4、查询value个数1000个以上的list

    select * from dump_memory where type=’list’ and num_elements > 1000;

    通过使用 redis-rdb-tools + mysql的方式,可以方便的对 redis 实例的内存情况进行静态的分析。整个过程也比较简单,获取到 rdb 之后即可。能够帮助排除业务中潜在的风险点,找到业务性能瓶颈。

      五、单个key所使用的内存量

    有时候,需要查询某个key所使用的内存。如果全部导出来在查找将是很愚蠢且耗时的。对于这种情景,可以使用redis-memory-for-key命令。
    redis-memory-for-key需要依赖redis-py包。

    [root@VM_54_118_centos ~]# redis-memory-for-key -s 10.66.179.211 -p 6379 -a crs-pte25xxx:XXXXX name
    Key name
    Bytes 64
    Type string

      六、比较RDB文件

    使用–command diff选项,并通过管道来进行排序。

    [root@VM_54_118_centos rdb]# rdb --command diff /wjqdata/redis/rdb/dump1.rdb | sort > dump1.txt
    [root@VM_54_118_centos rdb]# rdb --command diff /wjqdata/redis/rdb/dump2.rdb | sort > dump2.txt

    使用kdiff3工具来进行比较,kdiff3是图形化的工具,比较直观。kdiff3工具比较两个或三个输入文件或目录。
    安装kdiff3(需要epel源)

    [root@VM_54_118_centos ~]# yum install kdiff3
    [root@VM_54_118_centos rdb]# kdiff3 dump1.txt dump2.txt
  • 相关阅读:
    【转载】Java的JVM原理
    【转载】Java容器的线程安全
    【转载】Java中的容器讲解
    【转载】Java集合容器全面分析
    【转载】Java多线程
    【转载】Java泛型(一)
    09_dubbo服务发布原理
    07_dubbo_compiler
    06_javassist
    05_dubbo_aop
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10598181.html
Copyright © 2011-2022 走看看