RocketMQ

297 阅读15分钟

1、什么是消息队列(message queue)

消息队列就是基础数据结构中的 先进先出 的一种数据机构,可以简单的理解为生活中买东西时的排队消费,先排队,先消费、结算。

消息队列主要解决问题:流量削峰、消息分发、异步消息

1、流量削峰:例如系统最多可以处理1万条请求,但在高峰期的时间有更多的请求,这个时候我们就需要消息队列来作为中间的缓冲区,将请求分散为一段时间处理,虽然延长了反应时间,但是总要好过请求失败。

2、消息分发:A会产生数据,B对数据感兴趣,如果没有消息的队列 A每次处理完就需要调用一下B服务,过一段时间后,C也对数据感兴趣,A就需要在处理完后分别调用B、C,在消费者多的情况下,非常不方便。有了消息队列后,A只管发送一次消息,B对消息感兴趣,只需要监听消息。C感兴趣,C也去监听消息。A服务作为基础服务不需要做改动。

3、异步消息:有些服务间的调用是异步的,例如A调用B,B需要花费很长时间执行,但是A需要知道B什么时候可以执行完,以前一般有两种方式,A过一段时间去调用B的查询api查询。使用消息队列,可以很方便解决这个问题,A调用B服务后,只需要监听B处理完成的消息,当B处理完成后,会发送一条消息给MQ,MQ会将此消息转发给A服务。

2、消息队列现状

截至2021.07,市面上主流的消息队列(message queue)有:RabbitMQ、Apache Kafka、Apache Pulsar、Apache RocketMQ等。

各家的消息队列各有优劣,对于我们使用者来说,消息队列的选型主要依靠以下的这几个方面决定。

1、可靠性:分布式架构(高可用)、故障修复转移、消息队列数据丢失

2、性能:吞吐量、实效性(延时)

3、功能维度:优先级队列、消费模式、跨语言的支持、安全机制等

4、运维管理:社区文档、集群扩容、版本更新、集群监控

5、社区生态、活跃程度:bug修复、新功能、性能优化

简单对比:

\

消息队列RabbitMQApache KafkaApache PulsarApache RocketMQ
可靠性基于主从架构实现高可用。分布式高可用架构。分布式高可用架构,存储计算分离。分布式高可用架构。
性能延迟:微秒级,这是 RabbitMQ 的一大特点,延迟最低。 吞吐量:万级,比 RocketMQ、Kafka 低一个数量级延迟:ms级延迟,但topic 从几十到几百个时候,吞吐量会大幅度下降,在同等机器下,Kafka 尽量保证 topic 数量不要过多。 吞吐量:10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景。延迟:ms级延迟。 吞吐量:10 万级,可以支撑高吞吐。延迟:ms 级延迟,topic 可以达到几百/几千的级别,吞吐量会有较小幅度的下降,这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic。 吞吐量:10 万级,可以支撑高吞吐。
功能维度基于 erlang 开发,性能极好,延迟很低。功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用。功能较为全面,一方面可以满足各种 MQ,例如 RabbitMQ、ActiveMQ 等线上交易系统的需求,另一方面可以满足和 Kafka 类似的高吞吐的需求的场景。(兼容性很强)MQ 功能较为完善,扩展性好。
运维管理扩容:不支持动态扩容,版本更新。扩容:通过ZK实现动态扩容,版本更新。扩容:支持动态扩容,版本更新。扩容:支持动态扩容,版本更新。
社区生态推出时间较早,第三方博客文档较多Apache开源,官方文档和论坛文档都比较全面,版本更新较快(Apache开源)由雅虎开发,主要是为了应对雅虎企业内部使用的MQ较为繁杂,做统一而研发的MQ,所以兼容性很强兼容kafka等多种mq的迁移。(Apache开源)由阿里巴巴开发。

3、Apache RocketMQ基本概念

RocketMQ主要由 Producer、Broker、Consumer、NameServer组成,其中Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息,NameServer是Topic路由注册中心,支持Broker的动态注册与发现。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个Topic的消息,每个Topic的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个Consumer 实例构成。


img

1、代理服务器(Broker Server)

Broker主要负责消息的存储、投递和查询以及服务高可用保证,为了实现这些功能,Broker包含了以下几个重要子模块。

  • Remoting Module:整个Broker的实体,负责处理来自clients端的请求。
  • Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的Topic订阅信息
  • Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。
  • HA Service:高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能。
  • Index Service:根据特定的Message key对投递到Broker的消息进行索引服务,以提供消息的快速查询。

2、名字服务(Name Server)

NameServer是一个非常简单的Topic路由注册中心,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活。路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。

3、主题(Topic)

表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。

4、订阅与发布(Sub/Pub)

消息的发布是指某个生产者向某个topic发送消息。消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据。

