RabbitMQ部署指南

简介: 本文介绍了RabbitMQ在CentOS 7上基于Docker的单机与集群部署方案。内容涵盖镜像安装、DelayExchange插件配置,并详细说明了普通模式与镜像模式集群的搭建及测试方法,重点解析了镜像队列的高可用机制。此外,还引入了3.8版本后推荐的仲裁队列,展示其自动容灾与动态扩容能力,为构建稳定可靠的消息中间件系统提供完整实践指南。(239字符)

1.单机部署
我们在Centos7虚拟机中使用Docker来安装。

1.1.下载镜像
1.2.安装MQ
执行下面的命令来运行MQ容器:
启动后即可验证:http://192.168.206.128:15672/#/
2.安装DelayExchange插件
官方的安装指南地址为:官方地址。上述文档是基于linux原生安装RabbitMQ,然后安装插件。
因为我们之前是基于Docker安装RabbitMQ,所以下面我们会讲解基于Docker来安装RabbitMQ插件。
2.1.下载插件
RabbitMQ官方的插件社区地址:链接,其中包含各种各样的插件,包括我们使用的DelayExchange插件:

RABBITMQ.DELAYED.MESSAGE_EXCHANGE

A PLUGIN THAT ADDS DELAYED-MESSAGING (OR SCHEDULED-MESSAGING)TO RABBITMO.

DOWNLOAD FOR 3.7

R.7X AND 3.8.X

AUTHOR:ALVARO VIDELA

GITHUB:RABBITMG/RABBITMG-DELAYED-MESSAGE-EXCHANGE


读者朋友们可以去对应的GitHub页面下载3.8.9版本的插件,地址为:插件地址,这个对应RabbitMQ的3.8.5以上版本。这里我也提供了下载好的插件:

ASSETS

MQ-ADVANCED-DEMO

RABBITMQ DELAYED MESSAGE EXCHANGE-3.8.9-0199D11C.EZ

RABBITMQ部署指南.MD


2.2.上传插件
因为我们是基于Docker安装,所以需要先查看RabbitMQ的插件目录对应的数据卷。如果不是基于Docker的读者朋友们,请参考第一章部分,重新创建Docker容器。
我们之前设定的RabbitMQ的数据卷名称为mq-plugins,所以我们使用下面命令查看数据卷:
可以得到下面结果:

[ROOT@LOCALHOST ~]# DOCKE

: DOCKER VOLUME INSPECT MQ-PLUGINS

"CREATEDAT": "2021-07-12T21:44:26+08:00",

"DRIVER": "LOCAL",

"LABELS": NULL,

DATA

LUGINS/

"MOUNTPOINT":

"/VAR/LIB/DOCKER/VOLUMES/MQ-PLUG

"NAME":

PLUGINS"

LD-BM,

"OPTIONS

NULL,

"SCOPE": "LOCAL"


接下来,将插件上传到这个目录即可:

/VAR/LIB/DOCKER/VOLUMES/MG-PLUGINS/_DATA/

SIZE(KB)

NAME

RABBITMG_AWS-3.8.5.EZ

60

RABBITMQ_CONSISTENT_HASH_EXCHANGE-3.8.5.EZ

34

RABBITMQ_DELAYED_MESSAGE_EXCHANGE-3.8.9-0199D11C.EZ

49


2.3.安装插件
最后就是安装了,需要进入MQ容器内部来执行安装。我的容器名为mq,所以执行下面命令:
执行时,请将其中的 -it 后面的mq替换为你自己的容器名。进入容器内部后,执行下面命令开启插件:
结果如下:

ROOT@MQ1://# RABBITMQ-PLUGINS 6

LUGINS ENABLE RABBITMQ_DELAYED_M

ED_MESSAGE_EXCHANGE

RABBIT@MQ1:

ENABLING PLUGINS ON NODE

RABBITMQ_DELAYED_MESSAGE_EXCHANGE

THE FOLLOWING PLUGINS HAVE BEEN

CONFIGURED:

RABBITMQ_DELAYED_M

AYED_MESSAGE_EXCHANGE

RABBITMQ_MANAGEMENT

RABBITMQ_MANAGEMENT_AGENT

