RabbitMQ之集群搭建管理

本文详细介绍了RabbitMQ集群的搭建步骤,包括修改主机名、同步.erlang.cookie、集群搭建、镜像队列配置、节点类型管理、剔除节点、集群重启以及清除节点配置等关键操作。此外,还提到了相关命令的使用,如rabbitmqctl,确保高可用性和数据安全。
摘要由CSDN通过智能技术生成

1.环境准备

目前有3台虚拟机已安装了rabbitmq 参考 rabbitmq安装

修改主机名以便统一管理
192.168.8.128 yzm1
192.168.8.129 yzm2
192.168.8.130 yzm3

# 修改主机名
hostnamectl set-hostname yzm1
# 重启使新主机名生效
reboot

修改主机名导致rabbitmq数据丢失的处理方式,请参考 这一篇

修改hosts文件

vim /etc/hosts
# 内容
192.168.8.128 yzm1
192.168.8.129 yzm2
192.168.8.130 yzm3

在这里插入图片描述

2.同步.erlang.cookie

.erlang.cookie 文件相当于密钥令牌,集群中的 RabbitMQ 节点需要通过交换密钥令牌以获得相互认证,因此处于同一集群的所有节点需要具有相同的密钥令牌,否则在搭建过程中会出现 Authentication Fail 错误。

rabbitmq启动后, 会在路径 /var/lib/rabbitmq/ 或 $HOME/创建一个隐藏文件.erlang.cookie,通过 ls -al 命令查看。
ls -al /var/lib/rabbitmq/
在这里插入图片描述

同步.erlang.cookie文件前,关闭每台机器的rabbitmq服务
systemctl stop rabbitmq-server
通过scp同步
scp /var/lib/rabbitmq/.erlang.cookie root@yzm2:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie root@yzm2:/var/lib/rabbitmq/
在这里插入图片描述
查看yzm2、yzm3的.erlang.cookie文件内容跟yzm1的一致。
在这里插入图片描述

当前.erlang.cookie只有可读权限,新增可写权限
chmod 600 /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/

3.集群搭建

开通 EPMD 端口 epmd进程使用的端口。用于RabbitMQ节点和CLI工具的端点发现服务。

#开启防火墙 4369 端口
firewall-cmd --zone=public --add-port=4369/tcp --permanent
firewall-cmd --reload

# 或直接关闭防火墙
systemctl stop firewalld

开启服务(每台机器)

systemctl start rabbitmq-server

集群搭建,以yzm1为主节点,yzm2、yzm3作为副节点加入到yzm1主节点中
在yzm2、yzm3机器上执行以下命令:

# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态(会删除用户数据)
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@yzm1
# 4.启动服务
rabbitmqctl start_app

在这里插入图片描述
查看集群状态,在任意一台机器上输入以下命令

rabbitmqctl cluster_status

在这里插入图片描述
在页面上查看
在这里插入图片描述

4.镜像队列

所有队列开启镜像配置

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

符合正则匹配的队列开启镜像配置(以下配置只会对 ha 开头的队列进行镜像)

rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}'

复制系数
在上面我们指定了 ha-mode 的值为 all ,代表消息会被同步到所有节点的相同队列中。这里我们之所以这样配置,因为我们本身只有三个节点,因此复制操作的性能开销比较小。如果你的集群有很多节点,那么此时复制的性能开销就比较大,此时需要选择合适的复制系数。通常可以遵循过半写原则,即对于一个节点数为 n 的集群,只需要同步到 n/2+1 个节点上即可。此时需要同时修改镜像策略为 exactly,并指定复制系数 ha-params,示例命令如下:

rabbitmqctl set_policy ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

5.节点类型 ram disc

join_cluster 命令有一个可选的参数 --ram ,该参数代表新加入的节点是内存节点,默认是磁盘节点。如果是内存节点,则所有的队列、交换器、绑定关系、用户、访问权限和 vhost 的元数据都将存储在内存中,如果是磁盘节点,则存储在磁盘中。内存节点可以有更高的性能,但其重启后所有配置信息都会丢失,因此RabbitMQ 要求在集群中至少有一个磁盘节点,其他节点可以是内存节点。当内存节点离开集群时,它可以将变更通知到至少一个磁盘节点;然后在其重启时,再连接到磁盘节点上获取元数据信息。

更改yzm2的节点类型disk 为 ram

# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态(删除用户数据)
rabbitmqctl reset
# 3.节点加入
rabbitmqctl join_cluster rabbit@yzm1 --ram
# 4.重启服务 
rabbitmqctl start_app

在这里插入图片描述

# 查看集群状态
rabbitmqctl cluster_status

在这里插入图片描述

还可以通过change_cluster_node_type命令修改
修改yzm3为ram

# 1.停止服务
rabbitmqctl stop_app
# 2.变更类型 ram disc
rabbitmqctl change_cluster_node_type ram
# 3.重启服务
rabbitmqctl start_app

在这里插入图片描述

6.剔除节点

没有可以直接关闭整个集群的命令,需要逐一进行关闭。

yzm3节点自动退出

# 1.停止服务
rabbitmqctl stop_app
# 2.重置状态
rabbitmqctl reset

在这里插入图片描述

yzm2节点(需要先rabbitmqctl stop_app)被yzm1(正常运行的节点)踢出

rabbitmqctl forget_cluster_node rabbit@yzm2

在这里插入图片描述

7.集群重启

关闭顺序:先内存节点 后磁盘节点
启动顺序:先磁盘节点 后内存节点
重启需要确保第一个启动的是最后一个关闭的节点,如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败
重启过程可以发生的 一些故障问题,请参考 这篇

