一、RabbitMQ 两种集群部署方式

1.1 普通集群模式

queue 创建之后,如果没有其它 policy,消息实体只存在于其中 一个节点,A、B 两个 Rabbitmq 节点仅有相同的元数据,即队列结构,但队列的 数据仅保存有一份,即创建该队列的 rabbitmq 节点(A 节点),当消息进入 A 节 点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行 消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer,所以 consumer 可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后, B 节点无法取到 A 节点中还未消费的消息实体。

1.2 镜像集群模式

把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案(镜 像模式是在普通模式的基础上,增加一些镜像策略)
该模式解决了普通模式中的数据丢失问题,其实质和普通模式不同之处在于,消 息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取,该模 式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之 大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在 对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy, 然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集 群模式或镜像队列。

1.3 集群中有两种节点类型

内存节点:只将数据保存到内存
磁盘节点:保存数据到内存和磁盘

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们, 否则所有数据消息在服务器全部停机之后都会丢失。

推荐设计架构: 在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节 点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作 为数据备份使用。

二、主机名解析

各 MQ 服务器配置本地主机名解析

10.0.0.31 mq1.example.local mq1
10.0.0.32 mq2.example.local mq2
10.0.0.33 mq3.example.local mq3

三、安装RabbitMQ

sudo apt-get install curl gnupg debian-keyring debian-archive-keyring apt-transport-https -y

sudo apt-key adv --keyserver "hkps://keys.openpgp.org" --recv-keys "0x0A9AF2115F4687BD29803A206B73A36E6026DFCA"

curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key | sudo apt-key add -

curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
## Provides modern Erlang/OTP releases
##
deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main
deb-src https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/ubuntu bionic main

## Provides RabbitMQ
##
deb https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
deb-src https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/ubuntu bionic main
EOF

sudo apt-get update -y

sudo apt-get install -y erlang-base \
                        erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
                        erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
                        erlang-runtime-tools erlang-snmp erlang-ssl \
                        erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl

sudo apt-get install rabbitmq-server -y --fix-missing

四、启动服务

systemctl enable --now rabbitmq-server

五、创建 RabbitMQ 集群

Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起erlang 的集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个 cookie 存放在 /var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信。

5.1 第一步:各服务器关闭 RabbitMQ

systemctl stop rabbitmq-server

5.2 第二步:在mq-server1同步.erlang.cookie至其他两台服务器

scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.32:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie 10.0.0.33:/var/lib/rabbitmq/.erlang.cookie

5.3 第三步:各服务器启动 RabbitMQ

systemctl start rabbitmq-server

5.4 第四步:查看当前集群状态

root@mq1:/var/lib/rabbitmq# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
Basics

Cluster name: rabbit@mq1.example.local    #集群名称

Disk Nodes    #磁盘节点

rabbit@mq1

Running Nodes    #运作中节点

rabbit@mq1

Versions    #版本

rabbit@mq1: RabbitMQ 3.9.0 on Erlang 24.0.4

5.5 第五步:创建 RabbitMQ 集群

在 mq-server2 作为内存节点添加到 mq-server1,并作为内存节点,在 mq-server2 执行以下命令

rabbitmqctl stop_app    #停止 app 服务
rabbitmqctl reset    #清空元数据
rabbitmqctl join_cluster rabbit@mq1 --ram    #将rabbitmq-server2添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点
rabbitmqctl start_app    #启动 app 服务

在 mq-server3 作为内存节点添加到 mq-server1,并作为内存节点,在 mq-server3 执行以下命令

rabbitmqctl stop_app    #停止 app 服务
rabbitmqctl reset    #清空元数据
rabbitmqctl join_cluster rabbit@mq1 --ram    #将rabbitmq-server2添加到集群当中,并成为内存节点,不加--ram默认是磁盘节点
rabbitmqctl start_app    #启动 app 服务

5.6 第六步:将集群设置为镜像模式

只要在其中一台节点执行以下命令即可

rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'

5.7 第七步:验证当前集群状态

root@mq1:/var/lib/rabbitmq# rabbitmqctl cluster_status
Cluster status of node rabbit@mq1 ...
Basics

Cluster name: rabbit@mq1.example.local

Disk Nodes

rabbit@mq1

RAM Nodes

rabbit@mq2
rabbit@mq3

Running Nodes

rabbit@mq1
rabbit@mq2
rabbit@mq3

Versions

rabbit@mq1: RabbitMQ 3.9.0 on Erlang 24.0.4
rabbit@mq2: RabbitMQ 3.9.0 on Erlang 24.0.4
rabbit@mq3: RabbitMQ 3.9.0 on Erlang 24.0.4

5.8 第八步:web 界面验证集群状态

各 RabbitMQ 服务器安装

rabbitmq-plugins enable rabbitmq_management

5.9 第九步:创建账号并授权

rabbitmqctl add_user xiaoming 123456
rabbitmqctl set_user_tags xiaoming administrator
rabbitmqctl set_permissions xiaoming ".*" ".*" ".*"

5.10 第十步:开启 web 插件后的集群状态

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