RABBITMQ_WEB_DISPATCH

APPLYING PLUGIN CONFIGURATION TO RABBITEMQ1...

THE FOLLOWING PLUGINS

S HAVE BEEN ENABLED:

RABBITMQ_DELAYED_MESSAGE EXCHANGE

STARTED 1 PLUGINS.


3.集群部署
3.1.集群分类
在RabbitMQ的官方文档中,讲述了两种集群的配置方式:
普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:mq1,和mq2,如果你的消息在mq1,而你连接到了mq2,那么mq2会去mq1拉取消息,然后返回给你。如果mq1宕机,消息就会丢失。
镜像模式:与普通模式不同,队列会在各个mq的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。
我们先来看普通模式集群,我们的计划部署3节点的mq集群:

主机名

控制台端口

amqp通信端口

mq1

8081 ---> 15672

8071 ---> 5672

mq2

8082 ---> 15672

8072 ---> 5672

mq3

8083 ---> 15672

8073  ---> 5672

集群中的节点标示默认都是:rabbit@[hostname],因此以上三个节点的名称分别为:
rabbit@mq1
rabbit@mq2
rabbit@mq3
3.2.获取cookie
RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。cookie 只是一串最多 255 个字符的字母数字字符。
每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。我们先在之前启动的mq容器中获取一个cookie值,作为集群的cookie。执行下面的命令:
可以看到cookie值如下:
也可到指定容器下去查找,路径:/var/lib/docker/volumes/最新数据/_data/.erlang.cookie
接下来,停止并删除当前的mq容器,我们重新搭建集群。
3.3.准备集群配置
在/tmp目录新建一个配置文件 rabbitmq.conf:
文件内容如下:
再创建一个文件,记录cookie
准备三个目录,mq1、mq2、mq3:
然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:
3.4.启动集群
创建一个网络,用作集群间通信:
运行命令


3.5.测试
在mq1这个节点上添加一个队列:

EXCHANGES

CHANNELS

CONNECTIONS

ADMIN

OVERVIEW

QUEUES

QUEUES

ALL QUEUES(0)

NO QUEUES ..

ADD A NEW QUEUE

CLASSIC

队列名称

TYPE:

SIMPLE.QUEUE

NAME:

DURABLE

DURABILITY:

队列所在街道,是RABBIT@MQ1

RABBIT@MG1

NODE:

NO

AUTO DELETE:

STRING

ARGUMENTS:

ADD

MAX LENGTH BYTES

OVERFLOW BEHAVIOUR

?

MESSAGE TTL

AUTO EXPIRE

MAX LENGTH

MAXIMUM PRIORITY

DEAD LETTER ROUTING KEY

?

SINGLE ACTIVE

DEAD LETTER EXCHANGE

CONSUMER

?

MASTER LOCATOR

LAZY MODE

ADD QUEUE


如图,在mq2和mq3两个控制台也都能看到:

QUEUES

ALL QUEUES (1)

PAGINATION

OF 1 - FILTER:

REGEX

V

PAGE

MESSAGE RA

OVERVIEW

MESSAGES

UNACKED

INCOMING

NODE

STATE

NAME

TYPE

TOTAL

FEATURES

READY

SIMPLE.QUEUE

RABBIT@MQ1

IDLE

0

CLASSIC

0

D

0

ARGS


3.5.1.数据共享测试
点击这个队列,进入管理页面:

QUEUES

ALL QUEUES(1)

PAGINATION

1

OF 1 - FILTER:

PAGE

REGEX

MESSAGES

OVERVIEW

READY

UNACKED

STATE

NAME

TYPE

NODE

FEATURES

TOTAL

0

RABBIT@MQ1

CLASSIC

0

IDLE

SIMPLE.GUEUEL

ARGS


然后利用控制台发送一条消息到这个队列:

QUEUE SIMPLE.QUEUE

OVERVIEW

CONSUMERS

BINDINGS

PUBLISH MESSAGE

MESSAGE WILL BE PUBLSHED TO THE DEFAULT EXCHANGE WITH ROUTING KEY SIMPLE.GUEUE, ROUTING IT TO QUEUE;

2-PERSISTENT

DELIVERY MODE:

STRING

HEADERS:

PROPERTIES:

