Memcache持久化消息队列MemcacheQ



转载自:http://blog.csdn.net/zhu_tianwei/article/details/44879433

 

memcacheQ是一个国内开发的基于memcache协议、BDB持久数据存储、高性能轻量级分布式消息队列服务。它的安装依赖于BerkeleyDB 和 libevent,所以要先安装这BerkeleyDB和libevent。

 

memcacheQ在Memcached的基础上实现了消息队列。下面以PHP客户端为例介绍memcacheQ实现消息队列的方式。

 

消息从尾部入栈:memcache_set

消息从头部出栈:memcache_get

 

memcacheQ最大的优势是:它是基于Memcached开发的,可以通过各种Memcached命令对它进行操作。基于Memcached开发的应用完全不需要做任何修改。

 

memcacheQ应用于数据库的多机房分布式部署环境,数据库分布在各地,各自写各自的数据库,同时写入本地的memcacheQ,本地的 memcacheQ通过调度程序(需要自己开发)把数据从memcacheQ中读取出来,然后写入其他机房的数据库主库,最终使每个机房的数据库数据一致。如图所示为memcacheQ在两个机房的部署情况。

 

Memcache持久化消息队列MemcacheQ_第1张图片

 

消息队列服务还能使一个有波峰的业务转化成一条直线,这对利用资源非常有好处,只需要准备直线的资源,不需要准备到波峰的资源。Twitter之前通过 RabbitMQ来实现消息队列服务,现在改为通过Kestrel来实现消息队列服务,类似的消息队列服务产品还有ActiveMQ和ZeroMQ等。

 

官网地址:

http://memcachedb.org/memcacheq/

 

项目地址:  
http://groups.google.com/group/memcachedb    
https://github.com/stvchu/memcachedb


一、特点

   
1.简单高效,基于memcache协议,这意味着只要客户端支持memcache协议即可使用。    
2.队列数据存储于BDB,持久保存。    
3.并发性能好。    
4.支持多条队列。

 

memcacheQ依赖于Berkeley DB和libevent。Berkeley DB用于持久化存储队列的数据,避免在memcacheq崩溃或这服务器当掉时候,不至于数据丢失。对于并发量较高的web环境,特别是数据库写入操作过 多的情景,使用队列可大大缓解因并发问题造成的数据库锁死问题。

 

memcacheQ最大的优势是:它是基于Memcached开发的,可以通过各种Memcached命令对它进行操作。基于Memcached开发的应用完全不需要做任何修改。

 

二、安装

   
memcacheQ依赖于libevent和BDB(BerkleyDB),所以在安装memcacheQ之前先安装libevent和BerkleyDB。    

mkdir libevent  berkeleyDB

 

1.安装libevent

   
libevent 1.4.x or later    
下载地址: http://www.monkey.org/~provos/libevent/ 

wget http://jaist.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz    
tar -zxvf libevent-2.0.22-stable.tar.gz  
cd libevent-2.0.22-stable    
./configure --prefix=/home/slim/libevent    
make  
make install

 
使用root用户将libevent运行库的路径添加到系统配置里面    

echo "/home/slim/libevent/lib/" >> /etc/ld.so.conf    
/sbin/ldconfig

 

2.安装Berkeley DB

   
Berkeley DB 4.7 or later    
下载地址:http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html    

wget http://download.oracle.com/otn/berkeley-db/db-6.1.23.tar.gz  
tar -zxvf db-6.1.23.tar.gz    
cd db-6.1.23    
cd build_unix/    
../dist/configure --prefix=/home/slim/berkeleyDB    
make    
make install

   
使用root用户将Berkeley+Db运行库的路径添加到系统配置里面    

echo "/home/slim/berkeleyDB/lib/" >> /etc/ld.so.conf    
/sbin/ldconfig

 

3.安装memcacheQ

   
下载软件包:http://code.google.com/p/memcacheq/downloads/list,需×××下载    

wget http://code.google.com/p/memcacheq/downloads/detail?name=memcacheq-0.2.0.tar.gz&can=2&q=    
mkdir memcacheq    
tar -zxvf memcacheq-0.2.0.tar.gz    
cd  memcacheq-0.2.0    
./configure  --prefix=/home/slim/memcacheq -with-bdb=/home/slim/berkeleyDB -with-libevent=/home/slim/libevent -enable-threads    
make    
make install

 

