Linux搭建RabbitMQ集群

小柒博客 RabbitMQ评论5633字数 4956阅读16分31秒阅读模式

一、RabbiMQ简介

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),RabbitMQ是一套开源(MPL)的消息队列服务软件,是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成。集群非常方便,因为Erlang天生就是一门分布式语言,但其本身并不支持负载均衡。

1RabbitMQ支持操作系统

Linux

WindowsNT 到 10

Windows Server2003 到 2016

macOS

Solaris

FreeBSD

TRU64

VxWorks

RabbitMQ支持下列编程语言:

Python

Java

Ruby

PHP

C#

JavaScript

Go

Elixir

Objective-C

Swift

2RabbiMQ模式

RabbitMQ模式大概分为以下三种:

1)单一模式。

2)普通模式(默认的集群模式)。

3)镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比较适用)。
要实现镜像模式,需要先搭建一个普通集群模式,在这个模式的基础上再配置镜像模式以实现高可用。

3RabbiMQ特点

可伸缩性:集群服务

消息持久化:从内存持久化消息到硬盘,再从硬盘加载到内存

部署环境:

IP地址

主机名

操作系统

防火墙和SELinux

用途

192.168.36.198

rabbitmq_1

CentOS 7.9.2009

关闭

磁盘节点

192.168.36.199

rabbitmq_2

CentOS 7.9.2009

关闭

内存节点

192.168.36.200

rabbitmq_3

CentOS 7.9.2009

关闭

内存节点

注意,这里三台服务器都连接上互联网,另外RabbitMQ集群节点必须在同一网段里,如果是跨广域网,效果会变差。

二、RabbitMQ集群配置

1、配置hosts文件和主机名

# rabbitmq_1

[root@localhost ~]# hostnamectl set-hostname rabbitmq_1

[root@localhost ~]# cat >>/etc/hosts <<EOF

192.168.36.198 rabbitmq_1

192.168.36.199 rabbitmq_2

192.168.36.200 rabbitmq_3

EOF

# rabbitmq_2

[root@localhost ~]# hostnamectl set-hostname rabbitmq_2

[root@localhost ~]# cat >>/etc/hosts <<EOF

192.168.36.198 rabbitmq_1

192.168.36.199 rabbitmq_2

192.168.36.200 rabbitmq_3

EOF

# rabbitmq_3

[root@localhost ~]# hostnamectl set-hostname rabbitmq_3

[root@localhost ~]# cat >>/etc/hosts <<EOF

192.168.36.198 rabbitmq_1

192.168.36.199 rabbitmq_2

192.168.36.200 rabbitmq_3

EOF

2、三个节点配置yum源,安装Rabbitmq软件

[root@localhost ~]# yum -y install epel-release

[root@localhost ~]# yum -y install rabbitmq-server

3、分别查看三个节点并添加管理服务,最后启动rabbitmq服务

RabbitMQ提供了一个非常友好的图形化监控页面插件(rabbitmq_management),让我们可以一目了然看见Rabbit的状态或集群状态。

# 查看插件安装情况

[root@rabbitmq_1 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins list

# 启用Rabbitmq_management服务

[root@rabbitmq_1 ~]# /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management

# 启用Rabbitmqt服务

[root@rabbitmq_1 ~]# systemctl start rabbitmq-server

4、拷贝erlang.cookie

Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。所以必须保证各节点cookie一致,不然节点之间就无法通信。

[root@rabbitmq_1 ~]# cat /var/lib/rabbitmq/.erlang.cookie

FUYLWVSUTVHYXDQIWNQT

用scp的方式将rabbitmq_1节点的.erlang.cookie的值复制到其他两个节点中。

[root@rabbitmq_1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.36.199:/var/lib/rabbitmq/.erlang.cookie

[root@rabbitmq_2 ~]# systemctl restart rabbitmq-server

[root@rabbitmq_1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.36.200:/var/lib/rabbitmq/.erlang.cookie

[root@rabbitmq_3 ~]# systemctl restart rabbitmq-server

5、查看监听端口(插件监控的端口是15672)

[root@rabbitmq_1 ~]# netstat -ntap |grep 5672

6、将rabbitmq_2、rabbitmq_3作为内存节点加入rabbitmq_1节点集群中

在rabbitmq_2执行如下命令

# 停掉Rabbit应用

[root@rabbitmq_2 ~]# rabbitmqctl stop_app

# 加入到磁盘节点

[root@rabbitmq_2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq_1

# 启动Rabbit应用

[root@rabbitmq_2 ~]# rabbitmqctl start_app

在rabbitmq_3执行如下命令

# 停掉Rabbit应用

[root@rabbitmq_3 ~]# rabbitmqctl stop_app

# 加入到磁盘节点

[root@rabbitmq_3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq_1

# 启动Rabbit应用

[root@rabbitmq_3 ~]# rabbitmqctl start_app

1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,rabbitmq_2和rabbitmq_3是内存节点,rabbitmq_1是磁盘节点。

2)如果要使rabbitmq_2、rabbitmq_3都是磁盘节点,去掉--ram参数即可。

3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type disc(ram),前提是必须停掉rabbit应用

7、查看集群状态

[root@rabbitmq_1 ~]# rabbitmqctl cluster_status

8、登录Rabbitmq web管理控制台,创建新的队列

1)打开浏览器输入http://192.168.36.198:15672, 输入默认的Username:guest,输入默认的Password:guest,登录后出现如图所示的界面。

Linux搭建RabbitMQ集群-图片1

Linux搭建RabbitMQ集群-图片2

2)根据界面提示创建一条队列


在RabbitMQ集群集群中,必须至少有一个磁盘节点,否则队列元数据无法写入到集群中,当磁盘节点宕掉时,集群将无法写入新的队列元数据信息。

三、RabbitMQ镜像集群配置

上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制。虽然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。

镜像队列是基于普通的集群模式的,然后再添加一些策略,所以你还是得先配置普通集群,然后才能设置镜像队列,我们就以上面的集群接着做。

设置的镜像队列可以通过开启的网页的管理端,也可以通过命令,这里说的是其中的网页设置方式。

1、创建rabbitmq策略

在rabbitmq_1节点的控制台上创建策略

1)点击admin菜单–>右侧的Policies选项–>左侧最下下边的Add/update a policy。

2)按照图中的内容根据自己的需求填写。

