因为RabbitMQ是基于Erlang语言开发,因此在安装RabbitMQ以前,须要先安装Erlang。好在RabbitMQ官网已经为咱们提供了Erlang的安装包html
Erlang下载地址:http://www.rabbitmq.com/releases/erlang/node
本人使用的操做系统为:CentOS7web
下载的Erlang安装包为:erlang-19.0.4-1.el7.centos.x86_64.rpm正则表达式
RabbitMQ下载地址:https://www.rabbitmq.com/download.htmlcentos
下载的RabbitMQ安装包为:rabbitmq-server-3.6.8-1.el7.noarch.rpm浏览器
将下载的两个文件上传到/usr/local目录,先安装Erlang安全
yum install erlang-19.0.4-1.el7.centos.x86_64.rpm
测试Erlang是否安装成功服务器
erl -version
出现如下信息则表示安装成功:Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 8.0.3websocket
安装RabbitMQcookie
yum install rabbitmq-server-3.6.8-1.el7.noarch.rpm
运行RabbitMQ
cd /usr/sbin
./rabbitmq-server start
出现如下信息,则表示启动成功:
RabbitMQ 3.6.8. Copyright (C) 2007-2016 Pivotal Software, Inc.
## ## Licensed under the MPL. See http://www.rabbitmq.com/
## ##
########## Logs: /var/log/rabbitmq/rabbit@mq01.log
###### ## /var/log/rabbitmq/rabbit@mq01-sasl.log
##########
Starting broker...
completed with 0 plugins.
后台启动可以使用:
./rabbitmq-server -detached
中止服务可以使用:
./rabbitmqctl stop
查看目前RabbitMQ已安装的插件
cd /usr/sbin
./rabbitmq-plugins list
./rabbitmq-plugins enable rabbitmq_management
安装成功后,启动MQ
经过浏览器访问地址:http://192.168.120.129:15672/#/
因为guest用户被限制,只能经过localhost访问,所以咱们须要新建一个用户,并授予管理员权限。
新建一个用户名为admin,密码为admin的用户,并授予管理员(administrator)权限
./rabbitmqctl add_user admin admin
./rabbitmqctl set_user_tags admin administrator
./rabbitmq-plugins enable rabbitmq_mqtt
./rabbitmq-plugins enable rabbitmq_web_stomp
./rabbitmq-plugins enable rabbitmq_web_stomp_examples
若是须要修改RabbitMQ的默认配置,先查找配置文件样例位置
find / -name "rabbitmq.config.example"
而后将样例配置复制到制定目录
cp /usr/share/doc/rabbitmq-server-3.6.8/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
修改样例文件,并保存,重启MQ生效。
主要是set_permissions的使用,先看下命令的格式:
set_permissions [-p vhost] {user} {conf} {write} {read}
首先须要注意如下几点的理解:
1.这里的权限,只是针对通常用户的访问权限,注意和角色的区分。举个例子来讲,非管理用户(普通用户),角色设置为none,而后在这里配置conf、write、read的权限。
2.conf、write、read采用正则表达式,这里的正则主要是针对exchange和queue。主要2种特殊的表达式:
^$:表示彻底不匹配(即没有权限)
.*:表示匹配全部(即全部权限)
若是使用RabbitMQ做为消息推送服务,须要授予用户只读访问Stomp主题权限,同时授予另外一个用户对同一主题的读写访问权限。
这样的话主题订阅者就不能发布消息,从而解决安全性问题。
可是若是直接这样受权:
rabbitmqctl set_permissions read-only-user '.*' '^$' '.*'
会报以下错误:
ERROR message:access_refused content-type:text/plain version:1.0,1.1,1.2 content-length:114 ACCESS_REFUSED - access to queue 'stomp-subscription-APK3zkvXFqxvSiZ9ztmxYQ' in vhost '/' refused for user 'test'
Whoops! Lost connection to ws://221.0.200.202:15674/ws
这样配置存在一个问题,将阻止任何写入,阻止任何写入将致使没有权限链接到RabbitMQ的服务
须要对可读用户权限作以下调整:
rabbitmqctl set_permissions read-only-user '^stomp-subscription.*$' '^stomp-subscription.*$' '.*'
RabbitMQ集群模式分为两种:普通模式,镜像模式(HA)
对于Queue来讲,消息实体只存在于其中一个节点,A、B两个节点仅有相同的元数据,即队列结构。
当消息进入A节点的Queue中后,consumer从B节点拉取时,RabbitMQ会临时在A、B间进行消息传输,把A中的消息实体取出并通过B发送给consumer。
因此consumer应尽可能链接每个节点,从中取消息。即对于同一个逻辑队列,要在多个节点创建物理Queue。不然不管consumer连A或B,出口总在A,会产生瓶颈。
该模式存在一个问题就是当A节点故障后,B节点没法取到A节点中还未消费的消息实体。
若是作了消息持久化,那么得等A节点恢复,而后才可被消费;若是没有持久化的话,而后就没有而后了……
该模式解决了上述问题,其实质和普通模式不一样之处在于,消息实体会主动在镜像节点间同步,而不是在consumer取数据时临时拉取。
该模式带来的反作用也很明显,除了下降系统性能外,若是镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通信大大消耗掉。
因此在对可靠性要求较高的场合中适用。
咱们准备了两台服务器,系统为Centos7,对应的ip跟hostname分别为
192.168.1.242 mq01 192.168.1.243 mq02
在安装好的两台节点服务器中,分别修改/etc/hosts文件,指定mq01,mq02的hosts,如:
192.168.1.242 mq01 192.168.1.243 mq02
注意:hostname文件也要正确,分别是mq0一、mq02,若是修改hostname建议在安装rabbitmq前修改。
Rabbitmq的集群是依赖于erlang的集群来工做的,因此必须先构建起erlang的集群环境。Erlang的集群中各节点是经过一个magic cookie来实现的,这个cookie存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是400的权限。因此必须保证各节点cookie保持一致,不然节点之间就没法通讯。
查看文件权限的命令为:
ls -l /var/lib/rabbitmq/.erlang.cookie
这里将 mq01的 /var/lib/rabbitmq/.erlang.cookie文件复制到 mq02,因为这个文件权限是 400,因此须要先修改该文件权限为 777:
chmod 777 /var/lib/rabbitmq/.erlang.cookie
使用scp或其余方式将该文件复制到mq02服务器的相同目录,并覆盖。
而后将mq01的 /var/lib/rabbitmq/.erlang.cookie文件权限修改回来
chmod 400 /var/lib/rabbitmq/.erlang.cookie
重启RabbitMQ服务:
rabbitmqctl stop
rabbitmq-server -detached
将mq02与mq01组成集群:
./rabbitmqctl stop_app ./rabbitmqctl join_cluster rabbit@mq01
./rabbitmqctl stop
./rabbitmq-server -detached
若是要使用内存节点,则可使用--ram:
rabbitmqctl join_cluster --ram rabbit@mq01
查看集群是否配置成功:
rabbitmqctl cluster_status
上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些能够复制到集群里的任何一个节点,可是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接致使该队列没法使用,只能等待重启,因此要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每一个节点,须要建立镜像队列。
在任意一个节点上执行:
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
将全部队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直。
若是要为制定的vhost建立策略则使用-p:
rabbitmqctl set_policy -p hrsystem ha-allqueue"^" '{"ha-mode":"all"}'
这行命令在vhost名称为hrsystem建立了一个策略,策略名称为ha-allqueue,策略模式为 all 即复制到全部节点,包含新增节点,
策略正则表达式为 “^” 表示全部匹配全部队列名称。
例如rabbitmqctl set_policy -p hrsystem ha-allqueue "^message" '{"ha-mode":"all"}'
注意:"
^message" 这个规则要根据本身修改,这个是指同步"message"开头的队列名称,咱们配置时使用的应用于全部队列,因此表达式为"^"
在 服务器上安装 HAProxy,而后修改
/etc/haproxy/haproxy.cfg:
listen rabbitmq_cluster 0.0.0.0:5672 mode tcp balance roundrobin server node1 192.168.1.242:5672 check inter 2000 rise 2 fall 3 server node2 192.168.1.243:5672 check inter 2000 rise 2 fall 3