RabbitMQ安装部署

安装Erlang
RabbitMQ是由Erlang编写的,所以需要先安装Erlang。RabbitMQ官方提供了一个足够RabbitMQ使用的Erlang的rpm,可以这样安装:

wget https://www.rabbitmq.com/releases/erlang/erlang-17.4-1.el6.x86_64.rpm
rpm -i erlang-17.4-1.el6.x86_64.rpm

安装RabbitMQ
RabbitMQ的安装非常简单,只需要下载tar包即可。

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/rabbitmq_v3_5_3/rabbitmq-server-generic-unix-3.5.3.tar.gz
tar zxvf rabbitmq-server-generic-unix-3.5.3.tar.gz
启动/关闭RabbitMQ服务
sbin/rabbitmq-server -detached
sbin/rabbitctl stop #关闭服务

端口配置
如果需要建立RabbitMQ集群,需要打开下面的端口:
4369 (epmd), 25672 (Erlang distribution)
5672 (AMQP 0-9-1 without TLS)
一些插件还需要打开额外的端口,暂时不需要。例如rabbitmq-management需要打开15672端口(推荐打开)。

iptables -I INPUT 1 -p tcp –dport 5672 -j ACCEPT
iptables -I INPUT 1 -p tcp –dport 4369 -j ACCEPT
iptables -I INPUT 1 -p tcp –dport 25672 -j ACCEPT
iptables -I INPUT 1 -p tcp –dport 15672 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart

建立集群
官方文档在此https://www.rabbitmq.com/clustering.html

  1. 需要在多台机器上部署RabbitMQ,并保证上面提到的端口没有被防火墙盾掉。注意,不需要每台机器去配置vhost、exchange、queue等等,待建立集群后在任意一节点上创建就好了。
  2. 将一个节点的/var/lib/rabbitmq/.erlang.cookie(如果该目录无权限则在$HOME下)拷贝到其它节点对应的位置,注意权限要保持一致400(即启动rabbitmq的用户下400)。另外,在每个节点上要保证可以通过短hostname(hostname -s来查看)来找到对应的ip地址,所以需要修通/etc/hosts文件,将所有节点的hostname和ip添加到该文件里。
  3. 以任意一个节点为主节点(例如rabbit1),在非主节点节点上执行下面操作:
rabbit2$ sbin/rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
rabbit2$ sbin/rabbitmqctl join_cluster rabbit@rabbit1
Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
rabbit2$ sbin/rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.

这样rabbit2上的节点就与rabbit1上的节点组成一个cluster。在其它非主节点上依次执行上面的操作即可。

查看集群状态:sbin/rabbitmqctl cluster_status
停止某个节点:在对应节点上执行sbin/rabbitmqctl stop
某个节点退出:在对应节点上执行sbin/rabbitmqctl stop_app;sbin/rabbitmqctl reset;sbin/rabbitmqctl start_app

hostname的问题
RabbitMQ直接读取hostname来写数据,如果hostname变了RabbitMQ会重新建立一个新的数据库。

单个节点异常后如何恢复
前提必须保证 /var/lib/rabbitmq/.erlang.cookie一致

rabbitmqctl stop_app;rabbitmqctl update_cluster_nodes rabbit@hostname;rabbitmqctl start_app

用户配置
RabbitMQ默认的用户名密码为guest:guest,这个用户只能在localhost环境下使用,不能远程使用。RabbitMQ大部分配置都可以用sbin/rabbitmqctl完成,可以参考https://www.rabbitmq.com/man/rabbitmqctl.1.man.html。

增加用户:sbin/rabbitmqctl add_user user-name this-is-the-password
删除用户:sbin/rabbitmqctl delete_user user-name
更改密码:sbin/rabbitmqctl change_password user-name new-password
列举所有用户:sbin/rabbitmqctl list_users
为用户打tag:sbin/rabbitmqctl set_user_tags production monitoring

virtual host
RabbitMQ设计了virtual host这个概念,类似于文件系统的不同路径。一个应用是将同一组服务器给线上、线下使用,这时候可以建立两个不同的virtual host,它们相互不影响。

增加virtual host:sbin/rabbitmqctl add_vhost vhost-path
删除virtual host:sbin/rabbitmqctl delete_vhost vhost-path
列举所有virtual host:sbin/rabbitmqctl list_vhosts

设置用户权限

sbin/rabbitmqctl set_permissions [-p vhostpath] user-name conf-regex write-regex read-regex
这个命令可以指定virtual host路径,跟前面提到的对应。需要注意的是后三个参数均为正则表达式,conf控制配置权限,write控制写权限,read控制读权限。例如:
rabbitmqctl set_permissions -p /myvhost tonyg "^tonyg-.*" ".*" ".*"
这个命令配置用户tonyg只能配置以tongyg-开头的资源,但可以读写所有资源。
清空权限:sbin/rabbitmqctl clear_permissions [-p vhostpath] user-name
列举所有用户权限:sbin/rabbitmqctl list_permissions [-p vhostpath]
列举特定用户权限:sbin/rabbitmqctl list_user_permissions user-name

设置服务规则
一个RabbitMQ cluster中所有节点都共享访问user、vhost、queue、exchange等等,其中queue默认只在创建的node上保存,虽然其他节点可以访问这个queue,但如果创建节点down掉就没法访问了。一个解决方案是让队列在多个节点上备份。关于High availability的配置参考https://www.rabbitmq.com/ha.html
一个常用的policy是

sbin/rabbitmqctl [-p vhostpath] set_policy ha-all ".*" '{"ha-mode":"all"}'
这将所有queue都设置为全节点备份,在小规模的cluster中是可行的。 **文件位置** RabbitMQ默认把所有相关文件都保存在安装目录下,一些常用的目录包括: * sbin目录保存控制服务的可执行脚本; * etc目录保存配置文件; * var目录保存服务日志文件; **PHP client库部署** RabbitMQ有多个PHP client实现,其官方tutorial对应的库是https://github.com/videlalvaro/php-amqplib。php-amqplib是一个完全用PHP实现的库。安装方法见github说明文档。 **维护** RabbitMQ自带rabbitmq_management 插件可以用来监控队列状态。https://www.rabbitmq.com/management.html
打开插件:sbin/rabbitmq-plugins enable rabbitmq_management
关闭插件:sbin/rabbitmq-plugins disable rabbitmq_management