RabbitMQ安装配置文档

一.rabbitMQ介绍

1.简单说明

RabbitMQ是流行的开源消息队列系统,用erlang语言开发;它是AMQP(高级消息队列协议)的标准实现,是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议


2.实现模式图

214045288.jpg


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,在exchangequeue之间建立好绑定关系。
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个部分:
  (1exchange持久化,在声明时指定durable => 1
  (2queue持久化,在声明时指定durable => 1
  (3)消息持久化,在投递时指定delivery_mode => 21是非持久化)

如果exchangequeue都是持久化的,那么它们之间的binding也是持久化的。如果exchangequeue两者之间有一个持久化,一个非持久化,就不允许建立绑定。

二.安装配置

1.RabbitMQ安装与配置

[root@linuxblind zdh]# wget -O /etc/yum.repos.d/epel-erlang.repo \

http://binaries.erlang-solutions.com/rpm/centos/erlang_solutions.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 \

http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.1/rabbitmq-server-generic-unix-3.1.1.tar.gz

[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服务的启动与关闭

#启动管理界面:http://ip:15672/初始用户名: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 \

http://search.cpan.org/CPAN/authors/id/J/JE/JESUS/Net-RabbitMQ-0.2.0.tar.gz

[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文件; 并且在http://192.168.245.129:15672/#/页面可以查看msg的生产和消费的变化]


三.附录

RabbitMQ官网:http://www.rabbitmq.com/

CPAN官网:http://search.cpan.org/

Erlang官网:http://www.erlang.org/