Name:策略名称

Pattern:匹配的规则,这里表示匹配a开头的队列,如果是匹配所有的队列,那就是^.

Definition:使用ha-mode模式中的all,也就是同步所有匹配的队列。问号链接帮助文档。

3)点击Add policy添加策略

Linux搭建RabbitMQ集群-图片3

此时分别登陆rabbitmq_2、rabbitmq_3两个节点的控制台,可以看到上面添加的这个策略,如图所示:

Linux搭建RabbitMQ集群-图片4

Linux搭建RabbitMQ集群-图片5

2、添加队列

在rabbitmq_1节点的控制台上添加队列

1)点击Queues菜单–>左侧下边的Add a new queue

2)输入Name和Arguments参数的值,别的值默认即可

Linux搭建RabbitMQ集群-图片6

Name:队列名称

Durability:队列是否持久化

Node:消息队列的节点

Auto delete:自动删除

Arguments:使用的策略类型

3)点击Add queue

Linux搭建RabbitMQ集群-图片7

将鼠标指向+2可以显示出另外两台消息节点。

3、创建消息

1)点击abc队列按钮

2)拖动滚动条,点击publish message

3)填写相关内容

Linux搭建RabbitMQ集群-图片8

2-Persistent:表示持久化

Headers:随便填写即可

Properties:点击问号,选择一个消息ID号

Payload:消息内容

4)点击Publish message按钮

Linux搭建RabbitMQ集群-图片9

点击queue按钮,发现abc队列的Ready和Total中多了一条消息记录。

4、做破坏性测试

1)将rabbitmq_1节点的服务关闭,再通过rabbitmq_2和rabbitmq_3查看消息记录是否还存在。

# 停掉rabbitmq_1的rabbit应用

[root@rabbitmq_1 ~]# rabbitmqctl stop_app

从中可以看到abc队列已经从之前的+2显示成+1了,而且消息记录是存在的。

再将rabbitmq_2节点的服务关闭,通过rabbitmq_3查看消息记录是否还存在。

# 停掉rabbitmq_2的rabbit应用

[root@rabbitmq_2 ~]# rabbitmqctl stop_app

从中可以看到abc队列和消息记录还是存在的,只是变成了一个节点了。

再将rabbitmq_1和rabbitmq_2的服务再启动起来

# 启动rabbitmq_1的Rabbit应用

[root@rabbitmq_1 ~]# rabbitmqctl start_app

# 启动rabbitmq_2的Rabbit应用

[root@rabbitmq_2 ~]# rabbitmqctl start_app

从中可以看到abc队列后面+2变成了粉色,鼠标指上去显示镜像无法同步。如果这时候停掉rabbitmq_3节点的服务,那么队列里面的消息将会丢失。

采取的解决办法是选择在rabbitmq_2节点上执行同步命令。

# 同步abc队列

[root@rabbitmq_2 ~]# rabbitmqctl sync_queue abc

同步完成后,+2又变成了蓝色。

这样,我们就测试了Rabbitmq集群的破坏性测试,说明集群配置成功。

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信公众号
微信扫一扫,关注我!
weinxin
小柒博客
  • 本文由 小柒博客 发表于 2023年9月26日17:32:18
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/9603.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证