rabbitMQ集群
单一模式
参考https://blog.haomingzx.top/2020/02/22/RabbitMQ%E5%AD%A6%E4%B9%A0/
登录rabbitmq报错User can only log in via localhost?
配置文件/etc/rabbitmq/添加 如下配置
loopback_users = none
普通模式
默认的集群模式。
环境
IP地址 | 主机名 | 操作系统 | 防火墙和SELinux | 用途 |
---|---|---|---|---|
192.168.56.114 | mq1 | CentOS7(64位) | 关闭 | 磁盘节点 |
192.168.56.115 | mq2 | CentOS7(64位) | 关闭 | 内存节点 |
RabbitMQ集群节点必须在同一网段里,如果是跨广域网,效果会变差。
配置
修改主机名
vi /etc/hostname
,mq2相同操作,修改后需要重启系统生效。mq1.localdomain
修改hosts文件
vi /etc/hosts
192.168.56.114 mq1 192.168.56.125 mq2
拷贝erlang.cookie
Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群景象。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。所以必须保证各节点cookie一致,不然节点之间就无法通信。
安装插件
rabbitmq-plugins list //查看插件安装情况 rabbitmq-plugins enable rabbitmq_management //启用rabbitmq_management服务
将mq1作为内存节点加入mq1节点集群中,在mq2执行如下命令:
rabbitmqctl stop_app //停掉rabbit应用 rabbitmqctl join_cluster --ram rabbit@mq1 //加入到磁盘节点 ram表示内存节点 rabbitmqctl start_app //启动rabbit应用
查看集群状态
rabbitmqctl cluster_status
更改节点类型
内存节点: 内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。例外情况是:持久的 queue 的内容将被保存到磁盘。
磁盘节点: 将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。
注意点:
1、内存节点由于不进行磁盘读写,它的性能比磁盘节点高。
2、集群中可以存在多个磁盘节点,磁盘节点越多整个集群可用性越好,但是集群整体性能不会线性增加,需要权衡考虑。
3、RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。
4、设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。
# 停止节点 sbin/rabbitmqctl stop_app # 与集群通讯,从集群中删除节点 sbin/rabbitmqctl reset # 以RAM模式重新加入集群 sbin/rabbitmqctl join_cluster rabbit@MQ1 --ram # 启动节点 sbin/rabbitmqctl start_app
节点单机状态时,reset 命令将清空节点的状态,并将其恢复到空白状态。当节点是集群的一部分时,该命令也会和集群中的磁盘节点通信,告诉他们该节点正在离开集群。
这很重要,不然,集群会认为该节点出了故障,并期望其最终能够恢复回来,在该节点回来之前,集群禁止新的节点加入。
镜像模式
把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用;要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。
配置
图形界面配置
登录控制台 http://192.168.56.114:15672/#/
- Name:策略名称
- Pattern:匹配的规则,这里表示匹配a开头的队列,如果是匹配所有的队列,那就是^.
- Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。
命令行配置
rabbitmqctl set_policy <name> [-p <vhost>] <pattern> <definition> [--apply-to <apply-to>]
name: 策略名称
vhost: 指定vhost, 默认值 /
pattern: 通过正则表达式匹配哪些需要镜像, ^为所有
definition:
ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
all 表示在集群所有的节点上进行镜像,无需设置ha-params
exactly 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes 表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params:
ha-mode 模式需要用到的参数
ha-sync-mode: 镜像队列中消息的同步方式,有效值为automatic,manually
apply-to: 策略作用对象。可选值3个,默认all
exchanges 表示镜像 exchange
queues 表示镜像 queue
all 表示镜像 exchange和queue
示例命令:
rabbitmqctl set_policy admin "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
ha-mode | ha-params | 功能 |
---|---|---|
all | 空 | 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。 |
exactly | count | 镜像队列将会在集群上复制 count 份。如果集群数量少于 count 时候,队列会复制到所有节点上。如果大于 Count 集群,有一个节点 crash 后,新进入节点也不会做新的镜像。 |
nodes | node name | 镜像队列会在 node name 中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个 node list 中没有一个节点在线,那么这个 queue 会被声明在 client 连接的节点。 |
测试
参考
https://blog.51cto.com/11134648/2155934