搭建RabbitMQ Server高可用集群
目录
文章目录
1.背景介绍
由于客户的成本预算不足,不想在华为云购买单独的MQ的产品,只能在华为云购买云服务器,然后自己搭建RabbitMQ Server集群。但也是预算不足,仅有两台服务器,还是要集群。
2.环境介绍
RabbitMQ-node | IP地址 | 工作模式 | 操作系统 | EIP |
---|---|---|---|---|
hy-mq-0001 | 172.16.1.244(内网) | DISK | CentOS7.9 | 116.205.189.205 |
hy-mq-0002 | 172.16.1.86 | DISK | CentOS7.9 |
3 架构视图
这个网络上找的一个高可用集群架构,仅供参考,在云上的负载可以使用LB来代替,但必然会造成成本的增加,最后还是需要以客户的意愿会导向。
4 RabbitMQ和Erlang的版本
由于客户所需要的版本是指定的,又是在rhel系列上,所以从官网直接找出对应的版本进行下载下来,有各种不同的方式下载,下面是下载的地址,本实验采用的rabbitmq-server-3.8.5,erlang-23.2.7-2。
下面是下载的官网。
rabbitmq官网
https://www.rabbitmq.com/
rabbitmq-下载的地址
https://github.com/rabbitmq/signing-keys/releases/
erlang官网
https://www.erlang.org/
erlang下载地址
https://www.erlang.org/downloads
5 准备工作
首先将两台的服务器的hostname的名字设置,你需要的nodename,命令如下:
hostnamectl set-hostname NAME
接着将修改两台的/etc/hosts文件
[root@hy-mq-0001 ~]# cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1 hy-mq-0001 hy-mq-0001
172.16.1.244 hy-mq-0001
172.16.1.86 hy-mq-0002
6 搭建RabbitMQ Server单机版
以下使用mq-0001服务作为单机版的演示实例。
如果你采用的是源安装的话,就需要更新软件包和存储库。
yum -y update
接着安装Erlang(RabbitMQ运行需要Erlang和socat)
[root@hy-mq-0001 ~]# rpm -ivh erlang-23.2.7-2.el7.x86_64.rpm
warning: erlang-23.2.7-2.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 6026dfca: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:erlang-23.2.7-2.el7 ################################# [100%]
[root@hy-mq-0001 ~]# yum -y install socat
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package socat.x86_64 0:1.7.3.2-2.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================================================
Installing:
socat x86_64 1.7.3.2-2.el7 base 290 k
Transaction Summary
==========================================================================================================================================================================
Install 1 Package
Total download size: 290 k
Installed size: 1.1 M
Downloading packages:
socat-1.7.3.2-2.el7.x86_64.rpm | 290 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
Installing : socat-1.7.3.2-2.el7.x86_64 1/1
Verifying : socat-1.7.3.2-2.el7.x86_64 1/1
Installed:
socat.x86_64 0:1.7.3.2-2.el7
Complete!
安装 RabbitMQ Server:
[root@hy-mq-0001 ~]# rpm -ivh rabbitmq-server-3.8.5-1.el7.noarch.rpm
warning: rabbitmq-server-3.8.5-1.el7.noarch.rpm: Header V4 RSA/SHA256 Signature, key ID 6026dfca: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:rabbitmq-server-3.8.5-1.el7 ################################# [100%]
安装好之后,就可以启动 RabbitMQ Server 了:
[root@hy-mq-0001 ~]# systemctl start rabbitmq-server
启动成功之后,查看RabbitMQ Server的状态。
[root@hy-mq-0001 ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2023-11-23 09:59:45 CST; 16s ago
Main PID: 8971 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─8971 /usr/lib64/erlang/erts-11.1.8/bin/beam.smp -W w -K true -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 5000000...
├─9076 erl_child_setup 32768
├─9101 /usr/lib64/erlang/erts-11.1.8/bin/epmd -daemon
├─9124 inet_gethost 4
└─9125 inet_gethost 4
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: ########## Licensed under the MPL 1.1. Website: https://rabbitmq.com
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: Doc guides: https://rabbitmq.com/documentation.html
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: Support: https://rabbitmq.com/contact.html
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: Tutorials: https://rabbitmq.com/getstarted.html
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: Monitoring: https://rabbitmq.com/monitoring.html
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: Logs: /var/log/rabbitmq/rabbit@hy-mq-0001.log
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: /var/log/rabbitmq/rabbit@hy-mq-0001_upgrade.log
Nov 23 09:59:44 hy-mq-0001 rabbitmq-server[8971]: Config file(s): (none)
Nov 23 09:59:45 hy-mq-0001 systemd[1]: Started RabbitMQ broker.
Nov 23 09:59:46 hy-mq-0001 rabbitmq-server[8971]: Starting broker... completed with 0 plugins.
将MQ-server设置会开启自启
[root@hy-mq-0001 ~]# systemctl enable rabbitmq-server
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
[root@hy-mq-0001 ~]#
启动 RabbitMQ Web 管理控制台:
[root@hy-mq-0001 ~]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@hy-mq-0001:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@hy-mq-0001...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
started 3 plugins.
RabbitMQ Server 默认guest
用户,只能localhost
地址访问,我们还需要创建管理用户:
[root@hy-mq-0001 ~]# rabbitmqctl add_user admin admin123 &&
> rabbitmqctl set_user_tags admin administrator &&
> rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Adding user "admin" ...
Setting tags for user "admin" to [administrator] ...
Setting permissions for user "admin" in vhost "/" ...
查看开启的端口和服务
[root@hy-mq-0001 ~]# ss -ntlp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:25672 *:* users:(("beam.smp",pid=8971,fd=81))
LISTEN 0 10 127.0.0.1:39338 *:* users:(("uniagentd",pid=2067,fd=4))
LISTEN 0 10 127.0.0.1:39339 *:* users:(("uniagentd",pid=2068,fd=4))
LISTEN 0 128 *:4369 *:* users:(("epmd",pid=9101,fd=3))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=2084,fd=3))
LISTEN 0 1024 *:15672 *:* users:(("beam.smp",pid=8971,fd=96))
LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=932,fd=13))
LISTEN 0 128 [::]:5672 [::]:* users:(("beam.smp",pid=8971,fd=94))
LISTEN 0 128 [::]:4369 [::]:* users:(("epmd",pid=9101,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=2084,fd=4))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=932,fd=14))
[root@hy-mq-0001 ~]#
如果在云上需要开启安全组,将15672的端口开启。,如果是防火墙需要开启运行的端口。
上面这些做完了,RabbitMQ 单机版的部署也完成了,我们可以浏览器访问``:
此时单机版已完成部署。
7 RabbitMQ Server高可用集群的相关概念
在安装集群之前,首先要简单了解下集群的相关信息,才能更加了解RabbitMQ集群。
7.1 设置集群目的
- 允许消费者和生产者在 RabbitMQ 节点崩溃的情况下继续运行。
- 通过增加更多的节点来扩展消息通信的吞吐量。
7.2 集群配置方式
- cluster:不支持跨网段,用于同一个网段内的局域网;可以随意的动态增加或者减少;节点之间需要运行相同版本的 RabbitMQ 和 Erlang。
- federation:应用于广域网,允许单台服务器上的交换机或队列接收发布到另一台服务器上交换机或队列的消息,可以是单独机器或集群。federation 队列类似于单向点对点连接,消息会在联盟队列之间转发任意次,直到被消费者接受。通常使用 federation 来连接 internet 上的中间服务器,用作订阅分发消息或工作队列。
- shovel:连接方式与 federation 的连接方式类似,但它工作在更低层次。可以应用于广域网。
7.3节点类型
- RAM node:内存节点将所有的队列、交换机、绑定、用户、权限和 vhost 的元数据定义存储在内存中,好处是可以使得像交换机和队列声明等操作更加的快速。
- Disk node:将元数据存储在磁盘中,单节点系统只允许磁盘类型的节点,防止重启 RabbitMQ 的时候,丢失系统的配置信息。
问题说明:RabbitMQ 要求在集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入或者离开集群时,必须要将该变更通知到至少一个磁盘节点。如果集群中唯一的一个磁盘节点崩溃的话,集群仍然可以保持运行,但是无法进行其他操作(增删改查),直到节点恢复。
解决方案:设置两个磁盘节点,至少有一个是可用的,可以保存元数据的更改。
7.4 Erlang Cookie
Erlang Cookie 是保证不同节点可以相互通信的密钥,要保证集群中的不同节点相互通信必须共享相同的 Erlang Cookie。具体的目录存放在/var/lib/rabbitmq/.erlang.cookie
这个非常重要,要在rabbitmq启动之前拷贝进去,还要注意权限,这个我们在搭建的集群的时候会说明。
说明:这就要从 rabbitmqctl 命令的工作原理说起,RabbitMQ 底层是通过 Erlang 架构来实现的,所以 rabbitmqctl 会启动 Erlang 节点,并基于 Erlang 节点来使用 Erlang 系统连接 RabbitMQ 节点,在连接过程中需要正确的 Erlang Cookie 和节点名称,Erlang 节点通过交换 Erlang Cookie 以获得认证。
7.5镜像队列
RabbitMQ 的 Cluster 集群模式一般分为两种,普通模式和镜像模式。
- 普通模式:默认的集群模式,以两个节点(rabbit01、rabbit02)为例来进行说明。对于 Queue 来说,消息实体只存在于其中一个节点 rabbit01(或者 rabbit02),rabbit01 和 rabbit02 两个节点仅有相同的元数据,即队列的结构。当消息进入 rabbit01 节点的 Queue 后,consumer 从 rabbit02 节点消费时,RabbitMQ 会临时在 rabbit01、rabbit02 间进行消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer。所以 consumer 应尽量连接每一个节点,从中取消息。即对于同一个逻辑队列,要在多个节点建立物理 Queue。否则无论 consumer 连 rabbit01 或 rabbit02,出口总在 rabbit01,会产生瓶颈。当 rabbit01 节点故障后,rabbit02 节点无法取到 rabbit01 节点中还未消费的消息实体。如果做了消息持久化,那么得等 rabbit01 节点恢复,然后才可被消费;如果没有持久化的话,就会产生消息丢失的现象。
- 镜像模式:将需要消费的队列变为镜像队列,存在于多个节点,这样就可以实现 RabbitMQ 的 HA 高可用性。作用就是消息实体会主动在镜像节点之间实现同步,而不是像普通模式那样,在 consumer 消费数据时临时读取。缺点就是,集群内部的同步通讯会占用大量的网络带宽。
镜像队列实现了 RabbitMQ 的高可用性(HA),具体的实现策略如下所示:
ha-mode | ha-params | 功能 |
---|---|---|
all | 空 | 镜像队列将会在整个集群中复制。当一个新的节点加入后,也会在这 个节点上复制一份。 |
exactly | count | 镜像队列将会在集群上复制 count 份。如果集群数量少于 count 时候,队列会复制到所有节点上。如果大于 Count 集群,有一个节点 crash 后,新进入节点也不会做新的镜像。 |
nodes | node name | 镜像队列会在 node name 中复制。如果这个名称不是集群中的一个,这不会触发错误。如果在这个 node list 中没有一个节点在线,那么这个 queue 会被声明在 client 连接的节点。 |
实例列举:
queue_args("x-ha-policy":"all") //定义字典来设置额外的队列声明参数
channel.queue_declare(queue="hello-queue",argument=queue_args)
如果需要设定特定的节点(以rabbit@localhost
为例),再添加一个参数:
queue_args("x-ha-policy":"nodes",
"x-ha-policy-params":["rabbit@localhost"])
channel.queue_declare(queue="hello-queue",argument=queue_args)
可以通过命令行查看那个主节点进行了同步:
$ rabbitmqctl list_queue name slave_pids synchronised_slave_pids
以上内容主要参考:RabbitMQ 分布式集群架构
参考链接:https://www.cnblogs.com/xishuai/p/centos-rabbitmq-cluster-and-haproxy.html
8 搭建RabbitMQ Server高可用集群
默认.erlang.cookie
文件是隐藏的,ls
命令并不能查看,你也可以手动搜索下文件:
[root@hy-mq-0001 ~]# find / -name ".erlang.cookie"
/var/lib/rabbitmq/.erlang.cookie
[root@hy-mq-0001 ~]# cat /var/lib/rabbitmq/.erlang.cookie
DEJFRXXRTEGNMAHDKCNL[root@hy-mq-0001 ~]#
将mq-0001服务器中的cookie文件,拷贝到mq-0002上;(注意权限问题)
[root@hy-mq-0001 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@172.16.1.86:/var/lib/rabbitmq/
The authenticity of host '172.16.1.86 (172.16.1.86)' can't be established.
ECDSA key fingerprint is SHA256:IA6D6+rvZUn5GyIUY/FdmiEb4twKmEY032GYiBBCVyo.
ECDSA key fingerprint is MD5:2b:b5:d8:d8:e0:25:ca:b3:88:1c:e9:6e:4e:53:de:03.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.1.86' (ECDSA) to the list of known hosts.
root@172.16.1.86's password:
.erlang.cookie 100% 20 74.5KB/s 00:00
[root@hy-mq-0001 ~]#
#修改下面的权限要不然会出去问题
[root@hy-mq-0002 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 root root 20 Nov 23 10:28 /var/lib/rabbitmq/.erlang.cookie
[root@hy-mq-0002 ~]# chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
[root@hy-mq-0002 ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 20 Nov 23 10:28 /var/lib/rabbitmq/.erlang.cookie
修改这个rabbitmq-env.conf文件(若不存在,需要手动添加)
[root@hy-mq-0002 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NAME=rabbit@hy-mq-0002
同理也需要在mq-0001上面添加,然后需要重新启动。
[root@hy-mq-0001 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NAME=rabbit@hy-mq-0001
[root@hy-mq-0001 ~]# cat /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NAME=rabbit@hy-mq-0001
[root@hy-mq-0001 ~]# systemctl restart rabbitmq-server
[root@hy-mq-0001 ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-11-23 10:33:51 CST; 8s ago
Process: 22209 ExecStop=/usr/sbin/rabbitmqctl shutdown (code=exited, status=0/SUCCESS)
Main PID: 22263 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─22263 /usr/lib64/erlang/erts-11.1.8/bin/beam.smp -W w -K true -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 500000...
├─22369 erl_child_setup 32768
├─22396 /usr/lib64/erlang/erts-11.1.8/bin/epmd -daemon
├─22419 inet_gethost 4
└─22420 inet_gethost 4
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: ########## Licensed under the MPL 1.1. Website: https://rabbitmq.com
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Doc guides: https://rabbitmq.com/documentation.html
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Support: https://rabbitmq.com/contact.html
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Tutorials: https://rabbitmq.com/getstarted.html
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Monitoring: https://rabbitmq.com/monitoring.html
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Logs: /var/log/rabbitmq/rabbit@hy-mq-0001.log
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: /var/log/rabbitmq/rabbit@hy-mq-0001_upgrade.log
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Config file(s): (none)
Nov 23 10:33:51 hy-mq-0001 systemd[1]: Started RabbitMQ broker.
Nov 23 10:33:51 hy-mq-0001 rabbitmq-server[22263]: Starting broker... completed with 3 plugins.
[root@hy-mq-0001 ~]#
将·mq-0002·上完成安装,启动并设置开机自启
[root@hy-mq-0002 ~]# systemctl start rabbitmq-server
[root@hy-mq-0002 ~]# systemctl status rabbitmq-server
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2023-11-23 10:35:47 CST; 12s ago
Main PID: 19770 (beam.smp)
Status: "Initialized"
CGroup: /system.slice/rabbitmq-server.service
├─19770 /usr/lib64/erlang/erts-11.1.8/bin/beam.smp -W w -K true -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1048576 -t 500000...
├─19875 erl_child_setup 32768
├─19901 /usr/lib64/erlang/erts-11.1.8/bin/epmd -daemon
├─19924 inet_gethost 4
└─19925 inet_gethost 4
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: ########## Licensed under the MPL 1.1. Website: https://rabbitmq.com
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: Doc guides: https://rabbitmq.com/documentation.html
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: Support: https://rabbitmq.com/contact.html
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: Tutorials: https://rabbitmq.com/getstarted.html
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: Monitoring: https://rabbitmq.com/monitoring.html
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: Logs: /var/log/rabbitmq/rabbit@hy-mq-0002.log
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: /var/log/rabbitmq/rabbit@hy-mq-0002_upgrade.log
Nov 23 10:35:46 hy-mq-0002 rabbitmq-server[19770]: Config file(s): (none)
Nov 23 10:35:47 hy-mq-0002 systemd[1]: Started RabbitMQ broker.
Nov 23 10:35:47 hy-mq-0002 rabbitmq-server[19770]: Starting broker... completed with 0 plugins.
[root@hy-mq-0002 ~]# systemctl enable rabbitmq-server
Created symlink from /etc/systemd/system/multi-user.target.wants/rabbitmq-server.service to /usr/lib/systemd/system/rabbitmq-server.service.
先停止运行节点,然后以后台方式启动 RabbitMQ Server(mq-0001
和mq-0002
分别执行):
[root@hy-mq-0001 ~]# rabbitmqctl stop
Stopping and halting node rabbit@hy-mq-0001 ...
[root@hy-mq-0001 ~]# rabbitmq-server -detached
[root@hy-mq-0002 ~]# rabbitmqctl stop
Stopping and halting node rabbit@hy-mq-0002 ...
[root@hy-mq-0002 ~]# rabbitmq-server -detached
[root@hy-mq-0002 ~]#
我们以mq-0001
作为集群中心,在mq-0002
上执行加入集群中心命令(节点类型为磁盘节点):
[root@hy-mq-0002 ~]# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@hy-mq-0002 ...
[root@hy-mq-0002 ~]# rabbitmqctl reset
Resetting node rabbit@hy-mq-0002 ...
[root@hy-mq-0002 ~]# rabbitmqctl join_cluster rabbit@hy-mq-0001
Clustering node rabbit@hy-mq-0002 with rabbit@hy-mq-0001
#默认是磁盘节点,如果是内存节点的话,需要加--ram参数
[root@hy-mq-0002 ~]# rabbitmqctl start_app
Starting node rabbit@hy-mq-0002 ...
[root@hy-mq-0002 ~]#
查看集群的状态(包含mq-0001
和mq-0002
节点):
[root@hy-mq-0002 ~]# rabbitmqctl cluster_status
Cluster status of node rabbit@hy-mq-0002 ...
Basics
Cluster name: rabbit@hy-mq-0001
Disk Nodes
rabbit@hy-mq-0001
rabbit@hy-mq-0002
Running Nodes
rabbit@hy-mq-0001
rabbit@hy-mq-0002
Versions
rabbit@hy-mq-0001: RabbitMQ 3.8.5 on Erlang 23.2.7
rabbit@hy-mq-0002: RabbitMQ 3.8.5 on Erlang 23.2.7
Alarms
(none)
Network Partitions
(none)
Listeners
Node: rabbit@hy-mq-0001, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@hy-mq-0001, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@hy-mq-0001, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@hy-mq-0002, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@hy-mq-0002, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Feature flags
Flag: drop_unroutable_metric, state: enabled
Flag: empty_basic_get_metric, state: enabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled
[root@hy-mq-0002 ~]#
我们可以从 RabbitMQ Web 管理界面,看到集群的信息:
这里mq-0002上面少个插件,安装即可。
[root@hy-mq-0002 ~]# rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@hy-mq-0002:
rabbitmq_management
The following plugins have been configured:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
Applying plugin configuration to rabbit@hy-mq-0002...
The following plugins have been enabled:
rabbitmq_management
rabbitmq_management_agent
rabbitmq_web_dispatch
started 3 plugins.
此刻已完成搭建。
9 搭建HAproxy负载均衡(可选)
HAProxy 是一个免费的负载均衡软件,可以运行于大部分主流的 Linux 操作系统上。
但如果在公有云上,可以有相关的LB供选择,有的服务商还不支持在云上负载,请注意!
HAProxy 提供了 L4(TCP) 和 L7(HTTP) 两种负载均衡能力,具备丰富的功能。HAProxy 的社区非常活跃,版本更新快速(最新稳定版 1.7.2 于 2017/01/13 推出)。最关键的是,HAProxy 具备媲美商用负载均衡器的性能和稳定性。它当前不仅仅是免费负载均衡软件的首选,更几乎成为了唯一选择。
因为 RabbitMQ 本身不提供负载均衡,下面我们就搭建 HAProxy,用作 RabbitMQ 集群的负载均衡。
HAproxy在mq-0001默认安装,版本有点,可以配置eprl源,或者自己二进制安装。
[root@hy-mq-0001 ~]# yum install haproxy
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package haproxy.x86_64 0:1.5.18-9.el7_9.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================================================================================================
Package Arch Version Repository Size
==========================================================================================================================================================================
Installing:
haproxy x86_64 1.5.18-9.el7_9.1 updates 835 k
Transaction Summary
==========================================================================================================================================================================
Install 1 Package
Total download size: 835 k
Installed size: 2.6 M
Is this ok [y/d/N]: y
Downloading packages:
haproxy-1.5.18-9.el7_9.1.x86_64.rpm | 835 kB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : haproxy-1.5.18-9.el7_9.1.x86_64 1/1
Verifying : haproxy-1.5.18-9.el7_9.1.x86_64 1/1
Installed:
haproxy.x86_64 0:1.5.18-9.el7_9.1
Complete!
[root@hy-mq-0001 ~]#
配置HAproxy
[root@hy-mq-0001 ~]# cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
[root@hy-mq-0001 ~]# vi /etc/haproxy/haproxy.cfg
[root@hy-mq-0001 ~]# cat /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
#mode http
log global
# option httplog
mode tcp
option tcplog
option dontlognull
option http-server-close
# option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen rabbitmq_admin
bind 0.0.0.0:8102
server hy-mq-0001 172.16.1.244:15672
server hy-mq-0002 172.16.1.8:15672
listen rabbitmq_cluster
bind 0.0.0.0:5679
mode tcp
balance roundrobin
server hy-mq-0001 172.16.1.244:5672 check inter 5000 rise 2 fall 3 weight 1
server hy-mq-0002 172.16.1.86:5672 check inter 5000 rise 2 fall 3 weight 1
listen monitor
bind 0.0.0.0:8100
mode http
option httplog
stats enable
stats uri /stats
stats refresh 5s
[root@hy-mq-0001 ~]# systemctl start haproxy
[root@hy-mq-0001 ~]# systemctl enable haproxy
Created symlink from /etc/systemd/system/multi-user.target.wants/haproxy.service to /usr/lib/systemd/system/haproxy.service.
[root@hy-mq-0001 ~]# systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-11-23 12:28:11 CST; 5min ago
Main PID: 25890 (haproxy-systemd)
CGroup: /system.slice/haproxy.service
├─25890 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
├─25891 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
└─25892 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Nov 23 12:28:11 hy-mq-0001 systemd[1]: Started HAProxy Load Balancer.
Nov 23 12:28:11 hy-mq-0001 haproxy-systemd-wrapper[25890]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
注意:
在公有云上,要记得配置安全组,放通相应的端口。
通过访问http://mq-0001:8100/stats
,查看 HAProxy 负载均衡信息:
10 RabbmitMQ搭建踩坑
1.当从mq-0001上面拷贝.erlang.cookie文件到mq-0002时,没有修改对应的文件。
[root@hy-mq-0002 rabbitmq]# ll .erlang.cookie
-r-------- 1 root root 20 Nov 23 10:28 .erlang.cookie
[root@hy-mq-0002 rabbitmq]#
集群会错误
当然只是加入集群之后的错误,还有一种另外的显示。
2.还有一个缺少配置文件/etc/rabbitmq/rabbitmq-env.conf
目前的实验环境是没有的,需要自己创建,并添加。
[root@hy-mq-0002 rabbitmq]# cat rabbitmq-env.conf
RABBITMQ_NAME=rabbit@hy-mq-0002
这个报错也非常的经典,就是缺少这个配置文件,前提确保你前面的环境没有问题。