MQ集群

1、两种部署

普通模式和镜像模式

1.1、普通集群

普通集群模式,就是将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。

此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。

当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。

这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。

1.2、镜像集群

它和普通集群最大的区别在于 Queue 数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。

大致流程图如下图:

1.3、节点类型

RabbitMQ 中的节点类型有两种:

RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得交换机和队列声明等操作速度更快。
Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息
RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。为了确保集群信息的可靠性,或者在不确定使用磁盘节点还是内存节点的时候,建议直接用磁盘节点

2、搭建普通集群

2.1、知识点

搭建之前,有两个预备知识需要了解:

2.1.1、搭建集群时,节点中的 Erlang Cookie 值要一致,默认情况下,文件在/var/lib/rabbitmq/.erlang.cookie
2.2.2、RabbitMQ 是通过主机名来连接服务,必须保证各个主机名之间可以 ping 通。可以通过编辑 /etc/hosts 来手工添加主机名和 IP 对应关系。如果主机名 ping 不通,RabbitMQ 服务启动会失败(如果我们是在不同的服务器上搭建 RabbitMQ 集群

2.2、节点配置同样的Cookie

vi /var/lib/rabbitmq/.erlang.cookie
mqtest_rabbitmq_cookie

2.3、节点配置增加hosts

vi /etc/hosts
172.30.12.30 mqtest01
172.30.12.31 mqtest02

2.4、放行端口

firewall-cmd --add-port=5672/tcp --permanent 
firewall-cmd --add-port=25672/tcp --permanent 
firewall-cmd --add-port=15672/tcp --permanent 
firewall-cmd --add-port=4369/tcp --permanent
firewall-cmd --reload 

2.5、将mqtest02加入集群节点mqtest01中

rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@mqtest01
rabbitmqctl start_app

2.6、查看集群状态

rabbitmqctl cluster_status

2.7、访问报错:您与此网站的连接不是私密连接

重新配置用户分配权限

2.8、查看群集状态

3、配置镜像模式

各参数含义如下:

Name: policy 的名称。
Pattern: queue 的匹配模式(正则表达式)。^匹配所有
Definition:镜像定义,主要有三个参数:ha-mode, ha-params, ha-sync-mode。
ha-mode:指明镜像队列的模式,有效值为 all、exactly、nodes。其中 all 表示在集群中所有的节点上进行镜像(默认即此);exactly 表示在指定个数的节点上进行镜像,节点的个数由 ha-params 指定;nodes 表示在指定的节点上进行镜像,节点名称通过 ha-params 指定。
ha-params:ha-mode 模式需要用到的参数。
ha-sync-mode:进行队列中消息的同步方式,有效值为 automatic 和 manual。
priority 为可选参数,表示 policy 的优先级。
配置完成后,点击下面的 add/update policy 按钮,完成策略的添加,如下:

[root@mqtest01 ~]# rabbitmqctl list_policies
Listing policies for vhost "/" ...
vhost	name	pattern	apply-to	definition	priority
/	mqtest_policy	^	all	{"ha-mode":"all","ha-sync-mode":"automatic"}	0

4、测试验证群集模式

4.1、创建队列,创建好后可以在任意控制台查看

4.2、测试共享数据,发送一条消息

4.3、任意控制台接收消息,这里接模拟创建两条,如接收全部2条信息需要更改MESSAGES值,消费时不选择Automatic ACK,值会一直存在

4.4、停掉testmq02的节点,自动切换到testmq01上