redis-rdb-tools 解析 reids dump文件及内存使用量
redis-rdb-tools 是一个开源的解析redis快照文件dump.rdb的工具,解析出dump.rdb文件后可以用来做数据分析,redis数据恢复或者写入到其他key-value缓存系统中。
官网: https://github.com/sripathikrishnan/redis-rdb-tools (github)
下载安装
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
sudo python setup.py install
一. 前言
解析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 Running setup.py egg_info for package rdbtools warning: no files found matching 'README.textile' Installing collected packages: rdbtools Running setup.py install for rdbtools warning: no files found matching 'README.textile' Installing redis-memory-for-key script to /usr/local/python/bin Installing redis-profiler script to /usr/local/python/bin Installing rdb script to /usr/local/python/bin Successfully installed rdbtools Cleaning up...
三. 转换dump文件到JSON
# /usr/local/python/bin/rdb --help Usage: rdb [options] /path/to/dump.rdb Example : 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内存使用情况。
# /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 <module> 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=HOST Redis Server hostname. Defaults to 127.0.0.1 -p PORT, --port=PORT Redis Server port. Defaults to 6379 -a PASSWORD, --password=PASSWORD Password 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
九. 其他工具Redis-audit
Redis-audit 是一个用ruby实现的脚本,通过它可以知道每一类 key 对内存的使用量。
它可以提供的数据有:某一类 key 值的访问频率如何,有多少值设置了过期时间,某一类 key 值使用内存的大小,这很方便让我们能排查哪些 key 不常用或者压根不用。
项目地址:https://github.com/snmaynard/redis-audit
十. redis info
Redis Info 命令以一种易于理解和阅读的格式,返回关于 Redis 服务器的各种信息和统计数值。
通过给定可选的参数 section ,可以让命令只返回某一部分的信息
-
server : 一般 Redis 服务器信息,包含以下域:
- redis_version : Redis 服务器版本
- redis_git_sha1 : Git SHA1
- redis_git_dirty : Git dirty flag
- os : Redis 服务器的宿主操作系统
- arch_bits : 架构(32 或 64 位)
- multiplexing_api : Redis 所使用的事件处理机制
- gcc_version : 编译 Redis 时所使用的 GCC 版本
- process_id : 服务器进程的 PID
- run_id : Redis 服务器的随机标识符(用于 Sentinel 和集群)
- tcp_port : TCP/IP 监听端口
- uptime_in_seconds : 自 Redis 服务器启动以来,经过的秒数
- uptime_in_days : 自 Redis 服务器启动以来,经过的天数
- lru_clock : 以分钟为单位进行自增的时钟,用于 LRU 管理
-
clients : 已连接客户端信息,包含以下域:
- connected_clients : 已连接客户端的数量(不包括通过从属服务器连接的客户端)
- client_longest_output_list : 当前连接的客户端当中,最长的输出列表
- client_longest_input_buf : 当前连接的客户端当中,最大输入缓存
- blocked_clients : 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
-
memory : 内存信息,包含以下域:
- used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位
- used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量
- used_memory_rss : 从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
- used_memory_peak : Redis 的内存消耗峰值(以字节为单位)
- used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值
- used_memory_lua : Lua 引擎所使用的内存大小(以字节为单位)
- mem_fragmentation_ratio : used_memory_rss 和 used_memory 之间的比率
- mem_allocator : 在编译时指定的, Redis 所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。
附 redis info
113.157.178.10:6379> info # Server redis_version:2.8.19 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:4000f0ce8178a032 redis_mode:standalone os:Linux 2.6.32-431.23.3.el6.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.7 process_id:1245 run_id:816e8fe58c0dbc33b752c7bffe22253048b9068f tcp_port:6379 uptime_in_seconds:8618158 uptime_in_days:99 hz:10 lru_clock:10055011 config_file:/etc/redis.conf # Clients connected_clients:7898 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:242120536 used_memory_human:230.90M used_memory_rss:224858112 used_memory_peak:336010440 used_memory_peak_human:320.44M used_memory_lua:35840 mem_fragmentation_ratio:0.93 mem_allocator:jemalloc-3.6.0 # Persistence loading:0 rdb_changes_since_last_save:9889 rdb_bgsave_in_progress:0 rdb_last_save_time:1469672574 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:2 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:34802059 total_commands_processed:920643760 instantaneous_ops_per_sec:105 total_net_input_bytes:70943445090 total_net_output_bytes:3419509780814 instantaneous_input_kbps:7.43 instantaneous_output_kbps:3.22 rejected_connections:0 sync_full:449 sync_partial_ok:0 sync_partial_err:0 expired_keys:7589570 evicted_keys:0 keyspace_hits:37615633935 keyspace_misses:965374215 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:8921 # Replication role:master connected_slaves:0 master_repl_offset:28552603186 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:28551554611 repl_backlog_histlen:1048576 # CPU used_cpu_sys:36844.75 used_cpu_user:1187510.00 used_cpu_sys_children:3047.75 used_cpu_user_children:26595.40 # Keyspace db0:keys=277446,expires=0,avg_ttl=0 db1:keys=7,expires=6,avg_ttl=29256612
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2016-08-08 05:04:17
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!