普通模式(默认):对于Queue来说,消息实体只存在于其中的一个节点,A/B两个节点仅有相同的元数据,即队列结构.(交换机的所有元数据在所有节点上是一致的,而队列的完整信息只有在创建它的节点上,各个节点仅有相同的元数据,即队列结构)当消息进入A节点的Queue中后,consumer从B节点拉取数据时,RabbitMQ会临时在A.B间进行消息传输,把A中的消息实体取出并经过B发送给consumer.所以consumer应尽量连接每个节点,从中取消息.即对于同一个逻辑队列,要在多个节点建立物理Queue,否则无论consumer连A或B,出口总在A,会产生瓶颈.该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体.如果做个消息持久化,那么等A几点恢复,然后才可被消费;如果没有做持久化,然后就…该模式非常适合非持久化队列,只有该队列是非持久化的,客户端才能重新连接到集群中的其他节点,并且重新创建队列,如果该队列是持久化的,那么唯一的办法就是将故障节点恢复起来。
镜像模式(高可用模式):把需要的队列做成镜像模式,存在于多个节点,数据Rabbitmq的HA方案.该模式解决了上述问题,其实质和普通模式的不同之处在于,消息实体会主动在镜像节点间同步,而不会在consumer取数据时临时拉取.该模式带来的副作用也很明显,除了降低系统性能意外,如果镜像队列过多,加之有大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用。
5.1 镜像模式集群实现
5.1.1 环境准备
1、 安装2两台Linux操作系统并修改hostname 分别为A和B
执行vi /etc/hosts 文件内容如下:
127.0.0.1 A localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 A localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.222.129 A
192.168.222.130 B
注意:2台Linux服务器需要完成同样的操作
关闭防火墙确保2台机器相互ping 同可以执行ping A 和ping B命令进行测试
5.1.2 安装RabbitMQ
在2台Linux服务中分别安装RabbitMQ
5.1.2.1 依赖包安装
安装RabbitMQ之前必须要先安装所需要的依赖包可以使用下面的一次性安装命令
yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto -y
5.1.2.2 安装Erlang
1、将Erlang源代码包otp_src_19.3.tar.gz上传到Linux的/home目录下
2、解压erlang 源码包
tar -zxvf otp_src_19.3.tar.gz
3、手动创建erlang 的安装目录
mkdir /usr/local/erlang
4、进入erlang的解压目录
cd otp_src_19.3
5、配置erlang的安装信息
./configure --prefix=/usr/local/erlang --without-javac
6、编译并安装
make && make install
7、配置环境变量
vim /etc/profile
8、将这些配置填写到profile文件的最后
ERL_HOME=/usr/local/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME PATH
9、启动环境变量配置文件
source /etc/profile
5.1.2.3 安装RabbitMQ
1、将RabbitMQ安装包rabbitmq-server-3.7.2-1.el7.noarch.rpm上传到/home目录
2、安装RabbitMQ
rpm -ivh --nodeps rabbitmq-server-3.7.2-1.el7.noarch.rpm
3、安装管控台插件
rabbitmq-plugins enable rabbitmq_management
5.1.2.4 配置Cookie文件
Erlang Cookie是保证不同节点可以互相通信的秘钥,要保证集群中的不同节点互相通信必须共享相同的Erlang Cookie,具体存放在/var/lib/rabbitmq/.erlang.cookie
例如:
[root@A ~]# cat /var/lib/rabbitmq/.erlang.cookie
MZFQSBXIIJJMUZRTJFWQ
[root@A ~]# ~
必须要保证2台Linux的Cookie 文件内容完全相同,可以选择使用vim进行编辑
也可以使用scp命令完成文件跨机器拷贝例如
[root@A ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.222.130:/var/lib/rabbitmq |
---|
注意:由于这个文件的权限是只读因此无论是使用vim还是scp来实现Cookie文件的同步都会失败,因此必须要修改这个文件的权限,
例如 chmod 777 /var/lib/rabbitmq/.erlang.cookie
当Cookie文件同步完成以后再修改权限回只读
例如 chmod 400 /var/lib/rabbitmq/.erlang.cookie
5.1.2.5 组建集群
分别启动2台Linux机器中的RabbitMQ服务器
rabbitmqctl stop 关闭rabbitmq rabbitmq-server -detached 后台启动rabbitmq |
---|
注意:rabbitmq-server –detached 表示在后台运行
将某个RabbitMQ加入到某个服务器节点
rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@A rabbitmqctl start_app |
---|
注意:
rabbitmqctl join_cluster rabbit@A 命令中的A为某个机器的hostname,在hostname为B的机器中执行这些命令
查看集群状态确认节点成功添加
[root@B ~]# rabbitmqctl cluster_status Cluster status of node rabbit@B … [{nodes,[{disc,[rabbit@A,rabbit@B]}]}, {running_nodes,[rabbit@A,rabbit@B]}, {cluster_name,<"rabbit@A">}, {partitions,[]}, {alarms,[{rabbit@A,[]},{rabbit@B,[]}]}] [root@B ~]# |
---|
注意:
当查看节点状态时发现2台机器的节点同时显示机表示集群搭建完成
其他命令:
如果要将某个节点从集群中移除,使其变回独立节点,可以使用以下命令:
rabbitmqctl stop_app rabbitmqctl reset rabbitmqctl start_app |
---|
5.1.3 SpringBoot连接RabbitMQ集群
5.1.3.1 配置RabbitMQ的账号
**
分别为2台Linux中的RabbitMQ添加账号并进行授权
rabbitmqctl add_user root root rabbitmqctl set_user_tags root administrator rabbitmqctl set_permissions -p / root ‘.‘ ‘.‘ ‘.*’ |
---|
5.1.3.2 SpringBoot配置
**
修改SpringBoot的application.properties文件进行集群的继承
#spring.rabbitmq.port=5672 #配置RabbitMQ的集群访问地址 spring.rabbitmq.addresses=192.168.222.129:5672,192.168.222.130:5672 #配置RabbitMQ服务器的访问账号 spring.rabbitmq.username=root #配置RabbitMQ服务器的访问密码 spring.rabbitmq.password=root |
---|