HE 110,

MQ1!

PAYLOAD:

PUBLISH MESSAGE


结果在mq2、mq3上都能看到这条消息:

:8083

192.168.150.101

#/QUEUES

不安全

BRABBITMO

ERLANG 24.0.3

RABBITMQ 3.8.19

TM

ADMIN

CHANNELS

EXCHANGES

OVERVIEW

CONNECTIONS

QUEUES

UEUES

ALL QUES(1)

+/-

MESSAGE RATES

MESSAGES

OVERVIEW

NLAMG

DELIVER/GETACK

INCOMING

0.00/S

0.00/S

0.00/S

SIMPLE.QUEUE

CLASSIC

RABBIT@MG1

IDLE

ARGS


3.5.2.可用性测试
我们让其中一台节点mq1宕机:
然后登录mq2或mq3的控制台,发现simple.queue也不可用了:

192.168.150.101:8083/#/QUEUES

不安全

BRABBITMO

RABBITMO 3.8.19

ERLANG 24.0.3

TM

ADMIN

OVERVIEW

EXCHANGES

CHANNELS

CONNECTIONS

QUEUES

QUEUES

ALL QUEUES(1)

+/-

MESSAGE RATES

MESSAGES

OVERVIEW

INCOMING DELIVER/GET ACK

TOTAL

NODE

TYPE

FEATURES

NAME

UNACKED

READY

STATE

SIMPLE.QUEUE

NAN

NAN

CLASSIC

NAN

RABBIT@MG1

DOWN

D

ARGS


说明数据并没有拷贝到mq2、mq3。显然在生产环境下是不可以的,那么如何更好的做集群设计和优化呢?
4.镜像模式
在刚刚的案例中,一旦创建队列的主机宕机,队列就会不可用。不具备高可用能力。如果要解决这个问题,必须使用官方提供的镜像集群方案。官方文档地址:https://www.rabbitmq.com/ha.html
4.1.镜像模式的特征
默认情况下,队列只保存在创建该队列的节点上。而镜像模式下,创建队列的节点被称为该队列的主节点,队列还会拷贝到集群中的其它节点,也叫做该队列的镜像节点。但是,不同队列可以在集群中的任意节点上创建,因此不同队列的主节点可以不同。甚至,一个队列的主节点可能是另一个队列的镜像节点。用户发送给队列的一切请求,例如发送消息、消息回执默认都会在主节点完成,如果是从节点接收到请求,也会路由到主节点去完成。镜像节点仅仅起到备份数据作用。当主节点接收到消费者的ACK时,所有镜像都会删除节点中的数据。
总结如下:
镜像队列结构是一主多从(从就是镜像)
所有操作都是主节点完成,然后同步给镜像节点
主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失)
不具备负载均衡功能,因为所有操作都会有主节点完成(但是不同队列,其主节点可以不同,可以利用这个提高吞吐量)
4.2.镜像模式的配置
镜像模式的配置有3种模式:

ha-mode

ha-params

效果

准确模式exactly

队列的副本量count

集群中队列副本(主服务器和镜像服务器之和)的数量。count如果为1意味着单个副本:即队列主节点。count值为2表示2个副本:1个队列主和1个队列镜像。换句话说:count = 镜像数量 + 1。如果群集中的节点数少于count,则该队列将镜像到所有节点。如果有集群总数大于count+1,并且包含镜像的节点出现故障,则将在另一个节点上创建一个新的镜像。

all

(none)

队列在群集中的所有节点之间进行镜像。队列将镜像到任何新加入的节点。镜像到所有节点将对所有群集节点施加额外的压力,包括网络I / O,磁盘I / O和磁盘空间使用情况。推荐使用exactly,设置副本数为(N / 2 +1)。

nodes

node names

指定队列创建到哪些节点,如果指定的节点全部不存在,则会出现异常。如果指定的节点在集群中存在,但是暂时不可用,会创建节点到当前客户端连接到的节点。

