使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM