首页 » memcache » 正文

memcacheQ安装配置与测试

简介:

memcacheq(简称mcq,持久化消息队列)是一个轻量级的消息队列。mcq依赖于Berkeley DB和libevent。Berkeley DB用于持久化存储队列的数据,避免在mcq崩溃或这服务器当掉时候,不至于数据丢失。

MEMCACHEQ的应用背景:

Web应用中为什么会需要消息队列?主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too manyconnections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。在Web2.0的时代,高并发的情况越来越常见,从而使消息队列有成为居家必备的趋势,相应的也涌现出了很多实现方案,像Twitter以前就使用RabbitMQ实现消息队列服务,现在又转而使用Kestrel来实现消息队列服务,此外还有很多其他的选择,比如说:ActiveMQ,ZeroMQ等。

上述消息队列的软件中,大多为了实现AMQP,STOMP,XMPP之类的协议,变得极其重量级,但在很多Web应用中的实际情况是:我们只是想找到一个缓解高并发请求的解决方案,不需要杂七杂八的功能,一个轻量级的消息队列实现方式才是我们真正需要的。

MEMCACHEQ的特性:

1 简单易用
2 处理速度快
3 多条队列
4 并发性能好
5 与memcache的协议兼容。这就意味着只要装了memcache的extension就可以了,不需要额外的插件。

安装:

MEMCACHEQ依赖于libevent和BerkleyDB。BerkleyDB用于持久化存储队列的数据。 这样在MEMCACHEQ崩溃或者服务器挂掉的时候,不至于造成数据的丢失。这一点非常重要。它的安装依赖于BerkeleyDB 和 libevent,所以要先安装这BerkeleyDB和libevent,其中libevent如果你安装过memcached就已经安装了,如果不确定,就检查一下吧

#rpm -qa|grep libevent  //检查libevent是否被安装

  libevent-2.0.21-4.el7.x86_64

#yum  -y install libevent-devel 

注意事项:libevent, libevent-devel优先使用yum安装源,光盘镜像中的rpm包安装,这样稳定性和兼容性可得到保证,网上流传的使用源码安装libevent的方法会有问题,因为很可能系统已经安装libevent, 再使用源码安装, 必然导致冲突,造成意外问题,所以一定要使用上述命令检查系统是否已经安装相应的库

安装BerkleyDB

下载地址:http://download.oracle.com/otn/berkeley-db/db-6.1.19.tar.gz

下载页面:http://www.oracle.com/technetwork/cn/database/database-technologies/berkeleydb/downloads/index.html

注意事项:必须通过浏览器下载然后上传到服务器上,不能通过wget下载,wget下载的包大小不对,无法解压。下载时需要登录。
#cd /home/tools/

#tar -zxvf db-6.1.19.gz

#cd db-6.1.19

#cd build_unix //需要进入特定操作系统编译环境,跟常规软件的编译有些区别

#../dist/configure –prefix=/usr/local/berkeleydb   //这个地方一定要这样写,因为在build_unix这个目录下是没有文件的。如果没有指定特殊安装路径,编译完成,需要将Berkeley Db运行库的路径添加到系统配置里面

#echo “/usr/local/BerkeleyDB.5.3/lib/” >> /etc/ld.so.conf   //记得改/etc/ld.so.conf文件,添加/usr/local/BerkeleyDB.5.3/lib啊,不然后面的mcq会安装错误。

#ldconfig  //重新载入系统Ld运行库

#make

#make install

安装memcacheq:

下载地址:http://code.google.com/p/memcacheq/downloads/list

注意事项:由于国内无法访问谷歌的问题,需要翻墙之后进行下载,然后上传到服务器上。

#cd /home/tools/

#tar -zxvf memcacheq-0.2.0.tar.gz

#cd memcacheq-0.2.0

#./configure –with-bdb=/usr/local/berkeleydb/ –with-libevent=/usr/local/lib -enable-threads

#make

#make install

#vim /etc/profile   //不增加环境变量的话,启动的时候会报错,提示找不到libdb-6.1.so

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/berkeleydb/lib

#source /etc/profile  //使环境变量立即生效。

   

启动memcacheq:

#memcacheq -d -uroot -r -p11212 -H /home/mcq/ -N -R -v -L 1024 -B 1024 > /home/mq_error.log 2>&1

测试memcacheq:

使用以上命令启动mq后,(注意上面的-B参数表示messag的body长度不能超过1024 bytes),使用mq时只需要用到两个命令:set和get:

set <queue name> <flags> 0 <message_len>\r\n
<put your message body here>\r\n
STORED\r\n
get <queue name>\r\n
VALUE <queue name> <flags> <message_len>\r\n
<your message body will come here>\r\n
END\r\n

可以看到,和memcache协议基本一致,只是把key name换成queue name,而且在set的命令中,忽略了expire_time的参数。毕竟mq的数据存储是存在berkeleyDB中,做了持久化存储,没有内存的过期时间。

当使用set命令时,就向指定的消息队列中写入了一条新消息,也就是向BerkeleyDB中新insert了一条数据,当使用get命令时,就从 指定队列中取出一条新消息,也就是向BerkeleyDB中delete了一条数据。当使用stats查看一个指定队列时,可以看到这个队列一共接收了多 少消息,其中被取出了多少条。

#yum -y install telnet

#telnet 127.0.0.1 11212    //标记为蓝色的命令是需要输入的命令