3、RocketMQ部署

1、基础环境

 64bit OS, Linux/Unix/Mac is recommended;(Windows user see guide below)
 64bit JDK 1.8+;
 Maven 3.2.x;
 Git;
 4g+ free disk for Broker server

1、jdk安装

 wget  https://mirrors.huaweicloud.com/java/jdk/8u152-b16/jdk-8u152-linux-x64.tar.gz
 tar -zxvf jdk-8u152-linux-x64.tar.gz
 mv jdk1.8.0_152/ /usr/local/jdk
 ​
 vim /etc/profile
 #追加
 export JAVA_HOME=/usr/local/jdk
 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
 export PATH=$JAVA_HOME/bin:$HOME/bin:$HOME/.local/bin:$PATH
 ​
 source /etc/profile
 ​
 [root@rocketmq1 local]# java -version
 java version "1.8.0_152"
 Java(TM) SE Runtime Environment (build 1.8.0_152-b16)
 Java HotSpot(TM) 64-Bit Server VM (build 25.152-b16, mixed mode)

2、maven安装

 wget https://mirrors.aliyun.com/apache/maven/maven-3/3.2.5/binaries/apache-maven-3.2.5-bin.tar.gz
 tar -zxvf apache-maven-3.2.5-bin.tar.gz
 mv apache-maven-3.2.5 /usr/local/maven-3.2
 ​
 vim /etc/profile
 #追加
 export MAVEN_HOME=/usr/local/maven-3.2
 export PATH=$PATH:$MAVEN_HOME/bin
 ​
 source /etc/profile
 ​
 [root@rocketmq1 dledger-dledger-0.2.2]# mvn -version
 Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:23+08:00)
 Maven home: /usr/local/maven-3.2
 Java version: 1.8.0_152, vendor: Oracle Corporation
 Java home: /usr/local/jdk/jre
 Default locale: zh_CN, platform encoding: UTF-8
 OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"

3、安装git

 yum install -y git

4、rocketmq构建

 wget https://github.com/apache/rocketmq/archive/refs/tags/rocketmq-all-4.9.0.tar.gz
 tar -zxvf rocketmq-all-4.9.0.tar.gz
 cd rocketmq-rocketmq-all-4.9.0/
 mvn -Prelease-all -DskipTests clean install -U
 cd distribution/target/rocketmq-4.9.0/rocketmq-4.9.0

2、配置文件

1、各种模式的配置文件

conf 目录下,RocketMQ 提供了多种 Broker 的配置文件:

  • broker.conf :单主,异步刷盘。
  • 2m/ :双主,异步刷盘。
  • 2m-2s-async/ :两主两从,异步复制,异步刷盘。
  • 2m-2s-sync/ :两主两从,同步复制,异步刷盘。
  • dledger/ :Dledger 集群,至少三节点。

2、多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样。
  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

3、多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。
  • 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。


image-20210804184306260

3、运行

初次启动namesvr

 nohup sh bin/mqnamesrv &

报错1:

 -Djava.ext.dirs=/usr/local/jdk-10/jre/lib/ext:/home/rocketmq/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/../lib:/usr/local/jdk-10/lib/ext is not supported.  Use -classpath instead.
 Error: Could not create the Java Virtual Machine.
 Error: A fatal exception has occurred. Program will exit.

注意:RocketMq默认不支持jdk1.8以上,如果要使用,需要改各种脚本、环境变量。

报错2:

 java.lang.RuntimeException: Lock failed,MQ already started
   at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:214)
   at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:827)
   at org.apache.rocketmq.broker.BrokerStartup.start(BrokerStartup.java:64)
   at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)

将 broker 的 master 和 slave 节点放在同一台机器上,配置的storePath相同导致的,修改配置文件,改为不同的路径。

内存设置:

RocketMQ默认配置是比较好的,这样可以直接应用于生产环境,所以如果机器内存较小,可以手动调整JVM的配置,可以先编辑bin/mqbroker会看到最后还是调用了bin/runbroker.sh,这里打开bin/runbroker.sh,找到jvm启动配置如下:

 JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512M"

Java虚拟机的参数堆设置 -server:作为第一个参数,在多个CPU时性能佳 -Xms:初始堆内存大小,Server端JVM最好将-Xms和-Xmx设为相同值 -Xmx:堆内存最大值,建议不要超过物理内存的一半 -Xmn:年轻代堆内存的大小,一般设置为Xmx的三分之一

2、集群部署

1、节点规划

2、配置文件

