1. 程式人生 > 實用技巧 >Redis RDB 分析工具 rdbtools 說明(轉載)

Redis RDB 分析工具 rdbtools 說明(轉載)

背景

Redis是基於記憶體的KV資料庫,記憶體作為儲存介質,關注其記憶體的使用情況是一個重要指標,解析其內部的儲存資訊是給出優化方法和維護的最基本要求。解析記憶體有二種方法:第一個是通過scan遍歷所有key,針對每個key進行分析(memory usage);第二個是基於RDB檔案進行所有key的分析(redis-rdb-tools)。本文將介紹如何使用rdbtools工具。

說明

rdbtools工具包括了3個可執行檔案:

rdb  -- 解析整個rdb檔案
redis-memory-for-key -- 解析server裡的單個key
redis-profiler --解析rdb檔案成html格式

rdb是rdbtools工具包其中之一的工具,也是解析dump.rdb檔案的工具:分析記憶體並將資料匯出到JSON,Rdbtools是Redis的dump.rdb檔案的解析器,解析器生成類似於xml。rdbtools提供了以下實用程式:

  1. 生成所有資料庫和鍵中資料的記憶體報告
  2. 將轉儲檔案轉換為JSON
  3. 使用標準差異工具比較兩個轉儲檔案

安裝 rdbtools

前提條件:

  1. 安裝 python-lzf :加快解析速度
    pip install python-lzf
  2. 安裝redis-py:可選,僅在執行測試用例時需要

PyPI安裝(推薦)

pip install rdbtools python-lzf

原始碼安裝

git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
sudo python setup.py install

命令列用法示例

help:

1,rdb --help:解析整個rdb檔案

usage: rdb [options] /path/to/dump.rdb

Example : rdb --command json -k "user.*" /var/redis/6379/dump.rdb

positional arguments:
-- 要處理的dump檔案
  dump_file             RDB Dump file to process       

optional arguments:
-- 幫助
  -h, --help            show this help message and exit  
-- 要處理的命令,-c後的有效引數為:json, diff,justkeys, justkeyvals, memory,protocol 
  -c CMD, --command CMD
                        Command to execute. Valid commands are json, diff,
                        justkeys, justkeyvals, memory and protocol  
-- 輸出檔案       
  -f FILE, --file FILE  Output file
-- 資料庫號,可以提供多個數據庫。如果未指定,則包括所有資料庫。
  -n DBS, --db DBS      Database Number. Multiple databases can be provided.
                        If not specified, all databases will be included.
-- 要匯出的key。這可以是一個正則表示式
  -k KEYS, --key KEYS   Keys to export. This can be a regular expression
-- key不匯出。這可以是一個正則表示式
  -o NOT_KEYS, --not-key NOT_KEYS
                        Keys Not to export. This can be a regular expression
-- 解析的資料型別。可能的值為string,hash,set,sortedset,list。可以輸入多種型別提供。如果未指定,則為所有資料型別
  -t TYPES, --type TYPES
                        Data types to include. Possible values are string,
                        hash, set, sortedset, list. Multiple typees can be
                        provided. If not specified, all data types will be
                        returned
--  將key的記憶體輸出限制為大於或等此值(以位元組為單位)
  -b BYTES, --bytes BYTES
                        Limit memory output to keys greater to or equal to
                        this value (in bytes)
--  將記憶體按大小輸出前N個key                       
  -l LARGEST, --largest LARGEST
                        Limit memory output to only the top N keys (by size)
-- 將字串轉義為編碼:raw(預設),print,utf8或base64。
  -e {raw,print,utf8,base64}, --escape {raw,print,utf8,base64}
                        Escape strings to encoding: raw (default), print,
                        utf8, or base64.
-- 使用command protocol引數,從所有鍵中刪除到期的key                       
  -x, --no-expire       With protocol command, remove expiry from all keys
-- 使用command protocol引數,將N秒新增到key的到期時間
  -a N, --amend-expire N
                        With protocol command, add N seconds to key expiry
                        time

2,redis-memory-for-key --help:-- 解析server裡指定的單個key

Usage: redis-memory-for-key [options] redis-key
Examples :
redis-memory-for-key user:13423
redis-memory-for-key -s localhost -p 6379 user:13423


Options:
-- 幫助
  -h, --help            show this help message and exit
-- 服務地址,預設127.0.0.1
  -s HOST, --server=HOST
                        Redis Server hostname. Defaults to 127.0.0.1
