威尼斯www.9778.com-威尼斯正版官方网站

Centos下安装memcacheq

日期:2020-02-14编辑作者:编程人生

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

Centos下安装memcacheq

图片 1

一:安装memcached

1.下载memcached包
下载地址: (最新包就在首页,点击下载就OK)
解压包:# tar -zxvf memcached-1.4.13.tar.gz (根据自身的情况解压到目录)
进入目录:# cd memcached-1.4.13

2.安装libevent
检查一下有没有安装libevent: ls -al /usr/lib |grep libevent
如果没有就安装libevent ,下载地址: (首页 Download–Stable releases)
解压:# tar -zxvf libevent-***-.tar.gz
#cd libevent-***-
#./configure --prefix=/usr
#make && make install
安装完检测下 ls -al /usr/lib |grep libevent
lrwxrwxrwx 1 root root 21 02-06 20:26 libevent-1.4.so.2 -> libevent-1.4.so.2.1.3
.................................
-rw-r--r-- 1 root root 11838 04-13 14:03 libevent_pthreads.a
-rwxr-xr-x 1 root root 996 04-13 14:03 libevent_pthreads.la
lrwxrwxrwx 1 root root 30 04-13 14:03 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.6
lrwxrwxrwx 1 root root 21 04-13 14:03 libevent.so -> libevent-2.0.so.5.1.6

3.安装memcached
预安装:#./configure --prefix=/usr/local/memcached --with-libevent=/usr
注意:在没有安装libevent的情况下,会报错( If it's already installed, specify its path using --with-libevent=/dir/);
编译并且安装:# make && make install
OK安装成功.

启动memcached:
# /usr/local/memcached/bin/memcached -l 192.168.1.144 -d -p 11211 -u nobody -m 1024
说明:上面的命令中-d表示用 daemon 的方式启动 memcached,-l和-p组合表示监听在 192.168.1.144 的 11212 端口上(如果不用-p指定端口号,则memcached将运行在11211端口 上),-u表示运行用户为 nobody,-m表示为其分配1024MB 的内存。

连接 memcached: # telnet 192.168.1.144 11211
到这里 memcached就已经安装好了。

增加到开机启动
# vi /etc/rc.local
增加:
/usr/local/memcached/bin/memcached -l 192.168.1.144 -d -p 11211 -u nobody -m 1024

二:安装memcacheq
1.下载memcacheq包
下载地址:
解压包:# tar -zxvf memcacheq.0.2.tar.gz (根据自身的情况解压到目录)
进入目录:# cd memcacheq-0.2.0

2.安装 BerkeleyDB
下载地址:

下载地址请求:wget wget (成功)

解压包:# tar -zxvf db-5.3.15.tar.gz (根据自身的情况解压到目录)
进入目录:# cd db-5.3.15
# cd build_unix
#../dist/configure --prefix=/usr/local/BerkeleyDB.5.3
# make && make install
#vi /etc/ld.so.conf
增加:
/usr/local/lib
/usr/local/BerkeleyDB.5.3/lib
#vi /etc/profile
增加
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/BerkeleyDB.5.3/lib

3.安装memcacheq (注: 下文中的5.3是berkeleyDB的版本 请根据实际情况操作)
预安装:./configure --prefix=/usr/local/memcacheq --enable-threads --with-libevent=/usr/local/libevent
注意:在没有安装BerkeleyDB的情况下,会报错( configure: error: cannot find libdb.so in /usr/local/BerkeleyDB.5.3/lib);

我的提示configure: error: cannot find libdb.so in /usr/local/BerkeleyDB.5.3/lib报错,我的解决方法:
装berkeley-db
wget
tar zxf db-4.7.25.tar.gz
cd db-4.7.25/build_unix/
../dist/configure
make
make install

#编译完成,将Berkeley Db运行库的路径添加到系统配置里面
echo "/usr/local/BerkeleyDB.4.7/lib/" >> /etc/ld.so.conf
ldconfig

测试:/usr/local/memcacheq/bin/memcachq -h
运行报:
memcacheq: error while loading shared libraries: libdb-5.3.so: cannot open shared object file: No such file or directory
解决方法:ln -s /usr/local/BerkeleyDB.5.3/lib/libdb-5.3.so /usr/lib/libdb-5.3.so

连接:/usr/local/memcacheq/bin/memcacheq -d -r -uroot -p12002 -H /var/mcq/data -N -R -v -L 1024 -B 1024 > /var/mcq/logs/mq_error.log 2>&1

其中过程遇到了很多问题,例如动态库位置,环境变量

inux上启动Memcache报错:

Shell代码 图片 2

  1. [[email protected]]#./bin/memcached-d-m2048-p11211-uroot
  2. ./bin/memcached:errorwhileloadingsharedlibraries:libevent-1.4.so.2:cannotopensharedobjectfile:Nosuchfileordirectory

原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对, 遇到这种情况那就去网上下载并安装上即可.

另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

因为我已经安装了libevent,所以应该是程序按照默认共享路径库去找,但是没有找到导致的。

首先使用find命令找到libevent-1.4.so.2文件在哪儿

Shell代码 图片 3

  1. [[email protected]]#find/usr-namelibevent-1.4.so.2
  2. /usr/libevent/lib/libevent-1.4.so.2

根据debug日志可以看到,程序只会去/lib 和/usr/lib下去寻找需要的共享链接库。

而我的libevent是安装在/usr/libevent/lib/下,所以memcache启动的时候并不知道该去这下面找,所以会报错

所以安装共享库后要注意共享库路径设置问题, 如下:

1)如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令