这里我们以rabbitmqctl命令作为案例来讲解配置语法。
4.2.1.exactly模式
rabbitmqctl set_policy:固定写法
ha-two:策略名称,自定义
"^two\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以two.开头的队列名称
'{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}': 策略内容
"ha-mode":"exactly":策略模式,此处是exactly模式,指定副本数量
"ha-params":2:策略参数,这里是2,就是副本数量为2,1主1镜像
"ha-sync-mode":"automatic":同步策略,默认是manual,即新加入的镜像节点不会同步旧的消息。如果设置为automatic,则新加入的镜像节点会把主节点中所有消息都同步,会带来额外的网络开销
4.2.2.all模式
ha-all:策略名称,自定义
"^all\.":匹配所有以all.开头的队列名
'{"ha-mode":"all"}':策略内容
"ha-mode":"all":策略模式,此处是all模式,即所有节点都会称为镜像节点
4.2.3.nodes模式
rabbitmqctl set_policy:固定写法
ha-nodes:策略名称,自定义
"^nodes\.":匹配队列的正则表达式,符合命名规则的队列才生效,这里是任何以nodes.开头的队列名称
'{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}': 策略内容
"ha-mode":"nodes":策略模式,此处是nodes模式
"ha-params":["rabbit@mq1", "rabbit@mq2"]:策略参数,这里指定副本所在节点名称
4.3.测试
我们使用exactly模式的镜像,因为集群节点数量为3,因此镜像数量就设置为2。运行下面的命令(任一节点均可,这里以mq1为例),进入控制台:
下面,我们创建一个新的队列:

ADD A NEW QUEUE

CLASSIC

TYPE:

队列名称,这里一定要以TWO.开头,因为我们设置的正则表达式是匹配

TWO.

TWO.QUEUE

NAME:

DURABLE

DURABILITY:

队列的主节点是MQ1

RABBIT@MG1

NODE:

NO

AUTO DELETE:

STRING

ARGUMENTS:

ADD MESSAGE TTL ?

OVERFLOW BEHAVIOUR

MAX LENGTH BYTES

MAX LENGTH

AUTO EXPIRE

DEAD LETTER ROUTING KEY ? I SINGLE ACTIVE CONSUMER

DEAD LETTER EXCHANGE

MAXIMUM PRIORITY

MASTER LOCATOR

LAZY MODE

新增

ADD QUEUE


在任意一个mq控制台查看队列:

image.svg

图片加载失败

192.168.150.101:8082/

不安全

QUEUES

BRABBITMQ

ERLANG 24.0.3

RABBITMO 3.8.19

TM

CONNECTIONS

CHANNELS

EXCHANGES

OVERVIEW

ADMIN

QUEUES

QUEUES

ALL QUEUES(2)

MESSAGE RATES

MESSAGES

OVERVIEW

INCOMINGDELIVER/GETACK

READY

FEATURES

UNACKED

STATE

NODE

TOTAL

TYPE

NAME

IDLE

CLASSIC

D ARGS

SIMPLE.QUEUE RABBIT@MQ

CLASSIC

RUNNING

TWO.QUEUE

HA-TWO

RABBIT@MG1 +1

ARGS


4.3.1.测试数据共享
注意:下面的发消息,需要点击图示:+1 ,查看对应的从节点是哪个再去操作,这里我的是mq2

CHANNELS

OVERVIEW

ADMIN

CONNECTIONS

EXCHANGES

QUEUES

QUEUES

ALL QUEUES(2)

MESSAGE RATES

MESSAGES

OVERVIEW

UNACKED

READY

DELIVER/GET

TOTAL

STATE

ACK

TYPE

NODE

INCOMING

FEATURES

NAME

IDLE

CLASSIC

0

SIMPLE.QUEUE RABBIT@MQ1

D

ARGS

IDLE

0

0

CLASSIC

TWO.QUEUE

RABBIT@MG1+1

ARGS

HA-TWO


给two.queue发送一条消息:

OVERVIEW

CHANNELS

ADMIN

EXCHANGES

CONNECTIONS

QUEUES

QUEUE

TWO.QUEUE

OVERVIEW

CONSUMERS

BINDINGS

PUBLISH MESSAGE

MESSAGE WILL BE PUBLSHED TO THE DEFAULT EXCHANGE WITH ROUTING KEY TWO.QUEUE, ROUTING IT TO THIS QUE

2 - PERSISTENT

DELIVERY MODE:

STRING