broker-a.properties

 #所属集群名字
 brokerClusterName=rocketmq-cluster
 #broker名字,注意此处不同的配置文件填写的不一样  例如:在a.properties 文件中写 broker-a  在b.properties 文件中写 broker-b
 brokerName=broker-a
 #0 表示 Master,>0 表示 Slave
 brokerId=0
 #删除文件时间点,默认凌晨 4点
 deleteWhen=04
 #文件保留时间,默认 48 小时
 fileReservedTime=120
 #Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
 brokerRole=ASYNC_MASTER
 #刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
 flushDiskType=SYNC_FLUSH
 #Broker 对外服务的监听端口
 listenPort=10911
 #nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
 namesrvAddr=192.168.31.205:9876;192.168.31.206:9876
 #每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
 defaultTopicQueueNums=4
 #是否允许 Broker 自动创建Topic,生产建议关闭
 autoCreateTopicEnable=true
 #是否允许 Broker 自动创建订阅组,生产建议关闭
 autoCreateSubscriptionGroup=true
 #设置BrokerIP
 brokerIP1=192.168.31.205
 #存储路径
 storePathRootDir=/home/rocketmq-all-4.9.0-source-release/data/store-a
 #commitLog 存储路径
 storePathCommitLog=/home/rocketmq-all-4.9.0-source-release/data/store-a/commitlog
 #消费队列存储路径存储路径
 storePathConsumerQueue=/home/rocketmq-all-4.9.0-source-release/data/store-a/consumequeue
 #消息索引存储路径
 storePathIndex=/home/rocketmq-all-4.9.0-source-release/data/store-a/index
 #checkpoint 文件存储路径
 storeCheckpoint=/home/rocketmq-all-4.9.0-source-release/data/store-a/checkpoint
 #abort 文件存储路径
 abortFile=/home/rocketmq-all-4.9.0-source-release/data/store-a/abort
 #commitLog每个文件的大小默认1G
 mapedFileSizeCommitLog=1073741824
 #ConsumeQueue每个文件默认存30W条,根据业务情况调整
 mapedFileSizeConsumeQueue=300000

不同的Broker之间修改brokerNamestorePathRootDir相关路径等信息。

3、相关命令

启动nameserver:

 nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqnamesrv  &

启动broker:

 #节点1执行:
 sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-a.properties &
 sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-b-s.properties &
 #节点2执行:
 sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-b.properties &
 sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/2m-2s-async/broker-a-s.properties &

