RabbitMQ安装配置文档
一.rabbitMQ介绍
1.简单说明
RabbitMQ是流行的开源消息队列系统,用erlang语言开发;它是AMQP(高级消息队列协议)的标准实现,是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License。
2.实现模式图
3.几个主要概念说明
Broker:简单来说就是消息队列服务器实体。Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。Queue:消息队列载体,每个消息都会被投入到一个或多个队列。Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。Routing Key:路由关键字,exchange根据这个关键字进行消息投递。vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。producer:消息生产者,就是投递消息的程序。consumer:消息消费者,就是接受消息的程序。channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
4.消息队列的使用过程
(1)客户端连接到消息队列服务器,打开一个channel。(2)客户端声明一个exchange,并设置相关属性。(3)客户端声明一个queue,并设置相关属性。(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。(5)客户端投递消息到exchange。
exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。
exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分: (1)exchange持久化,在声明时指定durable => 1 (2)queue持久化,在声明时指定durable => 1 (3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)
如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。
二.安装配置
1.RabbitMQ安装与配置
[root@linuxblind zdh]# wget -O /etc/yum.repos.d/epel-erlang.repo \
[root@linuxblind zdh]# yum install esl-erlang
[root@linuxblind sbin]# erl
Erlang R15B03 (erts-5.9.3.1) [source][64-bit] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9.3.1 (abort with ^G)
1> io:format("hello world~n").
hello world <-----表示安装成功
ok
[root@linuxblind zdh]# wget \
[root@linuxblind zdh]# tar zxf rabbitmq-server-generic-unix-3.1.1.tar.gz -C/usr/local/
[root@linuxblind zdh]# cd /usr/local
[root@linuxblind zdh]# mv rabbitmq-server-3.1.1 rabbitmq
#配置rabbitmq服务的环境变量
[root@linuxblind rabbitmq]# vim etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NODE_IP_ADDRESS=192.168.245.129
RABBITMQ_NODE_PORT=5672
RABBITMQ_LOG_BASE=/u1/logs/rabbitmq/log
RABBITMQ_MNESIA_BASE=/u1/logs/rabbitmq/mnesia
RABBITMQ_PLUGINS_DIR=/usr/local/rabbitmq/plugins
#配置rabbitmqweb管理插件
[root@gy02 rabbitmq]#vim etc/rabbitmq/rabbitmq.config
[{rabbitmq_management,
[{listener, [{port, 15672},
{ip, "192.168.245.129"}
]}
]}
].
2. rabbitMQ服务的启动与关闭
#启动管理界面:初始用户名:guest 密码:guest
[root@linuxblind zdh]# /usr/local/rabbitmq/sbin/rabbitmq-plugins enable \
rabbitmq_management
#启动服务
[root@linuxblindzdh]# /usr/local/rabbitmq/sbin/rabbitmq-server -detached
#关闭服务
[root@linuxblind zdh]#/usr/local/rabbitmq/sbin/rabbitmqctl stop
#查看状态
[root@linuxblind zdh]#/usr/local/rabbitmq/sbin/rabbitmqctl status
注:线上安装目录与命令同上(在160服务器上)
#启动时报错
问题:
=INFO REPORT====27-Jun-2013::13:34:38 ===
Error description:
{could_not_start_tcp_listener,{"192.168.0.107",5672}}
解决办法:
[root@gyv7 sbin]#netstat -anpl | grep 5672
tcp 0 0 0.0.0.0:5672 0.0.0.0:* LISTEN 1595/qpidd
[root@gyv7 sbin]#service qpidd stop
Stopping Qpid AMQPdaemon: [ OK ]
[root@gyv7 sbin]#chkconfig --level 35 qpidd off
3. 其他命令与测试程序(perl[含环境配置])
3.1 测试前准备
#创建测试程序目录并进入
[root@linuxblind zdh]# mkdir /u1/scripts;cd /u1/scripts
#创建vhost
[root@linuxblind scripts]# /usr/local/rabbitmq/sbin/rabbitmqctl \
add_vhost /pyhtest
#创建用户及密码
[root@linuxblind scripts]# /usr/local/rabbitmq/sbin/rabbitmqctl \
add_user pyh pyh1234
#设置pyh用户对/pyhtest这个vhost拥有全部权限
[root@linuxblind scripts]# /usr/local/rabbitmq/sbin/rabbitmqctl \
set_permissions -p /pyhtest pyh “.*” “.*” “.*”
#更多命令
[root@linuxblind scripts]# /usr/local/rabbitmq/sbin/rabbitmqctl –help
[ 注:后面三个”*”代表pyh用户拥有对/pyhtest的配置、写、读全部权限]
3.2 测试环境配置
[root@linuxblindscripts]# wget \
[root@linuxblindscripts]# tar zxf Net-RabbitMQ-0.2.0.tar.gz
[root@linuxblindscripts]# cd Net-RabbitMQ-0.2.0
[root@linuxblindscripts]# perl Makefile.PL
[root@linuxblindscripts]# make && make install
[root@linuxblindscripts]# wget \
http://66.39.76.93/authors/id/C/CA/CAUGUSTIN/UUID-Tiny-1.03.tar.gz
[root@linuxblind scripts]# tar zxfUUID-Tiny-1.03.tar.gz
[root@linuxblindscripts]# cd UUID-Tiny-1.03
[root@linuxblindscripts]# perl Makefile.PL
[root@linuxblindscripts]# make && make install
3.3 测试程序
[root@linuxblindscripts]# cat producer.pl
#!/usr/bin/perl
use strict;
use Net::RabbitMQ;
use UUID::Tiny;
my $channel = 1000; #channel ID,可以随意指定,只要不冲突
my $queuename ="pyh_queue"; #队列名
my $exchange ="pyh_exchange"; #交换机名
my $routing_key ="test"; #routingkey
my $mq =Net::RabbitMQ->new(); #创建一个RabbitMQ对象
# 建立连接
$mq->connect("localhost",{vhost=>"/pyhtest",user=>"pyh",password=>"pyh1234"});
$mq->channel_open($channel); # 打开一个channel
$mq->exchange_declare($channel,$exchange,{durable=>1}); # 声明一个持久化的交换机
$mq->queue_declare($channel,$queuename,{durable=>1}); # 声明一个持久化的队列
# 使用routing key在交换机和队列间建立绑定
$mq->queue_bind($channel,$queuename,$exchange,$routing_key);
for(my$i=0;$i<1000;$i++){
my $string = create_UUID_as_string(UUID_V1); # 产生一条UUID作为消息主体
# 将消息结合key以持久化模式投递到交换机
$mq->publish($channel,$routing_key,$string,{exchange=>$exchange},{delivery_mode=>2});
}
$mq->disconnect();
[root@linuxblindscripts]#catconsumer.pl
#!/usr/bin/perl
use strict;
use Net::RabbitMQ;
my $channel = 1001;
my $queuename ="pyh_queue";
my $mq = Net::RabbitMQ->new();
$mq->connect("localhost",{vhost=>"/pyhtest",user=>"pyh",password=>"pyh1234"});
$mq->channel_open($channel);
while(1){
my $hashref =$mq->get($channel,$queuename);
last unless defined $hashref;
print$hashref->{message_count},":",$hashref->{body},"\n";
}
$mq->disconnect();
#查看消息队列数
[root@linuxblind sbin]# ./rabbitmqctllist_queues -p /pyhtest
Listing queues ...
pyh_queue 100000
...done.
[ 结果在/usr/local/rabbitmq/var/lib/rabbitmq/mnesia/rabbit@linuxblind/msg_store_persistent目录下产生240K 0.rdq文件; 并且在页面可以查看msg的生产和消费的变化]
三.附录
RabbitMQ官网:
CPAN官网:
Erlang官网: