RabbitMQ 集群部署

Rabbitmq 集群分为二种

  • 普通模式:创建好 RabbitMQ 集群之后的默认模式。
  • 镜像模式:把需要的队列做成镜像队列。

普通集群模式

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

镜像集群模式

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

集群中有两种节点类型

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

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

推荐设计架构

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

1、Ubuntu 2004 安装RabbitMQ

集群环境

# 三台服务器
192.168.1.81
192.168.1.82
192.168.1.83

主机名解析配置

# vim /etc/hosts
192.168.1.81 mq01
192.168.1.82 mq02
192.168.1.83 mq03

安装步骤与单台部署一致

2、创建 RabbitMQ 集群

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

各服务器关闭 RabbitMQ

root@mq01:~# systemctl stop rabbitmq-server
root@mq02:~# systemctl stop rabbitmq-server
root@mq03:~# systemctl stop rabbitmq-server

# 在 mq-server1 同步.erlang.cookie 至其他两台
root@mq01:~# scp /var/lib/rabbitmq/.erlang.cookie 192.168.1.82:/var/lib/rabbitmq/.erlang.cookie

root@mq01:~# scp /var/lib/rabbitmq/.erlang.cookie 192.168.1.83:/var/lib/rabbitmq/.erlang.cookie

各服务器启动 RabbitMQ

root@mq01:~# systemctl start rabbitmq-server
root@mq02:~# systemctl start rabbitmq-server
root@mq03:~# systemctl start rabbitmq-server

查看当前集群状态

root@mq01:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
Basics

Cluster name: rabbit@mq01

Disk Nodes

rabbit@mq01

Running Nodes

rabbit@mq01

Versions

rabbit@mq01: RabbitMQ 3.11.5 on Erlang 25.2

root@mq02:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq02 ...
Basics

Cluster name: rabbit@mq02

Disk Nodes

rabbit@mq02

Running Nodes

rabbit@mq02

Versions

rabbit@mq02: RabbitMQ 3.11.5 on Erlang 25.2

root@mq03:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq03 ...
Basics

Cluster name: rabbit@mq03

Disk Nodes

rabbit@mq03

Running Nodes

rabbit@mq03

Versions

rabbit@mq03: RabbitMQ 3.11.5 on Erlang 25.2

创建 RabbitMQ 集群

在 mq01 作为内存节点添加到 mq03,并作为内存节点

root@mq01:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq01 ...
root@mq01:~# rabbitmqctl reset
Resetting node rabbit@mq01 ...
root@mq01:~# rabbitmqctl join_cluster rabbit@mq03 --ram
Clustering node rabbit@mq01 with rabbit@mq03
root@mq01:~# rabbitmqctl start_app
Starting node rabbit@mq01 ...

在 mq02 作为内存节点添加到 mq03,并作为内存节点

root@mq02:~# rabbitmqctl stop_app
Stopping rabbit application on node rabbit@mq02 ...
root@mq02:~# rabbitmqctl reset
Resetting node rabbit@mq02 ...
root@mq02:~# rabbitmqctl join_cluster rabbit@mq03 --ram
Clustering node rabbit@mq02 with rabbit@mq03
root@mq02:~# rabbitmqctl start_app
Starting node rabbit@mq02 ...

将集群设置为镜像模式

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

root@mq01:~# rabbitmqctl set_policy ha-all "#" '{"ha-mode":"all"}'
Setting policy "ha-all" for pattern "#" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

验证当前集群状态

root@mq01:~# rabbitmqctl cluster_status
Cluster status of node rabbit@mq01 ...
Basics

Cluster name: rabbit@mq01

Disk Nodes

rabbit@mq03

RAM Nodes

rabbit@mq01
rabbit@mq02

Running Nodes

rabbit@mq01
rabbit@mq02
rabbit@mq03

Versions

rabbit@mq01: RabbitMQ 3.11.5 on Erlang 25.2
rabbit@mq02: RabbitMQ 3.11.5 on Erlang 25.2
rabbit@mq03: RabbitMQ 3.11.5 on Erlang 25.2

3、web 界面验证集群状态

各节点启动 web 插件

root@mq01:~# rabbitmq-plugins enable rabbitmq_management
root@mq02:~# rabbitmq-plugins enable rabbitmq_management
root@mq03:~# rabbitmq-plugins enable rabbitmq_management

root@mq01:~# vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.11.5/plugins/rabbit-3.11.5/ebin/rabbit.app
 40             {loopback_users, []},     #删除被禁止登陆的 guest 账户

root@mq01:~# systemctl restart rabbitmq-server
图片[1]-RabbitMQ 集群部署-李佳程的个人主页

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享