使用redis-rdb-tools分析reids的rdb文件內存使用情況

前言

解析redis的dump.rdb文件,分析內存,以JSON格式導出數據。提供的功能有:
1. 生成內存報告
2. 轉儲文件到JSON
3. 使用標準的diff工具比較兩個dump文件
Rdbtools是以python語言開發的。

安裝

2.1 前提條件
1. python2.4以上版本 和 pip
2. redis-py可選,只運行在測試用例下
2.2 從PyPI安裝(推薦)

#/usr/local/python/bin/easy_install pip
#/usr/local/python/bin/pip install rdbtools

2.3 從源碼包安裝

# wget https://github.com/sripathikrishnan/redis-rdb-tools/archive/master.zip 
# unzip master
# cd redis-rdb-tools-master/
# python setup.py install
Downloading/unpacking rdbtools
Downloading rdbtools-0.1.5.tar.gz

轉換dump文件到JSON

# /usr/local/python/bin/rdb --help
Usage: rdb [options] /path/to/dump.rdbExample : rdb --command json -k "user.*" /var/redis/6379/dump.rdb
Options:
-h, --help              show this help message and exit
-c FILE, --command=FILE 要執行的命令json 或 diff
-f FILE, --file=FILE    輸出文件名
-n DBS, --db=DBS        數據庫ID。可以提供多個數據庫。如果沒有指定,包含所有數據庫。
-k KEYS, --key=KEYS     導出鍵。可以是正則表達式。
-t TYPES, --type=TYPES  數據類型。可能的值有:string, hash, set, sortedset, list。 可以提供多個類型。如果沒有指定,所有數據類型都返回。

3.1 解析dump文件並以JSON格式標準輸出

# /usr/local/python/bin/rdb --command json /data/redis_data/6379/dump.rdb


3.2 只解析符合正則的keys

# /usr/local/python/bin/rdb --command json --key "sences_2.*" /data/redis_data/6379/dump.rdb


3.3 只解析以“a”爲開頭的hash且位於數據庫ID爲2的

# /usr/local/python/bin/rdb --command json --db 2 --type hash --key "a.*" /data/redis_data/6379/dump.rdb

生成內存報告

生成CSV格式的內存報告。包含的列有:數據庫ID,數據類型,key,內存使用量(byte),編碼。內存使用量包含key、value和其他值。
注意:內存使用量是近似的。在一般情況下,略低於實際值。
可以根據key或數據庫ID或數據類型對報告的內容進行過濾。
內存報告有助於檢測是否是應用程序邏輯導致的內存泄露,也有助於優化reids內存使用情況。

可以使用--help中,有一個命令查詢前多少個key佔內存最大,具體是哪個命令忘了

# /usr/local/python/bin/rdb -c memory /data/redis_data/6379/dump.rdb > redis_memory_report.csv
內容如下所示:
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,string,"ot_0_3b0703c01015ce05f76ef4b977dc020e820d0692",351,string,184,184
0,hash,"sences_98558",1703,hashtable,10,132
0,hash,"sences_170989",1698,hashtable,10,138
0,hash,"sences_34233",1673,hashtable,10,115
0,hash,"sence_messages2_favor_32783",358,ziplist,7,51

單個key所使用的內存量

有時候,需要查詢某個key所使用的內存。如果全部導出來在查找將是很愚蠢且耗時的。對於這種情景,可以使用redis-memory-for-key命令。
如果出現下面信息,需要安裝redis模塊。redis-memory-for-key依賴redis-py包。

Traceback (most recent call last):
File "/usr/local/python/bin/redis-memory-for-key", line 8, in
load_entry_point('rdbtools==0.1.5', 'console_scripts', 'redis-memory-for-key')()
from redis import StrictRedis
ImportError: No module named redis
######################################################
# /usr/local/python/bin/pip install redis
或
# /usr/local/python/bin/easy_install redis
# /usr/local/python/bin/redis-memory-for-key --help
Usage: redis-memory-for-key [options] redis-key
Examples :redis-memory-for-key user:13423
redis-memory-for-key -h localhost -p 6379 user:13423
Options:
-h, --help            show this help message and exit
-s HOST, --server=HOSTRedis Server hostname. Defaults to 127.0.0.1
-p PORT, --port=PORT  Redis Server port. Defaults to 6379
-a PASSWORD, --password=PASSWORDPassword to use when connecting to the server
-d DB, --db=DB        Database number, defaults to 0

實例如下:

# /usr/local/python/bin/redis-memory-for-key -s 10.1.242.124   sence_167989
Key                             "sence_167989"
Bytes                           2712.0
Type                            hash
Encoding                        hashtable
Number of Elements              15
Length of Largest Element       222

比較RDB文件

使用–command diff選項,並通過管道來進行排序。

# /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump1.txt
# /usr/local/python/bin/rdb --command diff /data/redis_data/6379/dump.rdb | sort > dump2.txt
# diff dump1.txt dump2.txt

使用kdiff3工具來進行比較,kdiff3是圖形化的工具,比較直觀。kdiff3工具比較兩個或三個輸入文件或目錄。
安裝kdiff3

# rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm 
# yum install kdiff3
# kdiff3 dump1.txt dump2.txt

使用解析器

import sys
from rdbtools import RdbParser, RdbCallback
class MyCallback(RdbCallback) :
    ''' 
    Simple example to show how callback works.        
    See RdbCallback for all available callback methods.        
    See JsonCallback for a concrete example    
    '''
    def set(self, key, value, expiry):
        print('%s = %s' % (str(key), str(value)))
    def hset(self, key, field, value):
        print('%s.%s = %s' % (str(key), str(field), str(value)))
    def sadd(self, key, member):
        print('%s has {%s}' % (str(key), str(member)))
    def rpush(self, key, value) :
        print('%s has [%s]' % (str(key), str(value)))
    def zadd(self, key, score, member):
        print('%s has {%s : %s}' % (str(key), str(member), str(score)))
callback = MyCallback()
parser = RdbParser(callback)
parser.parse('/var/redis/6379/dump.rdb')

其他資源

1. FAQ:https://github.com/sripathikrishnan/redis-rdb-tools/wiki/FAQs
2. redis dump文件規範: https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
3. redis RDB歷史版本: https://github.com/sripathikrishnan/redis-rdb-tools/blob/master/docs/RDB_Version_History.textile
4. redis-rdb-tools:https://github.com/sripathikrishnan/redis-rdb-tools

---------------------------------------

原文地址:https://blog.csdn.net/jiangsanfeng1111/article/details/53523581

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章