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修复、新功能、性能优化
简单对比:
\
| 消息队列 | RabbitMQ | Apache Kafka | Apache Pulsar | Apache 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 实例构成。
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会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
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之间修改brokerName、storePathRootDir相关路径等信息。
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-a的master(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-a 的slave节点并不能升级为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、高可用测试
启动完成后查询:
[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后
[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)
[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集群完成了容灾切换。