HEADERS:

PROPERTIES:

EVERYONE!

PAYLOAD:

PUBLISH MESSAGE


然后在mq1、mq2、mq3的任意控制台查看消息:

1:8083/#/QUEUES/%2F/TWO.QUEUE

192.168.150.101

RABBITMQ

RABBITMQ 3.8.19

ERLANG 24.0.3

TM

EXCHANGES

ADMIN

OVERVIEW

CHANNELS

CONNECTIONS

QUEUES

?

AUTO STRING / BASE64

ENCODING:

1

MESSAGES:

GET MESSAGE(S)

MESSAGE 1

THE SERVER REPORTED 0 MESSAGES REMAINING.

(AMQP DEFAULT)

EXCHANGE

ROUTING KEY

TWO.QUEUE

REDELIVERED

0

DELIVERY_MODE:2

PROPERTIES

HEADERS:

PAYLOAD

13 BYTES

HI,EVERYONE!

ENCODING: STRING


4.3.2.测试高可用
现在,我们让two.queue的主节点mq1宕机:
查看集群状态:

NODES

SOCKET DESCRIPTORS ?

MEMORY ?

DISK SPACE

INFO

UPTIME

NAME

ERLANG PROCESSES

FILE DESCRIPTORS

RABBIT@MG1

NODE NOT RUNNING

143 MIB

1H 3M

8.8 GIB

BASIC

DISC

98

402

RABBIT@MG2

RSS

1048576 AVAILABLE

728 MIB HIGH WATERMAT&MIB LOW WATERMARK

1048576 AVAILABLE

943629 AVAILABLE

BASIC

2

8.8 GIB

DISC

1H 3M

35

141 MIB

0

401

RABBIT@MG3

RSS

728 MIB HIGH WATERMAT& MIB LOW WATERMARK

943629 AVAILABLE

1048576 AVAILABLE

1048576 AVAILABLE


查看队列状态:

BRABBITMQ

ERLANG 24.0.3

TM

RABBITMO 3.8.19

CHANNELS

EXCHANGES

ADMIN

QUEUES

CONNECTIONS

OVERVIEW

QUEUES

ALL QUEUES(2)

MESSAGES

MESSAGE RATES

OVERVIEW

TOTAL

STATE

UNACKED

INCOMINGDELIVER/GETACK

NODE

FEATURES

READY

NAME

TYPE

NAN

CLASSIC

NAN

NAN

RABBIT@MG1

DOWN

D

SIMPLE.QUEUE

ARGS

1

0.00/S

0.00/S

0.00/S

IDLE

CLASSIC

DARGS

1

TWO,QUEUE

+1

HA-TWO

RABBIT@MG2


发现依然是健康的!并且其主节点切换到了rabbit@mq2上
5.仲裁队列
从RabbitMQ 3.8版本开始,引入了新的仲裁队列,他具备与镜像队里类似的功能,但使用更加方便。
5.1.添加仲裁队列
在任意控制台添加一个队列,一定要选择队列类型为Quorum类型。

ADD A NEW QUEUE

队列类型,必须选择QUORUM

QUORUM

TYPE:

QUORUM.QUEUE队列名称,随意

NAME:

RABBIT@MG1

NODE:

指定主节点

STRING

ARGUMENTS:

ADD

AUTO EXPIRE

MAX LENGTH

DELIVERY LIMIT

MAX LENGTH BYTES

OVERFLOW BEHAVIOUR

DEAD LETTER ROUTING KEY

MAX IN MEMORY LENGTH

SINGLE ACTIVE CONSUMER

DEAD LETTER EXCHANGE

MAX IN MEMORY BYTES

ADD QUEUE


在任意控制台查看队列:

OVERVIEW

ADMIN

CHANNELS

EXCHANGES

CONNECTIONS

QUEUES

QUEUES

ALL QUEUES(2)

MESSAGE RATES

MESSAGES

OVERVIEW

INCOMING DELIVER/GET ACK

TOTAL

UNACKED

FEATURES STATE

NODE

READY

NAME

TYPE

0

D ARGS

QUORUM.QUEUE

RUNNING

RABBIT@MG1

GUORUM

+2

1

IDLE

SIMPLE.QUEUE

