普通模式(默认):普通模式可以将消息队列中的消息读写进行分离,当向消息队列中写数据的时候。RabbitMQ集群会与这个RabbitMQ建立临时通道,消息可以通过这个临时通道将消息备份到其他的RabbitMQ中(只有读操作的时候触发)。如果向写的消息队列所在的服务器宕机后会导致临时通道无法使用,自然就无法备份消息。

镜像模式(高可用模式):当向消息队列中写入消息的时候,RabbitMQ集群会将该消息队列进行备份。即只要写入消息的时候会触发备份操作。

配置集群

配置RabbitMq集群首先需要在/etc/hosts文件中配置镜像IP地址。为了保证两台机器正常通信,需要互ping成功。

java rabbitmq连接单例 rabbitmq连接集群_linux

配置Cookie文件

Erlang Cookie是保证不同节点可以通过相互通信的密钥,要保证集群中的不同节点相互通信。必须共享系统的Erlang Cookie(即Cookie文件中的内容必须一致),具体放在:

官方介绍集群的文档介绍如下: .erlang.cookie一般会存在于两个地方,第一个是:$HOME/.erlang.cookie;第二个是:/var/lib/rabbitmq/.erlang.cookie。

如果我们使用解压缩安装方式(二进制安装或者编译安装),那么该文件存在位置为java rabbitmq连接单例 rabbitmq连接集群_linux_02HOME/.erlang.cookie。如果我们使用root安装,则位置为:/root/.erlang.cookie,其他用户为/home/用户名/.erlang.cookie。

修改ErlangCookie文件方法:

为了必须要保证2台Linux的Cookie文件内容一致,可以使用Vim命令来编辑。但注意的是由于该文件只有只读权限,可以修改该文件权限进行编辑后修改会只读权限,否则RabbitMQ启动会失败。

除此之外也所以使用scp命令来进行跨服务器文件传输

[root@tang ~]# scp /root/.erlang.cookie 192.168.79.135:/root/.erlang.cookie

java rabbitmq连接单例 rabbitmq连接集群_队列_03

java rabbitmq连接单例 rabbitmq连接集群_linux_04

修改完配置文件后两台机器都需要重启RabbitMQ,这样两台机器的RabbitMQ就可以通信了。

将某个RabbitMQ加入到某个服务器节点中
[root@rabbitmq02 ~]# rabbitmqctl stop_app
[root@rabbitmq02 ~]# rabbitmqctl join_cluster rabbit@rabbitmq01
[root@rabbitmq02 ~]# rabbitmqctl start_app

注意:

1、配置/etc/hosts文件中的主机名和使用hostname命令显示出来的主机名一致。

2、要保证接入的目标节点必须开启RabbitMQ(即rabbitmqctl join_cluster rabbit@rabbitmq01命令中的rabbitmq01)。

3、接入的节点中必须先开启RabbitMQ然后使用rabbitmqctl stop_app停止RabbitMQ的应用然后通过命令接入目标节点后开启应用

使用命令查看RabbitMQ集群
[root@rabbitmq02 ~]# rabbitmqctl cluster_status
结果:

java rabbitmq连接单例 rabbitmq连接集群_队列_05

从命令的结果可以看出来,RabbitMQ集群中只有主机名为rabbitmq01和主机名为rabbitmq02的机器。

注意:当配置RabbitMQ集群成功后,先前添加和授予的用户名和密码权限都会被删除掉。恢复到原来只有gust用户名的状态。

此时添加用户会自动同步到其他的RabbitMQ

镜像模式配置

由于上面配置会导致rabbitmq02宕机的时候,消息的消费者会接受不到消息。所以需要配置镜像模式。配置如下:

java rabbitmq连接单例 rabbitmq连接集群_linux_06

这里使用的是正则表达式进行匹配,当rabbitmq02宕机的时候,会自动切换到rabbitmq01来进行收发消息。如图

java rabbitmq连接单例 rabbitmq连接集群_linux_07

当有一个镜像节点的时候就会+1,当有两个镜像节点的时候就会+2