-- 服務埠,預設6379                        
  -p PORT, --port=PORT  Redis Server port. Defaults to 6379
--服務密碼
  -a PASSWORD, --password=PASSWORD
                        Password to use when connecting to the server
-- 資料庫號,預設0
  -d DB, --db=DB        Database number, defaults to 0

3,redis-profiler --help:

Usage: redis-profiler [options] /path/to/dump.rdb

Example 1 : redis-profiler -k "user.*" -k "friends.*" -f memoryreport.html /var/redis/6379/dump.rdb
Example 2 : redis-profiler /var/redis/6379/dump.rdb

Options:
-- 幫助
  -h, --help            show this help message and exit
-- 輸出
  -f FILE, --file=FILE  Output file
-- 組合在一起的鍵。 多個正則表示式
  -k KEYS, --key=KEYS   Keys that should be grouped together. Multiple regexes
                        can be provided

每次執行以上工具時都需要指定一個命令,以指示對解析的RDB資料應執行的操作。 操作有:

轉儲的JSON:

> rdb --command json /var/redis/6379/dump.rdb

[{
"user003":{"fname":"Ron","sname":"Bumquist"},
"lizards":["Bush anole","Jackson's chameleon","Komodo dragon","Ground agama","Bearded dragon"],
"user001":{"fname":"Raoul","sname":"Duke"},
"user002":{"fname":"Gonzo","sname":"Dr"},
"user_list":["user003","user002","user001"]},{
"baloon":{"helium":"birthdays","medical":"angioplasty","weather":"meteorology"},
"armadillo":["chacoan naked-tailed","giant","Andean hairy","nine-banded","pink fairy"],
"aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]

過濾解析:

正則表示式匹配key,並且僅列印鍵和值:

> rdb --command justkeyvals --key "user.*" /var/redis/6379/dump.rdb

user003 fname Ron,sname Bumquist,
user001 fname Raoul,sname Duke,
user002 fname Gonzo,sname Dr,
user_list user003,user002,user001

僅處理資料庫2中hash型別的a開頭的key:

> rdb -c json --db 2 --type hash --key "a.*" /var/redis/6379/dump.rdb

[{},{
"aroma":{"pungent":"vinegar","putrid":"rotten eggs","floral":"roses"}}]

dump檔案轉換為JSON:

輸出是UTF-8編碼的JSON。 預設情況下,回撥嘗試使用UTF-8解析RDB資料,並使用\U表示符轉義非'ASCII可列印'字元,或使用\x轉義非UTF-8可解析的位元組。 嘗試對RDB資料進行解碼可能會導致二進位制資料錯誤,可以通過使用--escape raw選項來避免這種情況。 另一種選擇是使用-e base64進行二進位制資料的Base64編碼。

解析dump檔案並在標準輸出上列印JSON:

> rdb -c json /var/redis/6379/dump.rdb

[{
"Citat":["B\u00e4ttre sent \u00e4n aldrig","Bra karl reder sig sj\u00e4lv","Man ska inte k\u00f6pa grisen i s\u00e4cken"],
"bin_data":"\\xFE\u0000\u00e2\\xF2"}]

將dump檔案解析為原始位元組,並在標準輸出上列印JSON:

> rdb -c json /var/redis/6379/dump.rdb --escape raw

[{
"Citat":["B\u00c3\u00a4ttre sent \u00c3\u00a4n aldrig","Bra karl reder sig sj\u00c3\u00a4lv","Man ska inte k\u00c3\u00b6pa grisen i s\u00c3\u00a4cken"],
"bin_data":"\u00fe\u0000\u00c3\u00a2\u00f2"}]

生成記憶體報告:

使用-c memory 執行會生成CSV報告,其中包含該鍵使用的近似記憶體。 --bytes C 和 --largest N 可用於將輸出限制為大於C位元組的鍵或N個最大鍵。

> rdb -c memory /var/redis/6379/dump.rdb --bytes 128 -f memory.csv
> cat memory.csv

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,lizards,241,quicklist,5,19
0,list,user_list,190,quicklist,3,7
2,hash,baloon,138,ziplist,3,11
2,list,armadillo,231,quicklist,5,20
2,hash,aroma,129,ziplist,3,11

生成的CSV具有以下列:

database:資料庫編號
type:資料型別
key:鍵
size_in_bytes:使用的記憶體:包括鍵,值和任何其他開銷
encoding:RDB編碼型別
num_elements:key中的value的個數
len_largest_element:key中的value的長度
expiry:過期值

注意:記憶體使用情況是近似的。 通常,實際使用的記憶體將略高於報告的記憶體。可以按鍵或資料庫編號或資料型別過濾報告。記憶體報告應有助於檢測由應用程式邏輯引起的記憶體洩漏。 它還將幫助優化Redis的記憶體使用。

查詢單鍵使用的記憶體:

查詢特定鍵使用的記憶體(執行整個記憶體報告非常耗時),使用redis-memory-for-key:

> redis-memory-for-key person:1

> redis-memory-for-key -s localhost -p 6379 -a mypassword person:1

Key             person:1
Bytes                111
Type                hash
Encoding            ziplist
Number of Elements        2
Length of Largest Element    8

比較RDB檔案:

使用--command diff選項,並將輸出通過管道傳遞到標準sort:

> rdb --command diff /var/redis/6379/dump1.rdb | sort > dump1.txt
> rdb --command diff /var/redis/6379/dump2.rdb | sort > dump2.txt

執行差異程式:

> kdiff3 dump1.txt dump2.txt

要限制檔案的大小,可以使用--key選項過濾鍵

使用Redis協議:

使用protocol命令將RDB檔案轉換為redis協議流:

> rdb -c protocol /var/redis/6379/dump.rdb

*4
$4
HSET
$9
users:123
$9
firstname
$8
Sripathi

可以將輸出通過管道傳輸到netcat並重新匯入資料的子集。如果要將資料在兩個Redis例項上共享,則可以使用--key標誌選擇資料的子集,然後將輸出傳遞給正在執行的Redis例項並載入該資料。當輸出列印協議時,--escape選項可以避免出現不可列印/控制字元。

預設情況下,如果過期時間在rdb檔案中存在,則會刪除過去所有過期的鍵。 如果不需要此行為,則使用-x/--no-expire選項將忽略所有關鍵的到期命令。使用-a/--amend-expire選項設定將來的到期時間,該選項會為已設定為到期的每個金鑰的到期時間增加整數秒,不會更改尚未設定有效期的key。

使用解析器(Python):

View Code

測試說明

一、rdb:根據要求分析這個RDB檔案

  1. 按json格式匯出rdb:rdb--commandjsondump.rdb
    View Code
  2. 匯出rdb中的keys:rdb -cjustkeysdump.rdb

    View Code
  3. 匯出rdb中的valuesrdb -cjustkeyvalsdump.rdb
    View Code
  4. 匯出rdb中keys的記憶體分析:rdb -cmemorydump.rdb
    View Code
  5. 按RESP協議匯出RDB內容:rdb -cprotocoldump.rdb
    View Code
  6. 分析RDB結果匯出到檔案:rdb -cmemorydump.rdb-fttt.csv
    View Code
  7. 匯出指定資料庫的keys:rdb -c justkeyvals dump.rdb-n0
    View Code
  8. 匯出匹配(正則)的keys:rdb --command justkeyvals--key".*set*"dump.rdb
    View Code
  9. 不匯出匹配(正則)的keys:rdb --command justkeyvals--not-key".*set*"dump.rdb
    View Code
  10. 匯出指定型別的keys:rdb --command json--typehashdump.rdb
    View Code
  11. 匯出大於指定位元組的keys:rdb --commandmemory--bytes128 dump.rdb
    View Code
  12. 匯出記憶體位元組排名前3個keys:rdb --commandmemory--largest3dump.rdb
    View Code
  13. 匯出指定編碼轉義:rdb --command justkeyvals--escaperawdump.rdb
    View Code
  14. 匯出keys(過期keys除外)rdb --command memory--no-expiredump.rdb
  15. 匯出keys(給過期keys新增時間):rdb --command memory--amend-expire100dump.rdb

以上操作引數可以相互疊加使用,按照實際要求進行組合。並且可以匯出成csv檔案,匯入到資料庫裡進行聚合統計和監控。

二、redis-memory-for-key:檢視指定key的記憶體

檢視指定key的記憶體分析情況:redis-memory-for-key--server=192.168.163.134--port=8379f

View Code

三、redis-profiler:RDB分析生成html

View Code

分析後的效果圖(一部分)如:

總結

通過本文對於rdbtools說明,能夠更好的解析RDB其內部的儲存資訊,從而方便給出優化和維護的建議,關於rdbtools更多的說明可以看官網。

~~~~~~~~~~~~~~~ 萬物之中,希望至美 ~~~~~~~~~~~~~~~ 原文連結https://www.cnblogs.com/zhoujinyi/p/13276697.html