ldconfig命令的用途, 主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下, 搜索出可共享的动态链接库(格式如lib*.so*), 进而创建出动态装入程序(ld.so)所需的连接和缓存文件. 缓存文件默认为/etc/ld.so.cache, 此文件保存已排好序的动态链接库名字列表.

2)如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它"非/lib或/usr/lib"目录下, 那么在执行ldconfig命令前, 还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中, 如下:

Shell代码 图片 4

  1. [[email protected]]#cat/etc/ld.so.conf
  2. includeld.so.conf.d/*.conf

如上所示:/etc/ld.so.conf配置文件中内容只有一行,

ld.so.conf.d/*.conf的意思就是包含ld.so.conf.d/目录下以.conf为后缀的文件

所以我们可以在/etc/ld.so.conf.d目录下新建一个libevent.conf的配置文件,然后把libevent安装路径配置好

我的libevent内容如下:

Shell代码 图片 5

  1. [[email protected]]#catlibevent.conf
  2. /usr/libevent/lib

配置完后执行以下ldconfig命令

Shell代码 图片 6

  1. [[email protected]~]#ldconfig

3)如果共享库文件安装到了其它"非/lib或/usr/lib" 目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径). 那可以export一个全局变量LD_LIBRARY_PATH, 然后运行程序的时候就会去这个目录中找共享库.

LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库. 可以设置多个搜索目录, 这些目录之间用冒号分隔开. 比如安装了一个mysql到/usr/local/mysql目录下, 其中有一大堆库文件在/usr/local/mysql/lib下面, 则可以在.bashrc或.bash_profile或shell里加入以下语句即可:

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

一般来讲这只是一种临时的解决方案, 在没有权限或临时需要的时候使用.

启动

/usr/local/memcacheq/bin/memcacheq -d -r -uroot -p12002 -H /var/mcq/data -N -R -v -L 1024 -B 1024 > /var/mcq/logs/mq_error.log 2>&1

附带启动tomcat的命令

/usr/local/memcached/bin/memcached -d -m 2048 -u root -l ip地址 -p 12000 -c 512 -P /tmp/memcached.pid

附带介绍ruby相关的安装:
Starling是一个支持MemCache协议的轻量级持久化服务器。Starling是让创建网络访问队列或者多个队列异常简单,也就是说多点和多台机器间的异步工作进程。它是著名微博客网站Twitter开发用来处理大量的队列消息,以及保持服务的响应。Starling已经在生产环境中使用,不仅是Twitter在使用,FiveRuns同样在使用。FiveRuns甚至还根据自己的应用做了改进 ,他们认为网站速度快了很多.
这是一个支持memcache协议的轻量级持久化服务器,因此使用php/perl/ruby/java等多种客户端都没问题,可以将较慢的处理逻辑通过消息队列放在后台处理,同时也支持多点分布式处理。
由于starling是目前twitter在生产环境中运行的,经过实践检验过,稳定性应该不成问题。

安装:
1.安装linux下的开发工具包,最好使用red hat的添加删除程序安装.
(1)在可视化窗口下载打开"添加删除程序",找到"开发->开发工具"打钩,更新.插入对应的linux安装盘.
2.安装ruby和ruby gem
(1)安装钱的准备
检查系统是否已经安装了 ruby,
#rpm -qa | egrep '(ruby)|(irb)'
如果已安装,而且不是你所要的版本,则需要先卸载她,如,
#rpm -e ruby-docs-1.8.1-7.EL4.2
ruby-1.8.1-7.EL4.2
irb-1.8.1-7.EL4.2
ruby-libs-1.8.1-7.EL4.2
ruby-mode-1.8.1-7.EL4.2
ruby-tcltk-1.8.1-7.EL4.2
ruby-devel-1.8.1-7.EL4.2

(2)安装 Ruby
假设 Ruby 安装到 /usr/local/ruby
#mkdir /usr/local/ruby
#tar -zxvf ruby-1.8.4.tar.gz
#cd ruby-1.8.4
#./configure --prefix=/usr/local/ruby
#make
#make install

(3)设置路径
#vi /etc/profile
在该文件中加入,
RUBY_HOME=/usr/local/ruby
PATH=$PATH:$RUBY_HOME/bin
export RUBY_HOME PATH

(4)检查是否安装成功
重新登录,
#ruby -v
如果能显示 ruby 的版本信息(ruby 1.8.4 (2005-12-24) [i686-linux]),则说明已安装成功。

(5)安装 Ruby Gems
#tar -zxvf rubygems-0.9.0.tgz
#cd rubygems-0.9.0
#ruby setup.rb

我是用成功的方法是:yum install rubygems

(6)检查是否安装成功
#gem -v
如果能显示 gem 的版本信息(0.9.0),则说明已安装成功。

本文参考来源:

一:安装memcached 1.下载memcached包 下载地址: (最新包就在首页,点击下载就OK) 解压包:# tar -zxvf memcached-1....

上述消息队列的软件中,大多为了实现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/

  1. ../dist/configure --prefix=/usr/local/berkeleydb
    #如果没有指定特殊安装路径,编译完成,需要将Berkeley Db运行库的路径添加到系统配置里面
    echo "/usr/local/BerkeleyDB.5.3/lib/" >> /etc/ld.so.conf
    #重载系统Ld运行库
    ldconfig
  2. 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 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.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 0 rn
rn
STOREDrn
get rn
VALUE rn
rn
ENDrn
可以看到,和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掉.

本文由威尼斯www.9778.com发布于编程人生,转载请注明出处:Centos下安装memcacheq

关键词:

领悟php接口中interface存在的意义

可能大家都懂这些,作为不懂的我猜测了一下这个interface的意义,他就是为了后面调用的时候再调用的方法中调用实...

详细>>

php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码

今天在处理删除字符串两端的特定字符时遇到了下面的问题,先看例子   $str = 'akmumu/writedb.json';  我要做的是删除开...

详细>>

CURL状态码列表(详细)

77 背景概述: 游戏接口是使用PHPcURL扩展进行请求操作。但是,被请求的服务器经常会无故的不响应或者超时。总之,...

详细>>

PHP中把有符号整型转换为无符号整型方法

在一个短地址项目中,根据六位字符与ID的相互映射的算法,当ID超过2147483647的时候,六位字符的短地址映射的ID变成...

详细>>