解析linux下安装memcacheq(mcq)全过程笔记


Posted in PHP onJune 27, 2013

memcacheQ是一个单纯的分布式消息队列服务。
一,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就已经安装了,如果不确定,就检查一下吧

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

2. 安装BerkleyDB
1.tar zxvf bdb-5.3.3.tar.gz
2.cd db-5.3.3/
#需要进入特定操作系统编译环境,更常规软件的编译有些区别
3.cd build_unix/
4. ../dist/configure --prefix=/usr/local/berkeleydb
#如果没有指定特殊安装路径,编译完成,需要将Berkeley Db运行库的路径添加到系统配置里面
echo "/usr/local/BerkeleyDB.5.3/lib/" >> /etc/ld.so.conf
#重载系统Ld运行库
ldconfig
5. make & make install
记得改/etc/ld.so.conf文件,添加/usr/local/BerkeleyDB.5.3/lib啊,不然后面的mcq会安装错误。
而BerkeleyDB就要去下载了
点击下载Berkeley DB 5.3.21.rar
下面安装memcacheq,
先下载一个memcacheq-0.2.0.rar
解压,进目录
./configure ?with-bdb=/usr/local/BerkeleyDB.5.1 ?with-libevent=/usr/local/lib ?enable-threads
make
make install
关键是红色字体那一步,一定输入正确,不然make不通过,无法安装

下面是启动
memcacheq -d -r -u root -p21201 -H /data/memcacheq -N -v -L 1024 -B 1024 > /data/mq_error.log 2>&1
这里不推荐使用root用户,有些帖子里说不可以,我这里测试是可以的,不过可能会不安全。
1 下面是启动时候的参数
使用memcacheq -h 的命令来查看命令行选项
2 这个是正确的启动memcacheq:memcacheq -d -uroot -r -p11212 -H /home/wwwroot/mcq -N -R -v -L 1024 -B 1024 > /home/wwwlogs/mq_error.log 2 > &1
3 这个不知道为什么就不行/usr/local/memcacheq/bin/memcacheq -d -l 127.0.0.1 -A 8192 -H /data/memcacheq -B 65535 -N -R -u root
-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
测试

三、测试
1.telnet 10.218.31.121 22201
2.stats
2.stats queue
3.set q4  0 0 5
4 hello
5 get q4
6 stats queue
7 delete q4
如果set的时候补成功not_STORED的话,检查一下你的启动命令吧,参数没设置好,如果你是新手,干翠多看几个帖子,多尝试启动命令,换换参数,就行了

四,使用
使用以上命令启动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查看一个指定队列时,可以看到这个队列一共接收了多 少消息,其中被取出了多少条。
示例:

fengbo@onlinegame-10-121:~$ telnet 127.0.0.1 22202
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

上面执行了两次set的命令,使用stats queue查看时,可以看到q4的队列中共有消息2条,已取出0条;当使用get取出第一条后,再此使用stats queue查看,q4中消息有2条,其中已取出1条。
PHP测试:
session_start();
$memcache_obj = new Memcache;
$memcache_obj->connect(‘127.0.0.1′, 11212) or die (“error”);
memcache_set($memcache_obj, ‘k',10, 0, 0);
echo “queue”.memcache_get($memcache_obj, ‘k');
memcache_close($memcache_obj);

注释:
这个时候会出现这样的问题
memcacheq: error while loading shared libraries: libdb-5.0.so: cannot open shared object file: No such file or directory
解决办法:在/usr/lib 下建个 libdb-5.0.so 软链就OK啦
ln -s /usr/local/BerkeleyDB.5.0/lib/libdb-5.0.so /usr/lib/

五,关闭memcacheQ
使用ps命令查查memcacheQ的进程:ps -ef|grep wuf,然后直接将进程kill掉.

PHP 相关文章推荐
php图片验证码代码
Mar 27 PHP
PHP中使用gettext来支持多语言的方法
May 02 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
Yii入门教程之目录结构、入口文件及路由设置
Nov 25 PHP
smarty模板引擎之分配数据类型
Mar 30 PHP
PHP也能干大事 随机函数
Apr 14 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 #PHP
深入解析phpCB批量转换的代码示例
Jun 27 #PHP
使用PHP获取汉字的拼音(全部与首字母)
Jun 27 #PHP
Memcached常用命令以及使用说明详解
Jun 27 #PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
Jun 27 #PHP
解析wamp5下虚拟机配置文档
Jun 27 #PHP
解析CI的AJAX分页 另类实现方法
Jun 27 #PHP
You might like
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
2013/04/26 PHP
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP读书笔记整理_结构语句详解
2016/07/01 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
JavaScript表单焦点自动切换代码
2016/07/24 Javascript
js利用clipboardData实现截屏粘贴功能
2016/10/12 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
javascript+css实现进度条效果
2020/03/25 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
基于python的字节编译详解
2017/09/20 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
Python列表切片操作实例总结
2019/02/19 Python
Python实现将HTML转成PDF的方法分析
2019/05/04 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python求两个字符串最长公共子序列代码实例
2020/03/05 Python
共产党员公开承诺书
2014/03/25 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
小学生家长意见
2015/06/03 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android