Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685183
  • 博文数量: 186
  • 博客积分: 3044
  • 博客等级: 中校
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-25 15:04
文章分类

全部博文(186)

文章存档

2024年(2)

2022年(4)

2021年(3)

2020年(1)

2019年(5)

2018年(13)

2017年(6)

2016年(10)

2015年(11)

2014年(11)

2013年(13)

2012年(23)

2011年(25)

2010年(2)

2008年(1)

2007年(5)

2006年(51)

分类: NOSQL

2013-11-05 15:26:36


. 前言

解析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

# 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

 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

# 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:
2. redis dump文件规范:
3. redis RDB历史版本:
4. redis-rdb-tools:

. 其他工具Redis-audit 

Redis-audit 是一个用ruby实现的脚本,通过它,我们可以知道每一类 key 对内存的使用量。它可以提供的数据有:某一类 key 值的访问频率如何,有多少值设置了过期时间,某一类 key 值使用内存的大小,这很方便让我们能排查哪些 key 不常用或者压根不用。
项目地址:

如需转载请注明出处:

2015年11月:

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 。



阅读(16355) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~