Trying 127.0.0.1…

Connected to 127.0.0.1.

Escape character is ‘^]’.

set q4 0 0 5

hello

STORED
set q4 0 0 5
world
STORED
stats queue
STAT q4 2/0
END
get q4
VALUE q4 0 5
hello
END
stats queue
STAT q4 2/1
END
quit  //退出命令
上面执行了两次set的命令,使用stats queue查看时,可以看到q4的队列中共有消息2条,已取出0条;当使用get取出第一条后,再此使用stats queue查看,q4中消息有2条,其中已取出1条。
memcache 可配置的参数或者叫帮助文档(memcacheq -h命令的输出):
-p <num> TCP监听端口(default: 22201)
-U <num> UDP监听端口(default: 0, off)
-s <file> unix socket路径(不支持网络)
-a <mask> unix socket访问掩码(default 0700)
-l <ip_addr> 监听网卡
-d 守护进程
-r 最大化核心文件限制
-u <username> 以用户身份运行(only when run as root)
-c <num> 最大并发连接数(default is 1024)
-v 详细输出 (print errors/warnings while in event loop)
-vv 更详细的输出 (also print client commands/reponses)
-i 打印许可证信息
-P <file> PID文件
-t <num> 线程数(default 4)
——————–BerkeleyDB Options——————————-
-m <num> BerkeleyDB内存缓存大小, default is 64MB
-A <num> 底层页面大小, default is 4096, (512B ~ 64KB, power-of-two)
-H <dir> 数据库家目录, default is ‘/data1/memcacheq’
-L <num> 日志缓冲区大小, default is 32KB
-C <num> 多少秒checkpoint一次, 0 for disable, default is 5 minutes
-T <num> 多少秒memp_trickle一次, 0 for disable, default is 30 seconds
-S <num> 多少秒queue stats dump一次, 0 for disable, default is 30 seconds
-e <num> 达到缓存百分之多少需要刷新, default is 60%
-E <num> 一个单一的DB文件有多少页, default is 16*1024, 0 for disable
-B <num> 指定消息体的长度,单位字节, default is 1024
-D <num> 多少毫秒做一次死锁检测(deadlock detecting), 0 for disable, default is 100ms
-N 开启DB_TXN_NOSYNC获得巨大的性能改善, default is off
-R 自动删除不再需要的日志文件, default is off
 注意:和php连接,需要事先安装memcache的php扩展

linux下安装PHP扩展:Memcache

下载地址:

http://pecl.php.net/package/memcache

#cd /home/tools

#wget c http://pecl.php.net/get/memcache-3.0.6.tgz

#tar xzvf memcache3.0.6.tgz

#cd memcache3.0.6
#/usr/local/php/bin/phpize
#./configure enablememcache withphpconfig=/usr/local/php/bin/phpconfig prefix=/usr/local/memcache/
#make
#make install
#vim  /usr/local/php/lib/php.ini
   在extension_dir下面增加如下内容
   extension=memcache.so
重启php。
测试:
写一个php页面,内容如下:

<?php

$memcache_obj = new Memcache;

$memcache_obj->connect(‘127.0.0.1’, 11212);

$memcache_obj->set(‘a’,time());

$memcache_obj->set(‘a’,time()+1);

echo $memcache_obj->get(‘a’);   

echo “\r\n”;

echo $memcache_obj->get(‘a’);   

echo “\r\n”;

#/usr/local/php/bin/php-cgi a.php

X-Powered-By: PHP/5.6.8

Content-type: text/html; charset=UTF-8

1433929478

1433929479

取出来的是两个连续的数字,说明是队列。 

阅读memcacheq源码记录

越来越觉着大学里学的谭浩强的《C语言程序设计》太狗血了,哎,悔不当初啊。

今天下午闲着看了一下memcacheq这个消息队列的源代码,存储引擎用得bdbbdb支持队列方式的数据存储,只不过一个record必须fixed-length,具体能存多大的长度,我没再官方的doc中找到,不过,memcacheq作者说最大消息长度不能超过64K,而且,如果你超过了64K,消息队列就挂了,嗯,这个我碰到过了,超过64K,存入消息队列之后,整个消息队列就得重启。所以,如果你不确定以后业务变更会增加消息体的大小,那么我不建议你使用memcacheq🙂 。

memcacheq在内存里维护一个队列的hash,memcacheq.c文件实现了memcached协议,bdb.c文件实现了对于bdb的读写,发觉消息队列持久化用bdb实现实在是很轻量、很简洁,item.c对协议层的封装,操作结构体item。

libevent对收到的通信包做callback,包括对bdb做增、删、存操作。bdb也用libevent,对libevent没有研究,略过N字 :)。

ps memcacheq测试使用的是python写的memcache.py。

简单,有效的持久化消息队列,性能过得去,抽空我得好好看看C语言,学习一下 🙂 复习一下数据结构,以前的早忘记了,而且也没怎么好好学。老外写的《C语言程序设计》这本,不错的。

 

http://192.168.1.3:8080/memcacheStatus.php  //查看mcq的状态信息

参考文档:

sina微博队列memcacheq 服务安装与原理

http://blog.163.com/song_0803/blog/static/46097597201131510533947/
http://www.com133.com/56
http://ifxoxo.com/memcache-install.html
http://ikurten.com/blog/2011/12/04/memcacheq/