查看状态:

 [root@rocketmq1 rocketmq-4.9.0]# jps
 1521 NamesrvStartup
 1427 BrokerStartup
 1549 BrokerStartup
 1661 Jps
 [root@rocketmq1 rocketmq-4.9.0]# netstat -tlnp
 Active Internet connections (only servers)
 Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
 tcp        0      0 192.168.31.205:22       0.0.0.0:*               LISTEN      938/sshd
 tcp6       0      0 :::9876                 :::*                    LISTEN      1521/java
 tcp6       0      0 :::10909                :::*                    LISTEN      1427/java
 tcp6       0      0 :::10911                :::*                    LISTEN      1427/java
 tcp6       0      0 :::10912                :::*                    LISTEN      1427/java
 tcp6       0      0 :::11009                :::*                    LISTEN      1549/java
 tcp6       0      0 :::11011                :::*                    LISTEN      1549/java
 tcp6       0      0 :::11012                :::*                    LISTEN      1549/java
 /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
 ​
 [root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
 RocketMQLog:WARN Please initialize the logger system properly.
 #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
 rocketmq-cluster  broker-a                0     192.168.31.205:10911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.45 -1.0000
 rocketmq-cluster  broker-a                1     192.168.31.206:11011   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.45 0.0079
 rocketmq-cluster  broker-b                0     192.168.31.206:10911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.45 -1.0000
 rocketmq-cluster  broker-b                1     192.168.31.205:11011   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.45 0.0079

集群Master宕机无法进行故障转移

2主2从集群搭建好了,但是这种集群没有容灾能力,也就是说假如一台master挂了,没有办法选举一个新的master出来。

broker-amaster(192.168.31.205:10911)服务停掉看一下:

 [root@rocketmq1 rocketmq-4.9.0]# kill -9 1427
 ​
 [root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
 RocketMQLog:WARN Please initialize the logger system properly.
 #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
 rocketmq-cluster  broker-a                1     192.168.31.206:11011   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.47 0.0079
 rocketmq-cluster  broker-b                0     192.168.31.206:10911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.47 -1.0000
 rocketmq-cluster  broker-b                1     192.168.31.205:11011   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452165.47 0.0079

broker-aslave节点并不能升级为master节点。

这种部署模式,提供了一定的高可用性。但这样的部署模式,有一定的缺陷。比如故障转移方面,如果主节点挂了,还需要人为手动进行重启或者切换,无法自动将一个从节点转换为主节点。

Dledger集群

在 RocketMQ 4.5 版本之前,RocketMQ 只有 Master/Slave 一种部署方式,一组 broker 中有一个 Master ,有零到多个 Slave,Slave 通过同步复制或异步复制的方式去同步 Master 数据。

RocketMQ-on-DLedger Group 是指一组 相同名称的Broker,至少需要 3 个节点,通过 Raft自动选举出一个Leader,其余节点作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用。

RocketMQ-on-DLedger Group 能自动容灾切换,并保证数据一致。 是可以水平扩展的,也即可以部署任意多个,同时对外提供服务。

1、配置文件

 [root@rocketmq1 dledger]# pwd
 /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/dledger
 [root@rocketmq1 dledger]# ll
 总用量 12
 -rwxr-xr-x. 1 root root 1155 6月  10 06:35 broker-n0.conf
 -rwxr-xr-x. 1 root root 1155 6月  10 06:35 broker-n1.conf
 -rwxr-xr-x. 1 root root 1155 6月  10 06:35 broker-n2.conf
 brokerClusterName = RaftCluster
 brokerName=RaftNode-mq2
 listenPort=30911
 namesrvAddr="192.168.31.205:9876;192.168.31.206:9876;192.168.31.207:9876"
 storePathRootDir=/home/rocketmq-all-4.9.0-source-release/data/mqstore/RaftNode-mq2
 storePathCommitLog=/home/rocketmq-all-4.9.0-source-release/data/mqstore/commitlog
 ​
 #是否启动DLedger
 enableDLegerCommitLog=true
 ​
 #DLedger Raft Group 的名字,建议和 brokerName 保持一致
 dLegerGroup=RaftNode-mq2
 ​
 #DLedger Group 内各节点的地址与端口信息(同一个 Group 内的各个节点配置必须要保证一致)
 dLegerPeers=n0-192.168.31.206:40911;n1-192.168.31.207:40912;n2-192.168.31.205:40913
 ​
 #节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一,例如:第一个节点配置为”n0”,第二个节点配置为”n1”,第三个节点配置为”n2”
 dLegerSelfId=n0
 ​
 #发送线程个数(建议配置成 CPU 核数)
 sendMessageThreadPoolNums=4

2、启动命令

 nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqnamesrv  &
 nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/dledger/broker-n0.conf &
 ​
 nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/dledger/broker-n1.conf &
 ​
 nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/dledger/broker-n2.conf &

3、高可用测试

启动完成后查询:

image-20210801161700776

 [root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
 RocketMQLog:WARN Please initialize the logger system properly.
 #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
 RaftCluster       RaftNode-mq1            0     192.168.31.206:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq1            1     192.168.31.205:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq1            3     192.168.31.207:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq2            0     192.168.31.207:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq2            1     192.168.31.206:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq2            3     192.168.31.205:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq3            0     192.168.31.205:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq3            1     192.168.31.207:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000
 RaftCluster       RaftNode-mq3            3     192.168.31.206:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.22 -1.0000

结束进程192.168.31.205:30921 master

image-20210801161833023

 [root@rocketmq1 rocketmq-4.9.0]# kill -9 3250
 ​
 #等10s左右再次查看
 ​
 [root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
 RocketMQLog:WARN Please initialize the logger system properly.
 #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
 RaftCluster       RaftNode-mq1            0     192.168.31.206:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq1            1     192.168.31.205:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq1            3     192.168.31.207:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq2            0     192.168.31.207:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq2            1     192.168.31.206:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq2            3     192.168.31.205:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq3            0     192.168.31.207:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000
 RaftCluster       RaftNode-mq3            3     192.168.31.206:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.29 -1.0000

重新启动原来的master,变成了slave(bid=2)

重新启动mq后

 [root@rocketmq1 rocketmq-4.9.0]# nohup sh /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqbroker -c /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/conf/dledger/broker-n1.conf &
 [4] 3551
 [root@rocketmq1 rocketmq-4.9.0]# nohup: 忽略输入并把输出追加到"nohup.out"
 ​
 #重新启动后,变成了slave
 ​
 [root@rocketmq1 rocketmq-4.9.0]# /home/rocketmq-all-4.9.0-source-release/distribution/target/rocketmq-4.9.0/rocketmq-4.9.0/bin/mqadmin clusterList -n 192.168.31.205:9876
 RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
 RocketMQLog:WARN Please initialize the logger system properly.
 #Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
 RaftCluster       RaftNode-mq1            0     192.168.31.206:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq1            1     192.168.31.205:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq1            3     192.168.31.207:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq2            0     192.168.31.207:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq2            1     192.168.31.206:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq2            3     192.168.31.205:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq3            0     192.168.31.207:30911   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq3            2     192.168.31.205:30921   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000
 RaftCluster       RaftNode-mq3            3     192.168.31.206:30931   V4_9_0                   0.00(0,0ms)         0.00(0,0ms)          0 452168.31 -1.0000

Dledger集群完成了容灾切换。