RABBIT@MG1

D

CLASSIC

ARGS


可以看到,仲裁队列的 + 2字样。代表这个队列有2个镜像节点。因为仲裁队列默认的镜像数为5。如果你的集群有7个节点,那么镜像数肯定是5;而我们集群只有3个节点,因此镜像数量就是3.
5.2.测试
可以参考对镜像集群的测试,效果是一样的。
5.3.集群扩容
5.3.1.加入集群
1)启动一个新的MQ容器:
2)进入容器控制台:
3)停止mq进程
4)重置RabbitMQ中的数据:
5)加入mq1:
6)再次启动mq进程

NODES

FILE DESCRIPTORS

DISK SPACE

SOCKET DESCRIPTORS

RESET STATS

ERLANG PROCESSES

UPTIME

MEMORY

INFO

NAME

8.6 GIB

ALL NODES

404

38M 4S

37

THIS NODE

DISC

RABBIT@MG1

BASIC

148 MIB

0

RSS

728 MIB HIGH WATERMAT& MIB LOW WATERMARK

1048576 AVAILABLE

1048576 AVAILABLE

943629

9 AVAILABLE

THIS NODE

RABBIT@MG2

DISC

ALL NODES

BASIC

1H 59M

147 MIB

36

402

8.6GIB

RSS

728 MIB HIGH WATERMAT& MIB LOW WATERMARK

1048576 AVAILABLE

943629 AVAILABLE

1048576 AVAILABLE

149MIB

DISC

ALL NODES

1H 59M

8.6GIB

36

402

BASIC

THIS NODE

RABBIT@MG3

RSS

1048576 AVAILABLE 1 728 MIB HIAH WATERMA& MIB LOW WATERMIN

1048576 AVAILABLE 1 943629 AVAILABLE

DISC

2

BASIC

RABBIT@MG4

16M 10S

THIS NODE

RSS

400

136 MIB

8.6 GIB

35

LL NODES


5.3.2.增加仲裁队列副本
我们先查看下quorum.queue这个队列目前的副本情况,进入mq1容器:
执行命令:
结果:

RABBIT@MQ1

STATUS

OF

QUORUM.QUEUE ON NODE

QUORUM

QUEUE

RAFT STATE

MACHINE VERSION

NODE NAME

SNAPSHOT INDEX

COMMIT INDEX

TERM

LOG INDEX

FOLLOWER

1

UNDEFINED

RABBIT@MQ3

4

4

FOLLOWER

1

4

RABBIT@MQ2

UNDEFINED

UNDEFINED

1

LEADER

4

RABBIT@MQ1


现在,我们让mq4也加入进来:

Shell

运行代码复制代码

1

rabbitmq-queues add_member "quorum.queue" "rabbit@mq4"

结果:

RABBITMQ-QUEUES ADD_MEMBER

ROOT@MQ1://#

RABBIT@MQ4

QUORUMQUEUE

CA FOR QUEUE QUORUM.QUEUE ON NODE

ADDING A REPLICA F

RABBIT@MQ4.

ROOT@MQ1://


再次查看:

Shell

运行代码复制代码

1

rabbitmq-queues quorum_status "quorum.queue"

STATUS OF

RABBIT@MQ1

QUORUM.QUEUE ON NODE

QUEUE

QUORUM

MACHINE VERSION

SNAPSHOT INDEX

RAFT STATE

NODE

TERM

NAME

COMMIT INDEX

LOG INDEX

UNDEFINED

5

FOLLOWER

1

5

1

RABBIT@MQ4

5

FOLLOWER

5

RABBIT@MQ3

1

UNDEFINED

FOLLOWER

5

UNDEFINED

1

5

RABBIT@MQ2

5

1

5

LEADER

1

RABBIT@MQ1

UNDEFINED


查看控制台,发现quorum.queue的镜像数量也从原来的 +2 变成了 +3:

CHANNELS

EXCHANGES

ADMIN

OVERVIEW

CONNECTIONS

QUEUES

QUEUES

ALL QUEUES(2)

OVERVIEW

MESSAGE RAT

MESSAGES

INCOMING

TOTAL

UNACKED

NAME

FEATURES

STATE

READY

NODE

