3.3 Memcached的管理与性能监控
3.3.1 如何管理Memcached
1.通过Memcached的监听端口进行管理
Memcached的管理相对比较容易,通过命令行登录到Memcached的监听端口,然后执行一些命令,通过这些命令的输入即可查看Memcached的运行状态。
管理Memcached的命令如下:
stats,统计Memcached的各种信息。
stats reset,重新统计数据。
stats slabs,显示slabs信息。通过这个命令能获取每个slabs的chunksize长度,从而确定数据到底保存在哪个slab。
stats items,显示slab中的item数目。
set | get, gets,前面已经介绍过,用来保存或获取数据。
例如,要查看Memcached的统计信息,执行“telnet ip 监听端口”命令,登录成功之后执行stats命令。具体过程如下:
[root@web181 ~]# telnet 192.168.1.181 11211
Trying 192.168.1.181...
Connected to web181 (192.168.1.181).
Escape character is '^]'.
stats
STAT pid 19900 #Memcached启动的进程ID
STAT uptime 2115676 #到目前为止启动了多少秒
STAT time 1287937993
STAT version 1.4.5 #Memcached的版本信息
STAT pointer_size 64
STAT rusage_user 0.003999
STAT rusage_system 0.001999
STAT curr_connections 10 #当前的并发连接数
STAT total_connections 16 #总的连接数
STAT connection_structures 11
STAT cmd_get 1 #执行的get命令的次数
STAT cmd_set 4 #执行的set命令的次数
STAT cmd_flush 0 #执行flush命令的次数
STAT get_hits 1 #get的命中数
STAT get_misses 0 #get的非命中数
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT decr_misses 0
STAT decr_hits 0
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 157
STAT bytes_written 129
STAT limit_maxbytes 33554432 #允许使用的最大内存容量
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT bytes 149
STAT curr_items 2
STAT total_items 2
STAT evictions 0
STAT reclaimed 0
END
通过以上信息可以看到Memcached的状态、连接的次数、当前的并发连接数。通过这些信息可以分析出,当前Memcached的换入换出是否比较厉害,容量是否足够。
2.利用memcached-tool管理Memcached
memcached-tool是Brad Fitzpatrick利用Perl编写的一个Memcached管理脚本。这个脚本通过将之前的命令行进行封装,使输入的值更加规整,进而更便于分析查看。可以通过下面的网址下载memcached-tool:http://code.sixapart.com/svn/memcached/trunk/server/scripts/memcached-tool。
下面是memcached-tool的基本用法:
[root@web181 ~]# perl memcached-tool
Usage: memcached-tool <host[:port]> [mode]
memcached-tool 10.0.0.5:11211 display
memcached-tool 10.0.0.5:11211
memcached-tool 10.0.0.5:11211 stats
memcached-tool 10.0.0.5:11211 move 7 9
memcached-tool的执行示例如下:
[root@web181 ~]# perl memcached-tool 127.0.0.1:11211
1 96 B 278 s 1 2 no
[root@web181 ~]# perl memcached-tool 127.0.0.1:11211 display
1 96 B 278 s 1 2 no
以上过程格式化输出的stats命令的信息非常规整,如图3-7所示。
总的来说,对单个或少量的Memcached服务器的维护相对容易,如果Memcached量非常大(这里说的量是指由单个Memcached运行100GB的数据容量或者有多台大容量的Memcached运行服务时),如何组织这些资源,以及在某一个Memcached服务器宕机时,如何能保证后端的数据库压力不会产生瓶颈,这是需要考虑的问题。在进行大规模部署时,需要根据业务分配不同的Memcached服务,同一类型的业务使用相同的资源,并且记录这些业务使用的端口资源,定期分析这些资源是否足够,以及利用一致性散列算法来确保在扩容Memcached的情况下,尽量减少对数据库的影响。
3.3.2 Memcached的监控
部署好Memcached之后,需要对Memcached的使用情况进行跟踪:监控Memcached的状态信息、内存使用情况、hit/miss的值。通过对Memcached的监控不仅能立刻了解Memcached出现问题,还能够利用状态信息来分析业务数据的增长并为未来的容量规划提供依据。
监控Memcached的工具很多,目前常用的监控工具有:memcache.php、Nagios和cacti。下面分别对这三种监控方法进行介绍。
1.利用memcache.php对单台Memcached进行监控
利用memcache.php进行监控是最简单的监控方法,只要机器支持PHP环境即可。这种监控的执行过程是:把这个文件放到可以访问的目录中,然后对这个memcache.php文件进行修改。下载此文件的网址如下:
http://livebookmark.net/memcachephp/memcachephp.zip
在使用memcache.php文件之前需要先修改用于访问的用户名和密码。
vi memcache.php
.....
define('ADMIN_USERNAME','memcache'); // 定义用户名
define('ADMIN_PASSWORD','password'); // 定义密码
.....
$MEMCACHE_SERVERS[] = 'mymemcache-server:11211'; //定义要查看的IP和端口
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11212'; //可添加多个
修改自己定义的用户名和密码之后,就可以通过URL访问这个php文件了。输入用户名和密码后Memcached的状态图如图3-8所示。
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/f78c37d67755e3268ab36f7272f936ea0f95b069.png" >
</div>
图3-8很直观地反映了当前Memcached的使用情况、命中和不命中的比例等各种状态。
2.利用Nagios监控Memcached
利用Nagios来监控Memcached的方式有两种:一种方式是直接使用check_tcp(mixi)的方法来监控,代码如下:
```javascript
define command {
command_name check_memcached
command_line $USER1$/check_tcp H$HOSTADDRESS$ -p 11211 –t 5 -E
-s 'stats\r\nquit\r\n' –e 'uptime' –M crit
}
这种方式很简单,可以直接使用,不需要安装其他插件。
另一种方式是通过Nagios 的Memcached监控插件可以详细地监视Memcached的get和add等动作。例如,可以通过stats命令来确认Memcached的运行状态。下载Nagios的Memcached监控插件的网址如下:
http://search.cpan.org/CPAN/authors/id/Z/ZI/ZIGOROU/Nagios-Plugins-Memcached-0.02.tar.gz
编译安装Nagios的Memcached监控插件后,通过Nagios的check_memcached直接访问Memcached服务器的监听端口。当然,也可以在将此插件安装在Memcached服务器后利用check_nrpe来获取Memcached服务器的状态信息,过程如下:
define command {
command_name check_memcached_11211
command_line $USER1$/check_memcached -H 192.168.1.221:11211 --size-warning 80 --size-critical 90
}
配置完成后,在Memcached的界面会看到如图3-9所示的信息。
也可以将stats目录的结果通过rrdtool转化成图形,以进行性能监视,并将每天的内存使用量做成报表,通过邮件发送出去。
3.利用cacti监控Memcached
在cacti中采用一套监控Memcached的模板,可以图形化显示Memcached当前的状态信息。这个模板可以从以下网址下载:http://dealnews.com/developers/cacti/memcached.htmls
这里不介绍配置过程。配置完成后cacti监控Memcached的效果图如图3-10、图3-11、图3-12和图3-13所示。
当有多台Memcached时,可以考虑使用cacti和Nagios来配置统一的监控界面,这有利于后期对Nemcached进行运维。而memcache.php适合单台机器来使用。
3.3.3 Memcached变种产品介绍
国内外有很多基于Memcached开发的产品,这些产品支持所有Memcached的协议,同时侧重不同的应用场景,可以根据自己的应用需求选择合适的Memcached变种。下面分别介绍几种Memcached的变种产品。
1. memcachedb
memcachedb是新浪网基于Memcached开发的一个开源项目。通过为Memcached增加Berkeley DB的持久化存储机制和异步主辅复制机制,使Memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合需要超高性能读写速度、持久化保存的应用场景,例如,将memcachedb应用于新浪博客的管理。如果对Memcached有持久化需求,可以考虑使用memcachedb。
2. repcached
repcached是日本人开发的基于Memcached的一个patch,实现Memcached的复制功能,它支持多个Memcached之间相互复制,可以解决Memcached的容灾问题。有cache容灾需求的可以尝试使用这一功能。
3. memcached_functions_mysql
这个功能相当于MySQL的UDFs(User Defined Functions),在MySQL中通过触发器更新Memcached。这样可以做到把数据写入MySQL,然后从Memcached获取数据,以减轻数据库的压力,同时减少很多开发的工作量。
关于memcached_functions_mysql的使用和经验会在下一节进行详细介绍。
4. memcacheQ
memcacheQ在Memcached的基础上实现了消息队列。下面以PHP客户端为例介绍memcacheQ实现消息队列的方式。
消息从尾部入栈:memcache_set
消息从头部出栈:memcache_get
memcacheQ最大的优势是:它是基于Memcached开发的,可以通过各种Memcached命令对它进行操作。基于Memcached开发的应用完全不需要做任何修改。
memcacheQ应用于数据库的多机房分布式部署环境,数据库分布在各地,各自写各自的数据库,同时写入本地的memcacheQ,本地的memcacheQ通过调度程序(需要自己开发)把数据从memcacheQ中读取出来,然后写入其他机房的数据库主库,最终使每个机房的数据库数据一致。如图3-14所示为memcacheQ在两个机房的部署情况。
消息队列服务还能使一个有波峰的业务转化成一条直线,这对利用资源非常有好处,只需要准备直线的资源,不需要准备到波峰的资源。Twitter之前通过RabbitMQ来实现消息队列服务,现在改为通过Kestrel来实现消息队列服务,类似的消息队列服务产品还有ActiveMQ和ZeroMQ等。