作为现在web应用开发的黄金搭档,Redis正被广泛应用于存储session信息、权限信息、交易作业等热数据。但是Redis的数据可视化不便、数据查看维护困难、Redis状态监控、运维不易等问题也是我们经常会遇到的问题。作为一名性能测试人员,在工作当中不可避免会碰到系统使用Redis数据库。Redis的功能和性能非常出色,考虑篇幅问题,本文将会对Redis和常见的监控工具进行简单的介绍,后面有机会再分享Redis特性及性能相关的内容。
一、简要介绍
Redis(http://Redis.io)是一款开源的、高性能的键-值存储(key-value store),它是用ANSIC来编写。Redis的项目名是Remote Dictionary Server的缩写,但它常被称作是一款数据结构服务器(data structureserver)。Redis的键-值可以包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和有序集合(sorted sets)等数据类型。对这些数据类型可以执行原子操作,例如:对字符串进行附加操作(append)、递增哈希中的值、向列表中增加元素、计算集合的交集、并集与差集等。
为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。根据使用场景的不同,可以每隔一段时间将数据集转存到磁盘上来持久化数据,或者在日志尾部追加每一条操作命令。
Redis同样支持主-从复制(master-slave replication),并且具有非常快速的非阻塞首次同步(non-blockingfirst synchronization)、网络断开自动重连等功能。同时Redis还具有其它一些特性,其中包括简单的check-and-set机制、pub/sub和配置设置等,以便使得Redis能够表现得更像缓存(cache)。此外,Redis还提供了丰富的客户端,以便支持现阶段流行的大多数编程语言。 Redis内部结构图如下所示:
各功能模块说明如下:
File Event:处理文件事件(在多个客户端中实现多路复用,接受它们发来的命令请求(读事件),并将命令的执行结果返回给客户端(写事件);
Time Event:时间事件(更新统计信息,清理过期数据,附属节点同步,定期持久化等);
AOF:命令日志的数据持久化;
RDB:实际的数据持久化;
Lua Environment :Lua 脚本的运行环境。 为了让 Lua 环境符合 Redis 脚本功能的需求,Redis 对 Lua 环境进行了一系列的修改,包括添加函数库、更换随机函数、保护全局变量等等;
Command table(命令表):在执行命令时,根据字符来查找相应命令的实现函数;
Share Objects(对象共享):主要存储常见的值:a.各种命令常见的返回值,例如返回值OK、ERROR、WRONGTYPE等字符;
b.小于redis.h/REDIS_SHARED_INTEGERS(默认1000)的所有整数。通过预分配的一些常见的值对象,并在多个数据结构之间共享对象,程序避免了重复分配的麻烦。也就是说,这些常见的值在内存中只有一份;
Databases:Redis数据库是真正存储数据的地方。当然,数据库本身也是存储在内存中的。一个数据库,在内存中的数据结构如下图所示:
Redis对于Linux是官方支持,普通使用按照官方指导即可安装成功,这里对于Redis安装本文不再详述。下面介绍一下Redis监控方面的内容。
二、Reids监控
性能测试当中,尤其是针对Redis的性能测试,如和做好Redis监控是至关重要的,redis自带有命令行的监控工具,也有一些基于这些命令行而还发的工具,其中一些是具有图形界面的,这里主要介绍以下四个监控工具。
1. redis-faina
redis-faina是由Instagram开发并开源的一个Redis查询分析小工具。Instagram团队曾经使用PGFouine来作为其PostgreSQL的查询分析工具,他们觉得Redis也需要一个类似的工具来进行query分析工作,于是开发了redis-faina。 redis-faina是通过Redis的MONITOR命令来实现的,通过对在Redis上执行的query进行监控,统计出一段时间的query特性。下面就是其使用方法简介:
下载使用:
测试结果如下:
统计的内容有Overall Stats(总体统计数据)、Top Prefixe(按key前缀统计)、Top Keys(操作最频繁的key)、Top Command(执行最多的命令)、Command Time(microsecs)(命令执行时长)、Heaviest Commands(microsecs)(耗时最多的命令)、Slowest Calls(最慢的命令)。
图中展示了一些实时的数据,从上面结果我们可以看到对Redis的操作规律,比如针对哪些key在进行操作,进行了什么操作,这些操作的效率如何等相关有用信息。
由于Redis的MONITOR 也对性能有所影响,所以建议在使用时不要一直开启MONITOR来分析。可以采用定时抽样一段时间来做样本分析推荐使用,但redis版本必须大于2.4。
2. redisLive
RedisLive是一款用Python编写的Redis图形监控工具安装Redis图形监控工具既然RedisLive由Python编写,那么Python环境是必不可少的,一般Linux默认都安装了Python,如需安装或者更新网上提供很多教程。RedisLive的原理很简单,就是通过监控脚本来利用Redis提供的MONITOR命令从被监控Redis实例中获取数据并存储到Redis的监控实例中来做数据分析。RedisLive以可视化的方式展示了Redis实例中的数据,分析查询模式和峰值。
下载安装使用:
在浏览器中输入:http://10.20.111.188:8888/index.html 即可看到下图。
上图中监控数据不多,下面给出一张官网的效果图。
一个web界面,可以同时监控多个redis实例,做集中监控比较好。
3. redis-stat
Redis-stat用Ruby写成的监控Redis的程序,本身基于Redis的info命令封装而成。通常来说,不会像基于MONITOR命令的监控工具一样,对Redis本身有性能上的影响。redis-stat可以监控Redis的实例,一方面可以像vmstat一样,把状态信息从终端输出,另一方面也可以通过基于嵌入式的web server使用dashboard页面查看状态信息。
运行环境安装:
redis-stat安装:
redis-stat的具体用法:
redis-stat的命令行模式:
redis-stat的web模式:
效果图如下:
运行web模式:
在浏览器中输入 http://10.20.111.188:8080/ 结果如下:
此工具既有命令行又有web界面,可以放到后台运行,ruby开发的,数据比redis-live感觉直观 ,唯一的缺点是如果同时监控多个redis实例,不能单独显示每一个实例的数据信息,貌似是总和。
4. redis-monitor
monitor是一个调试命令,用JAVA编写的,返回服务器处理的每一个命令,它有助于我们了解在数据库上发生了什么操作,可以通过redis-cli和telnet命令使用。使用sigint (Ctrl-C)来停止通过redis-cli使用monitor命令返回的输出,使用quit命令来停止通过telnet使用monitor返回的输出。
由于MONITOR命令返回 服务器处理的所有的命令,所以在性能上会有一些消耗。做集中监控使用redis-live、命令行使用redis-stat,可能会比较合适,另外也可根据自己的情况自行编写,总之就是根据info和monitor命令来获取并展示信息。
相对于命令行工具来说,图形化监控Redis结果更加美观、直接,但是同时图形化的工具安装起来也比较麻烦。有些甚至会对Redis的性能造成一定的影响,是实际的项目中,可以根据自己想要的监控结果来选择合适的监控工具。
参考资料:
http://blog.csdn.net/dc_726/article/details/47699739
http://redis.majunwei.com/
http://www.redis.net.cn/tutorial/3502.html
http://www.cnblogs.com/Leo_wl/p/5870006.html