8.清除节点配置

# 正常退出
systemctl stop rabbitmq-server

# 如果遇到不能正常退出直接kill进程,查看进程
ps aux|grep rabbitmq
kill -9 端口

# 清楚节点rabbitmq配置
rm -rf /var/lib/rabbitmq/mnesia/*

# 确保mnesia目录的用户和组都是rabbitmq
chown rabbitmq:rabbitmq /var/lib/rabbitmq/mnesia

9.相关命令

  • rabbitmqctl stop_app
    表示终止RabbitMQ的应用,但是Erlang节点还在运行。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之前,例如 reset

  • rabbitmqctl reset
    表示设置RabbitMQ节点为原始状态。会从该节点所属的cluster中删除,从管理数据库中删除所有数据,例如配置的用户和vhost,还会删除所有的持久消息。

  • rabbitmqctl force_reset
    表示强制性地设置RabbitMQ节点为原始状态。它和reset的区别在于,可以忽略目前管理数据库的状态和cluster的配置,无条件的reset。该方法的使用,应当用在当数据库或者cluster配置损坏的情况下作为最后的方法。
    要想reset和force_reset操作执行成功,RabbitMQ应用需要处于停止状态,即执行过 stop_app

  • rabbitmqctl start_app
    表示启动RabbitMQ的应用。该命令典型的运行在一些需要RabbitMQ应用被停止的管理行为之后,例如 reset

  • rabbitmqctl join_cluster {clusternode} [–ram]
    表示结合到指定的集群,如果有参数 --ram 表示作为RAM节点结合到该集群中。
    集群节点有两种类型: disc 和 ram。disc类型,复制数据在磁盘上,在节点失效的情况下,提供了冗余保证,也能从一些全局事件中恢复,例如所有节点失效。ram类型,复制数据在内存上,主要表现在伸缩性上,特别是在管理资源(例如:增加删除队列,交换器,或者绑定)上表现突出。
    一个集群必须至少含有一个disc节点,但通常都多余一个。

  • rabbitmqctl cluster_status
    表示显示集群中的所有节点信息

  • rabbitmqctl change_cluster_node_type {disc|ram}
    表示改变节点的类型。该操作的正确执行,必定会停止该节点。并且在调整一个node为ram类型时,该节点不能为该集群的唯一node

  • rabbitmqctl forget_cluster_node [–offline]
    表示远程移除一个集群节点。要删除的节点必须脱机,如果没有脱机,需要使用 --offline 参数。当使用 --offline 参数时,rabbitmqctl不会去连接节点,而是暂时变成节点,以便进行变更。这在节点不能正常启动时非常有用。在这种情况下,节点会成为集群元数据的规范来源(例如哪些队列存在)。因此如果可以的话,应该使用此命令在最新的节点上关闭。
    –offline 参数使节点从脱机节点上移除。使用场景主要是在所有节点脱机,且最后一个节点无法联机时,从而防止整个集群启动。在其他情况不应该使用,否则会导致不一致。
    例如 rabbitmqctl -n A forget_cluster_node B
    上述命令将从节点 A 中移除节点 B

  • rabbitmqctl force_boot
    表示强制确保节点启动,即使该节点并不是最后down的。
    一般情况下,当你同时shut down了RabbitMQ集群时,第一个重启的节点应该是最后一个down掉的,因为它可能已经看到了其他节点发生的事情。但是有时候这并不可能:例如当整个集群lose power,那么该集群的所有节点会认为他们不是最后一个关闭的。
    如果最后down的节点永久的lost,那么应该优先使用 rabbitmqctl forget_cluster_node --offline ,因为这将确保在丢失节点上的镜像队列得到优先处理。

  • rabbitmqctl update_cluster_nodes {clusternode}
    表示指示已经集群的节点在唤醒时联系 {clusternode} 进行集群。这与 join_cluster 命令不同,因为它不加入任何集群,它是检查节点是否已经在具有 {clusternode} 的集群中。
    该命令的需求,是在当一个节点offline时,修改了集群节点的情形下。例如:节点A和B聚群,节点A offline了,节点C和B集群,并且B节点离开了该集群,那么当节点A起来的时候,A会尝试连接B,但是由于B节点已经不在该集群中,所以会失败。
    通过 rabbitmqctl -n A update_cluster_nodes C 将会解决上述问题。

  • rabbitmqctl sync_queue [-p vhost] {queue}
    {queue} 表示待同步的队列名称
    指引含有异步slaves的镜像队列去同步自身。当队列执行同步化时,其将会被锁定(指所有publishers发送出去的和consumers获取到的队列都会被锁定)。为了成功执行此命令,队列必须要被镜像。
    注意,排除消息的异步队列将最终被同步化,此命令主要运用于未被排除完全消息的队列。

  • rabbitmqctl cancel_sync_queue [-p vhost] {queue}
    指引一个正在同步的镜像队列停止此操作。

  • rabbitmqctl purge_queue [-p vhost] {queue}
    {queue} 表示待清空消息的队列名称
    该命令表示清空队列(即删除队列中的所有消息)

  • rabbitmqctl set_cluster_name {name}
    设置集群的名称。在连接中,集群的名称被声明在客户端上,被同盟和插件用来记录一个消息所在的位置。集群的名称默认来自于集群中第一个节点的主机名,但是可以被修改。

相关链接

首页
上一篇:事务以及Confirm确认
下一篇:集群故障恢复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值