TYPE

0

0

RUNNING

D

GUORUM

QUORUM.GUEUE

+3

RABBIT@MG1

ARGS

SIMPLE.QUEUE

RABBIT@MQ1

1

IDLE

CLASSIC

0

ARGS



相关文章
|
21小时前
|
监控 Java 测试技术
微服务保护Sentinel
本课程深入讲解微服务中雪崩问题的成因及解决方案,重点介绍阿里开源流量治理组件Sentinel的应用。涵盖Sentinel的部署与整合、限流模式(直接、关联、链路)、流控效果(快速失败、预热、排队等待)、熔断降级、线程隔离、授权规则及规则持久化等内容,结合Jmeter压测实战,帮助开发者全面提升微服务稳定性与高可用能力。
|
21小时前
|
存储 NoSQL 网络协议
Redis集群部署指南
本教程基于CentOS7讲解Redis集群搭建,涵盖单机安装、主从复制、哨兵模式及分片集群的配置与测试,详细演示了多实例部署、节点关联、故障转移与数据分片等核心操作。
 Redis集群部署指南
|
21小时前
|
SQL 容灾 数据库
分布式事务Seata
本章学习分布式事务问题及解决方案,涵盖CAP、BASE理论,并深入讲解Seata框架的XA、AT、TCC、SAGA四种模式原理与实现,掌握跨服务事务一致性处理及高可用部署。
 分布式事务Seata
|
20小时前
|
JSON 算法 Java
DSL语法、搜索结果处理
本文介绍了Elasticsearch(ES)的数据搜索功能,涵盖DSL查询语法、全文检索、精确查询、地理坐标查询及复合查询等类型。通过RestClient实现搜索,并结合黑马旅游案例,演示了酒店搜索、过滤、竞价排名等功能的实现过程,帮助读者掌握ES在实际项目中的应用。
 DSL语法、搜索结果处理
|
19小时前
|
NoSQL Java Redis
微服务概述
本文对比单体应用与微服务架构,阐述微服务的定义、核心特征及优缺点。微服务通过服务拆分、独立部署、轻量通信实现高内聚、低耦合,提升系统可维护性与扩展性,但也带来运维复杂、分布式事务等挑战,并介绍基于SpringCloud的技术实现方案。
 微服务概述
|
20小时前
|
存储 缓存 NoSQL
分布式缓存Redis(高级)
本文系统讲解Redis持久化机制、主从复制、哨兵模式及分片集群的原理与实践。涵盖RDB与AOF持久化策略、数据同步原理、故障恢复机制,以及如何通过RedisTemplate实现高可用架构,助力Redis在生产环境中的稳定落地。
分布式缓存Redis(高级)
|
21小时前
|
消息中间件 存储 数据挖掘
应用架构图
技术架构是将业务需求转化为技术实现的关键过程,涵盖分层设计、技术选型与系统集成。本文详解单体与分布式架构,包括展现层、业务层、数据层及基础层的设计原则,并通过调用关系图明确系统边界与内外依赖,支撑高效稳定的技术体系构建。
应用架构图
|
20小时前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本文深入探讨RabbitMQ在生产环境中的高级应用,涵盖消息可靠性、延迟消息、消息堆积及集群高可用等核心问题。通过生产者确认、持久化、消费者确认机制确保消息不丢失;利用TTL与死信交换机实现延迟队列;借助惰性队列提升堆积能力;最后通过普通集群、镜像集群及仲裁队列实现高可用架构。
 消息中间件RabbitMQ(高级)
|
20小时前
|
存储 网络协议 Docker
ElasticSearch集群
Elasticsearch集群通过分片(shard)和副本(replica)解决海量数据存储与单点故障问题。数据被拆分为多个分片分布于不同节点,提升存储与性能;副本保障高可用。集群具备自动故障转移与脑裂防护机制,支持水平扩展,确保数据安全与服务稳定。
ElasticSearch集群
|
21小时前
|
存储 负载均衡 Java
Sentinel工作原理
Sentinel 是面向分布式服务架构的流量治理组件,以“资源”为核心概念,通过流量控制、熔断降级、系统负载保护等规则保障系统稳定。支持灵活配置与动态调整,实现高可用防护。