Rabbitmq集群搭建
2019-04-10 本文已影响0人
Miracle001
rabbitmq普通集群配置
准备
镜像: centos7.5 1804
网络: NAT+仅主机
192.168.25.x
192.168.50.x
yum源: 额外安装了一个epel源,网上下载该包
3台主机都操作
vim /etc/hosts
192.168.25.11 node1.fgq.com node1
192.168.25.12 node2.fgq.com node2
192.168.25.13 node3.fgq.com node3
yum clean all
yum repolist
yum -y install rabbitmq-server
systemctl start rabbitmq-server
ss -ntl | grep -E "5672|4369"
ll /var/lib/rabbitmq/.erlang.cookie
node1
[root@node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie node2:/var/lib/rabbitmq/
[root@node1 ~]# scp /var/lib/rabbitmq/.erlang.cookie node3:/var/lib/rabbitmq/
3台主机都操作,以node1为例
[root@node1 ~]# rabbitmq-plugins list
[root@node1 ~]# rabbitmq-plugins enable rabbitmq_management
[root@node1 ~]# systemctl restart rabbitmq-server
[root@node1 ~]# ss -ntl | grep -E "5672|4369"
插件端口是15672
node2和node3都操作,以node2为例
[root@node2 ~]# rabbitmqctl stop_app
Stopping node rabbit@node2 ...
...done.
[root@node2 ~]# rabbitmqctl join_cluster --ram rabbit@node1
Clustering node rabbit@node2 with rabbit@node1 ...
...done.
[root@node2 ~]# rabbitmqctl start_app
Starting node rabbit@node2 ...
...done.
node1
[root@node1 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@node1 ...
[{nodes,[{disc,[rabbit@node1]},{ram,[rabbit@node3,rabbit@node2]}]},
{running_nodes,[rabbit@node3,rabbit@node2,rabbit@node1]},
{cluster_name,<<"rabbit@node1.fgq.com">>},
{partitions,[]}]
...done.
浏览器: http://192.168.25.11:15672/
默认账号:guest
默认密码:guest

创建一条队列

在RabbitMQ集群集群中,必须至少有一个磁盘节点,
否则队列元数据无法写入到集群中,
当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。

镜像集群配置
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,
尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。
虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,
所以要想在队列节点宕机或故障也能正常应用,
就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的,然后再添加一些策略,
所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。
设置的镜像队列可以通过开启的网页的管理端,也可以通过命令,
这里说的是其中的网页设置方式。
1.创建rabbitmq策略
在node1节点的控制台上创建策略
按照图中的内容根据自己的需求填写

Name:策略名称
Pattern:匹配的规则,这里表示匹配a开头的队列,如果是匹配所有的队列,那就是^.
Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。

http://192.168.25.12:15672/
http://192.168.25.13:15672/
此时分别登陆node2、node3两个节点的控制台,可以看到上面添加的这个策略,如图所示


2.添加队列

Name:队列名称
Durability:队列是否持久化
Node:消息队列的节点
Auto delete:自动删除
Arguments:使用的策略类型

将鼠标指向".+2"可以显示出另外两台消息节点。

3.创建消息



2-Persistent:表示持久化
Headers:随便填写即可
Properties:点击问号,选择一个消息ID号
Payload:消息内容

点击queue按钮,发现ab队列的Ready和Total中多了一条消息记录。

4.做破坏性测试
(1)将node1节点的服务关闭,再通过node2和node3查看消息记录是否还存在。
[root@node1 ~]# rabbitmqctl stop_app
Stopping node rabbit@node1 ...
...done.


从中可以看到ab队列已经从之前的+2显示成+1了,而且消息记录是存在的。
(2)再将node2节点的服务关闭,通过node3查看消息记录是否还存在
[root@node2 ~]# rabbitmqctl stop_app
Stopping node rabbit@node2 ...
...done.

从中可以看到ab队列和消息记录还是存在的,只是变成了一个节点了。
(3)将node1和node2的服务再启动起来
[root@node1 ~]# rabbitmqctl start_app
Starting node rabbit@node1 ...
...done.
[root@node2 ~]# rabbitmqctl start_app
Starting node rabbit@node2 ...
...done.

从中可以看到ab队列后面+2变成了粉色,鼠标指上去显示镜像无法同步。
如果这时候停掉node3节点的服务,那么队列里面的消息将会丢失。
采取的解决办法是选择在node2节点上执行同步命令。
[root@node2 ~]# rabbitmqctl sync_queue ab
Synchronising queue 'ab' in vhost '/' ...
...done.

同步完成后,+2又变成了蓝色。
这样,我们就测试了rabbitmq集群的破坏性测试,说明集群配置成功。
参考文章
https://blog.51cto.com/11134648/2155934