RabbitMQ是目前流行的开源消息队列系统。MQ(消息队列)是一种应用程序对应用程序的通讯方法。前端
在一个集群里,有三台服务器,其中一台使用磁盘模式,另两台使用内存模式。两台内存模式的节点无疑速度更快,所以经过客户端链接访问它们。可是客户端不可能分别链接两个内存节点,确定是经过前端反向代理去轮询分发请求若是担忧前端反向代理服务器故障,能够经过Keepalived软件作一个高可用架构。而磁盘模式的节点,因为磁盘IO相对较慢,所以仅做数据备份使用。node
注意:将三台服务器都链接上互联网并安装软件包。另外RabbitMQ集群节点必须在同一个网段里,若是是跨广域网,效果就会变差。git
1.配置三个节点的host文件,将如下内容分别加入到三台服务器上。web
rabbitmq01: [root@localhost ~]# vim /etc/hostname mq01.localdomain [root@localhost ~]# vim /etc/hosts 192.168.126.138 mq01 #注意-主机名称也要更改 192.168.126.133 mq02 192.168.126.141 mq03 rabbitmq02: [root@localhost ~]# vim /etc/hostname mq02.localdomain [root@localhost ~]# vim /etc/hosts 192.168.126.138 mq01 192.168.126.133 mq02 192.168.126.141 mq03 rabbitmq03: [root@localhost ~]# vim /etc/hostname mq03.localdomain [root@localhost ~]# vim /etc/hosts 192.168.126.138 mq01 192.168.126.133 mq02 192.168.126.141 mq03
2.关闭三台服务器的防火墙而且重启虚拟机便于系统识别vim
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 [root@localhost ~]# init 6 #重启
3.准备好YUM源以后,就能够直接使用yum命令安装rabbitmq到三台服务器上。浏览器
[root@mq01 ~]# yum install epel-release -y [root@mq01 ~]# yum install rabbitmq-server -y [root@mq01 ~]# ln -s /usr/lib/rabbitmq/bin/* /usr/bin/
4.分别查看三个节点并添加管理服务服务器
[root@mq01 ~]# cd /usr/lib/rabbitmq/bin/ [root@mq01 bin]# ls rabbitmqctl rabbitmq-env rabbitmq-server rabbitmq-defaults rabbitmq-plugins [root@mq01 bin]# rabbitmq-plugins list #查看插件安装状况 [ ] amqp_client 3.3.5 [ ] cowboy 0.5.0-rmq3.3.5-git4b93c2d [ ] eldap 3.3.5-gite309de4 [ ] mochiweb 2.7.0-rmq3.3.5-git680dba8 [ ] rabbitmq_amqp1_0 3.3.5 [ ] rabbitmq_auth_backend_ldap 3.3.5 .......//省略 [root@mq01 bin]# rabbitmq-plugins enable rabbitmq_management #启用管理服务 The following plugins have been enabled: mochiweb webmachine rabbitmq_web_dispatch #网络调度 amqp_client rabbitmq_management_agent rabbitmq_management Plugin configuration has changed. Restart RabbitMQ for changes to take effect. #插件配置发生了变化。从新启动RabbitMQ以使更改生效。
5.启动rabbitmq服务,使用netstat -an | grep 5672进行查看,有以下三个端口开放说明正常。cookie
[root@mq01 bin]# systemctl start rabbitmq-server.service [root@mq01 bin]# netstat -an | grep 5672 tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN tcp6 0 0 :::5672 参数注解: 15672和25672是rabbitmq的管理端口 5672是生产者、消费者通讯的端口
6.检查三台的集群状态网络
[root@mq01 bin]# rabbitmqctl cluster_status Cluster status of node rabbit@mq01 ... #目前相互独立,没有造成集群 [{nodes,[{disc,[rabbit@mq01]}]}, {running_nodes,[rabbit@mq01]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}] ...done.
7.中止三台服务器的rabbitmq服务架构
[root@mq01 bin]# systemctl stop rabbitmq-server.service
8.在三台服务器上构建Erlang的集群环境
[root@mq01 bin]# vim /var/lib/rabbitmq/.erlang.cookie GYIIPFNYPZITHCELVPZU
注意: 在Erlang的集群中,各节点是经过一个magic cookie来实现的,这个coolie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。因此必须保证各节cookie保持一致,不然节点间就没法通讯!
9.开启rabbitmq服务
[root@mq01 bin]# systemctl start rabbitmq-server.service
10.将rabbitmq0二、rabbitmq03做为内存节点与rabbitmq01磁盘节点链接起来。
rabbitmq02: [root@mq02 bin]# rabbitmqctl stop_app #中止rabbitmq [root@mq02 bin]# rabbitmqctl join_cluster --ram rabbit@mq01 #将mq02链接到mq01,成为一个集群 Clustering node rabbit@mq02 with rabbit@mq01 ... ...done. [root@mq02 bin]# rabbitmqctl start_app #开启rabbitmq [root@mq02 bin]# rabbitmqctl cluster_status #验证群集状态 Cluster status of node rabbit@mq02 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq02]}]}, {running_nodes,[rabbit@mq01,rabbit@mq02]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}] ...done. rabbitmq03: [root@mq03 bin]# rabbitmqctl cluster_status #验证群集 Cluster status of node rabbit@mq03 ... [{nodes,[{disc,[rabbit@mq01]},{ram,[rabbit@mq03,rabbit@mq02]}]}, {running_nodes,[rabbit@mq02,rabbit@mq01,rabbit@mq03]}, {cluster_name,<<"rabbit@mq01">>}, {partitions,[]}] ...done. #验证成功
11.打开浏览器访问http://192.168.126.138:15672/ #默认用户名:guest 密码:guest
1).点击右边的policies按钮,建立策略。
参数注释: Name:策略名称 pattern:匹配的规则 Definition:使用ha-mode模式中的all,也就是同步因此匹配的队列。‘?’类型与帮助文档 Priority:优先级,默认为0,值越大优先级越大。
2)在任意一台节点上添加一个Queues队列,点击Queues按钮,输入name、Arguments的值,别的值按其默认就好,如图所示:
参数注解: Name:队列的名称 Durability:队列是否持久化(Durable持久化) Node:消息队列的节点 Auto delete:自动删除 Arguments:使用的策略类型
3)再建立一个队列,分别在两个队列里建立一条消息。点击aa、ht队列按钮,选择Publish Message建立消息。
参数注解: 2-Persistent:持久化,反之上面显示非持久化 Headers:随意填写便可 Properties:点击问号,选择一个消息ID
4)进行破坏性测试看看群集效果是否成功。
将rabbitmq01节点关闭,再经过mq0二、mq03查看消息记录是否还存在。
[root@mq01 ~]# systemctl stop rabbitmq-server.service
如图所示:
从上图能够看到ht队列已经不存在了,说明没有作镜像模式。而aa队列已经从以前的+2显示成+1了,并且消息仍是存在的。
再将mq02节点的服务关闭,经过mq03查看消息记录是否还存在。如图所示:
[root@mq02 ~]# systemctl stop rabbitmq-server.service
将mq0一、mq02节点的服务启动,看到aa队列后面的+2变成粉色,鼠标指上去显示镜像没法同步。若是这个时候将mq03节点的服务中止,那么队列里的消息将会丢失。
在mq02节点服务器上执行rabbitmqctl sync_queue aa,同步完成后+2变成蓝色。如图所示:
[root@mq02 ~]# rabbitmqctl sync_queue aa
5)查看队列在服务器上的位置,如图所示,一个目录对应的就是一个队列,里面就是该队列自己的消息。注意若是内存节点故障,队列就会丢失;若是是磁盘节点故障,队列还会存在。但若是是建立队列时指定了ha参数,带修复磁盘节点故障后,再启动磁盘节点的rabbitmq服务,未消费的队列及消息会不存在,须要手动执行同步队列命令。
[root@mq01 ~]# ll /var/lib/rabbitmq/mnesia/rabbit\@mq01/queues/ 总用量 0 drwxr-xr-x. 2 rabbitmq rabbitmq 38 8月 1 15:07 81NI5XJ4KZDI2KGNS7MV3CP7T drwxr-xr-x. 2 rabbitmq rabbitmq 38 8月 1 14:39 COUUYINKJGWZ16DIMV5GJZ5Z7
rabbitmq集群的破坏性测试成功,说明集群配置成功。
注意: 消息节点通常都是程序直接调用,去建立队列、消息等等。程序里面若是想使用消息高可用集群配置,那么代码须要指定ha参数,若是不指定x-ha-prolicy的话将没法复制。