一、缘由
为了保证rabbitMQ服务的可用性,我们一般会将mq服务配置成集群形式,从而保证在某个节点宕机后,服务依旧可用。在本篇文章中主要介绍集群的搭建以及搭建过程中的问题以及解决。搭建普通集群、搭建镜像集群、卸载rabbitmq服务
这里实现多机的集群节点
二、操作
1、前期准备
1、配置host
笔者这里准备了两台机器,在这两台机器上的/etc/sysconfig/iptables中配置两台主机的dns服务,注意下面的配置在两台主机上都要进行配置。后面的aaa、bbb 最好是自己本机的hostname (解释 配置这两个的原因是便于两台机器互相解析通信 。)
192.168.47.132 aaa
192.168.47.135 bbb
2、统一cookie
将两个机器上的erlang.cookie 进行统一(集群之间的通讯使用该cookie)
(RabbitMQ底层是通过Erlang架构来实现的,所以rabbitmqctl会启动Erlang节点,并基于Erlang节点来使用Erlang系统连接RabbitMQ节点,在连接过程中需要正确的Erlang Cookie和节点名称,Erlang节点通过交换Erlang Cookie以获得认证)来实现的。(注意.erlang.cookie 需要保持其中的所属组和权限信息)
#远程复制
scp [email protected]:/var/lib/rabbitmq/.erlang.cookie /var/lib/rabbitmq/.erlang.cookie
#然后再进行更改
#更新完cookie后 重新再启动该节点会出错(可能是因为破坏了.erlang.cookie文件的权限以及所属组信息)
#如下恢复其原来的.erlang.cookie文件
chown rabbitmq:rabbitmq .erlang.cookie
chmod 400 .erlang.cookie
注意点
两个机器rabbitmq节点名称一致情况下的集群 无法搭建 需要修改主机名 自行解决
我的是centos 所以需要需改 /etc/hostname 即可
为什么会一样呢。因为rabbitmq的默认节点名称为rabbit@hostname
关闭防火墙
service iptables stop
2、普通集群
两个rabbitmq服务在两台机器上已经搭建成功,有关rabbitmq搭建教程请参考我的另一篇博文https://blog.csdn.net/liushangzaibeijing/article/details/81700804
1、查看两个节点均正常启动
查看aaa机器上的rabbitmq服务(显示正常)
#查看aaa 的rabbitmq节点正常运行
[root@xieqx /]# /sbin/service rabbitmq-server status
Redirecting to /bin/systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since 日 2018-09-02 11:56:35 CST; 4min 8s ago
Main PID: 79072 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─79072 /usr/lib64/erlang/erts-10.0.5/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 1280000 -K ...
├─79397 erl_child_setup 1024
├─79415 inet_gethost 4
└─79416 inet_gethost 4
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ## ##
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ## ## RabbitMQ 3.7.7. Copyright (C) 2007-2018 Pivotal Software, Inc.
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ########## Licensed under the MPL. See http://www.rabbitmq.com/
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ###### ##
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ########## Logs: /var/log/rabbitmq/[email protected]
9月 02 11:56:33 xieqx rabbitmq-server[79072]: /var/log/rabbitmq/rabbit@xieqx_upgrade.log
9月 02 11:56:33 xieqx rabbitmq-server[79072]: Starting broker...
9月 02 11:56:35 xieqx rabbitmq-server[79072]: systemd unit for activation check: "rabbitmq-server.service"
9月 02 11:56:35 xieqx systemd[1]: Started RabbitMQ broker.
9月 02 11:56:35 xieqx rabbitmq-server[79072]: completed with 3 plugins.
查看bbb机器上的rabbitmq服务(显示正常)
#查看bbb 的rabbitmq节点正常运行
[root@xieqx /]# /sbin/service rabbitmq-server status
Redirecting to /bin/systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since 日 2018-09-02 11:56:35 CST; 4min 8s ago
Main PID: 79072 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─79072 /usr/lib64/erlang/erts-10.0.5/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000 -stbt db -zdbbl 1280000 -K ...
├─79397 erl_child_setup 1024
├─79415 inet_gethost 4
└─79416 inet_gethost 4
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ## ##
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ## ## RabbitMQ 3.7.7. Copyright (C) 2007-2018 Pivotal Software, Inc.
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ########## Licensed under the MPL. See http://www.rabbitmq.com/
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ###### ##
9月 02 11:56:33 xieqx rabbitmq-server[79072]: ########## Logs: /var/log/rabbitmq/[email protected]
9月 02 11:56:33 xieqx rabbitmq-server[79072]: /var/log/rabbitmq/rabbit@xieqx_upgrade.log
9月 02 11:56:33 xieqx rabbitmq-server[79072]: Starting broker...
9月 02 11:56:35 xieqx rabbitmq-server[79072]: systemd unit for activation check: "rabbitmq-server.service"
9月 02 11:56:35 xieqx systemd[1]: Started RabbitMQ broker.
9月 02 11:56:35 xieqx rabbitmq-server[79072]: completed with 3 plugins.
将bbb机器的所在的rabbitmq服务添加到aaa所在的集群中
#停止aaa机器上的rabbitmq服务(不是erlang节点)
[root@aaa /]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@aaa ...
#将bbb 节点加入到aaa中 --ram 表示该节点为内存节点 --disc 标识 磁盘节点
rabbitmqctl join_cluster --ram rabbit@bbb
Clustering node rabbit@aaa with rabbit@bbb
#启动aaa 节点 rabbitmq服务
[root@aaa /]# rabbitmqctl start_app
Starting node rabbit@aaa ...
completed with 3 plugins.
#查看集群状态
[root@aaa /]# rabbitmqctl cluster_status
Cluster status of node rabbit@aaa ...
[{nodes,[{disc,[rabbit@bbb]},{ram,[rabbit@aaa]}]},
{running_nodes,[rabbit@bbb,rabbit@aaa]},
{cluster_name,<<"rabbit@aaa">>},
{partitions,[]},
{alarms,[{rabbit@bbb,[]},{rabbit@aaa,[]}]}]
普通集群的真实的消息信息是存放在一个节点中的,其他节点只是保存队列结构的元数据信息以及与存放消息实体节点的链接,集群的工作模式为:假设 有a,b,c三个节点 a节点存放消息实体 当客户端连接到b消费的时候,因为b没有消息信息,所以a和b会建立临时连接,将a的消息传输到b 再由客户端消费。
这样做 当b节点崩溃后,服务依旧可用,但是当a不可用的时候,整个服务不可用(想要高可用,需要参考下面的镜像集群)
3、镜像集群
#设置队列为镜像模式
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
参数意思为:
ha-all:为策略名称。
^:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue。
ha-mode:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如["3rabbit@F","rabbit@G"]这样指定为F与G这2台机器。)。
4、卸载rabbitmq服务
#查询安装的rabbitMQ的安装包
rpm -qa | grep rabbit
rabbitmq-server-3.7.7-1.el7.noarch
#删除查询出来的rpm包
rpm -e rabbitmq-server-3.7.7-1.el7.noarch
#查询与rabbitmq相关的包 并进行删除
find / -name rabbitmq
#删除
rm -rf /run/rabbitmq /etc/rabbitmq /var/lib/rabbitmq /var/log/rabbitmq ...等多个文件
5、移除集群节点
#节点自动离开集群 注意应该只能是内存节点离开集群,如果是集群中唯一一个磁盘节点要主动离开集群,可以认为集群崩溃了,(单实例rabbitmq服务一定是一个磁盘节点,将队列的元数据信息保存在磁盘中 同理内存节点是将队列等元数据信息存放在内存中)
#停止要移除的节点
rabbitmqctl stop_app
#重置节点信息
#会将用户等信息进行初始化
rabbitmqctl reset
#则该节点已经移除成功