三、启动

 

cd ~/home/slim/memcacheq

   
建立数据和日志目录,用于memcacheQ保存数据和日志信息:    

mkdir data logs

   
启动memcacheq:    

./bin/memcacheq -d -l 192.168.36.189  -r -H /home/slim/memcacheq/data -N -R -v -L 1024 -B 1024 > /home/slim/memcacheq/logs/memcacheq.log 2>&1
参数说明:
-p  TCP监听端口(default: 22201)
-U  UDP监听端口(default: 0, off)
-s  unix socket路径(不支持网络)
-a  unix socket访问掩码(default 0700)
-l  监听网卡
-d 守护进程
-r 最大化核心文件限制
-u  以用户身份运行(only when run as root)
-c  最大并发连接数(default is 1024)
-v 详细输出 (print errors/warnings while in event loop)
-vv 更详细的输出 (also print client commands/reponses)
-i 打印许可证信息
-P  PID文件
-t  线程数(default 4)
--------------------BerkeleyDB Options-------------------------------
-m  BerkeleyDB内存缓存大小, default is 64MB
-A  底层页面大小, default is 4096, (512B ~ 64KB, power-of-two)
-H  数据库家目录, default is '/data1/memcacheq'
-L  日志缓冲区大小, default is 32KB
-C  多少秒checkpoint一次, 0 for disable, default is 5 minutes
-T  多少秒memp_trickle一次, 0 for disable, default is 30 seconds
-S  多少秒queue stats dump一次, 0 for disable, default is 30 seconds
-e  达到缓存百分之多少需要刷新, default is 60%
-E  一个单一的DB文件有多少页, default is 16*1024, 0 for disable
-B  指定消息体的长度,单位字节, default is 1024
-D  多少毫秒做一次死锁检测(deadlock detecting), 0 for disable, default is 100ms
-N 开启DB_TXN_NOSYNC获得巨大的性能改善, default is off
-R 自动删除不再需要的日志文件, default is off

 

四、使用测试


1.使用mq时只需要用到两个命令:set和get
 


set   0         STORED    get     VALUE           END
set queue_test 0 0 3
abc
STORED
get queue_test
VALUE queue_test 0 3
abc
END
get queue_test
END

 

可以看到,和memcache协议基本一致,只是把key name换成queue name,而且在set的命令中,忽略了expire_time的参数。毕竟mq的数据存储是存在berkeleyDB中,做了持久化存储,没有内存的过 期时间。当使用set命令时,就向指定的消息队列中写入了一条新消息,也就是向BerkeleyDB中新insert了一条数据,当使用get命令时,就 从 指定队列中取出一条新消息,也就是向BerkeleyDB中delete了一条数据。

 

2.查看统计情况

   

stats 查看memcacheQ统计情况    stats queue 查看队列统计情况
set queue_test 0 0 3
xxx
STORED
stats
STAT pid 13554
STAT uptime 173
STAT time 1428161993
STAT version 0.2.0
STAT pointer_size 32
STAT rusage_user 0.032994
STAT rusage_system 0.270958
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT get_cmds 2
STAT get_hits 1
STAT set_cmds 2
STAT set_hits 2
STAT bytes_read 120
STAT bytes_written 81
STAT threads 4
END
stats queue
STAT queue_test 2/1
END

 

3.删除一个队列

   

telnet 192.168.36.189 22201    
delete queue_test

 

4.也可以使用db_stat查看一个队列有多少记录

cd /home/slim/memcacheq/data/    
/home/slim/berkeleyDB/bin/db_stat -d  queue_test

Sat Apr 4 08:46:54 2015 Local time
42253 Queue magic number
4 Queue version number
1024 Fixed-length record size
0x20 Fixed-length record pad
4096 Underlying database page size
16384 Underlying database extent size
3 Number of records in the database
3 Number of data items in the database
1 Number of database pages
0 Number of bytes free in database pages (100% ff)
1 First undeleted record
4 Next available record number