赞
踩
普通模式 (默认) :
对于 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 取数据时临时拉取。当然,该模式带来的副作用也很明显,除了降低系统性能意外,如果镜像队列过多,加之有大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用。
修改 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.160.129 A
192.168.160.130 B
注意:
2 台 Linux 服务器需要完成同样的操作
关闭防火墙确保2台机器相互 ping ,可以执行 ping A 和 ping B 命令进行测试
1. 依赖包安装
安装 RabbitMQ 之前必须要先安装所需要的依赖包,可以使用下面的一次性安装命令
yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto -y
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
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
注意:
需要分别在 2 台 Linux 服务器中安装 RabbitMQ
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.组建集群
分别启动 2 台 Linux 机器中的 RabbitMQ 服务器
rabbitmqctl stop
rabbitmq-server -detached
注意:
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
分别为 2 台 Linux 中的 RabbitMQ 添加账号并进行授权
rabbitmqctl add_user root root
rabbitmqctl set_user_tags root administrator
rabbitmqctl set_permissions -p / root '.*' '.*' '.*'
修改 SpringBoot 的 application.properties 文件进行集群的继承
#spring.rabbitmq.port=5672
#配置RabbitMQ的集群访问地址
spring.rabbitmq.addresses=192.168.160.129:5672,192.168.160.130:5672
#配置RabbitMQ服务器的访问账号
spring.rabbitmq.username=root
#配置RabbitMQ服务器的访问密码
spring.rabbitmq.password=aszhuo123
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。