Linux安装RocketMQ及简单使用

安装环境

linux:centos7.9 华为云
jdk:jdk8
RocketMQ:4.9.5

需要提前安装jdk8,并且配置环境变量JAVA_HOME,这个变量在RocketMQ的shell命令中会用到。

传送门:https://blog.csdn.net/u010355502/article/details/132210801

单机安装

官网:https://rocketmq.apache.org/

下载

下载地址:https://rocketmq.apache.org/download/

选择二进制文件的4.9.5版本,如下:
截屏2023-08-24 09.40.22.png

# 下载
wget https://archive.apache.org/dist/rocketmq/4.9.5/rocketmq-all-4.9.5-bin-release.zip

# 复制到安装目录
cp rocketmq-all-4.9.5-bin-release.zip /usr/local

# 解压
# benchmark为压测脚本,bin为执行脚本,conf为配置文件,lib为运行的jar包
unzip rocketmq-all-4.9.5-bin-release.zip

修改内存

RocketMQ默认配置的内存比较大,由于我的测试服务器内存较小,所以这里要改下对应的内存。生产环境不建议调整。
修改nameserver运行内存:

vim bin/runserver.sh

修改为如下配置:

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

截屏2023-08-24 09.52.17.png
由于我们jdk版本为8,满足-lt "9"这个条件,所以设置这里的jvm参数。
修改broker运行内存:

vim bin/runbroker.sh

修改为如下配置:

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m"

截屏2023-08-24 09.56.12.png
截屏2023-08-24 09.57.45.png
还得注意下上面的这个配置,源文件是-lt "8" ,即jdk8会使用G1垃圾收集器,但是我们的内存没有达到8G,所以不推荐使用G1,还是使用CMS。所以这里把判断条件改成-lt "9",即jdk8会使用CMS垃圾收集器,否者后面会报错。

启动nameServer

cd /usr/local/rocketmq-all-4.9.5-bin-release
nohup bin/mqnamesrv &

查看nohup.out日志检查是否已启动:

[root@hecs-403280 rocketmq-all-4.9.5-bin-release]# bin/mqnamesrv
Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
The Name Server boot success. serializeType=JSON

上面提示The Name Server boot success.,表示启动成功。
或者用jps命令检查是否启动成功:

[root@hecs-403280 ~]# jps
9698 Jps
7956 NamesrvStartup

停止nameserver命令:

bin/mqshutdown namesrv

启动broker

修改broker.conf文件:
发送消息时自动创建Topic,这里不设置的话后面执行测试代码时会报错。

# 开启自动创建topic
autoCreateTopicEnable = true

启动:

cd /usr/local/rocketmq-all-4.9.5-bin-release
nohup bin/mqbroker &

查看nohup.out日志检查是否已启动:

Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
The broker[hecs-403280, 192.168.0.83:10911] boot success. serializeType=JSON

或者通过jps命令查看:

[root@hecs-403280 ~]# jps
16681 BrokerStartup
13690 NamesrvStartup
6188 Jps

停止命令:

bin/mqshutdown broker

消息收发

命令行发送消息

  • 配置环境变量

配置NAMESRV_ADDR环境变量,指向之前启动的nameServer服务。

vim /etc/profile

最后一行添加:

export NAMESRV_ADDR='localhost:9876' 

使环境变量立即生效:

source /etc/profile
  • 启动生产者发送测试消息
bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

这个指令会默认往RocketMQ中发送1000条消息。在命令行窗口可以看到发送消息的日志:

...
SendResult [sendStatus=SEND_OK, msgId=7F000001451E08EFB846763EC6A703E5, offsetMsgId=C0A8005300002A9F000000000002EB52, messageQueue=MessageQueue [topic=TopicTest, brokerName=hecs-403280, queueId=0], queueOffset=249]
SendResult [sendStatus=SEND_OK, msgId=7F000001451E08EFB846763EC6A803E6, offsetMsgId=C0A8005300002A9F000000000002EC12, messageQueue=MessageQueue [topic=TopicTest, brokerName=hecs-403280, queueId=1], queueOffset=249]
SendResult [sendStatus=SEND_OK, msgId=7F000001451E08EFB846763EC6A803E7, offsetMsgId=C0A8005300002A9F000000000002ECD2, messageQueue=MessageQueue [topic=TopicTest, brokerName=hecs-403280, queueId=2], queueOffset=249]
23:03:45.585 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
23:03:45.587 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
23:03:45.587 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.0.83:10911] result: true

Linux安装RocketMQ及简单使用_第1张图片

  • 启动消费者接收测试消息
bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

消费者启动完成后,可以看到消费到的消息:

...
ConsumeMessageThread_please_rename_unique_group_name_4_17 Receive New Messages: [MessageExt [brokerName=hecs-403280, queueId=3, storeSize=192, queueOffset=223, sysFlag=0, bornTimestamp=1692803025454, bornHost=/192.168.0.83:41446, storeTimestamp=1692803025455, storeHost=/192.168.0.83:10911, msgId=C0A8005300002A9F0000000000029C92, commitLogOffset=171154, bodyCRC=806948004, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1692803090217, UNIQ_KEY=7F000001451E08EFB846763EC62E037C, CLUSTER=DefaultCluster, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 56, 57, 50], transactionId='null'}]] 
ConsumeMessageThread_please_rename_unique_group_name_4_15 Receive New Messages: [MessageExt [brokerName=hecs-403280, queueId=3, storeSize=192, queueOffset=222, sysFlag=0, bornTimestamp=1692803025439, bornHost=/192.168.0.83:41446, storeTimestamp=1692803025440, storeHost=/192.168.0.83:10911, msgId=C0A8005300002A9F0000000000029992, commitLogOffset=170386, bodyCRC=1238881531, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1692803090217, UNIQ_KEY=7F000001451E08EFB846763EC61F0378, CLUSTER=DefaultCluster, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 56, 56, 56], transactionId='null'}]] 

Linux安装RocketMQ及简单使用_第2张图片
Ctrl + C停止消费者进程。

Java代码发送消息

  • 添加依赖

创建一个标准的maven项目,在pom.xml中引入以下核心依赖:

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.9.5</version>
</dependency>
  • 创建生产者
public class Producer {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        // 初始化一个消息生产者
        DefaultMQProducer producer = new DefaultMQProducer("producerGroup1");
        // 指定nameserver地址,如果需要通过外网(云服务器)访问的话,这里就配置外网ip
        producer.setNamesrvAddr("ip:9876");
        // 启动消息生产者服务
        producer.start();
        for (int i = 0; i < 2; i++) {
            try {
                // 创建消息。消息由Topic,Tag和body三个属性组成,其中Body就是消息内容
                Message msg = new Message("TopicTest","TagA",("Hello RocketMQ " +i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                // 发送消息,获取发送结果
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            } catch (Exception e) {
                e.printStackTrace();
                Thread.sleep(1000);
            }
        }
        // 消息发送完后,停止消息生产者服务。
        producer.shutdown();
    }
}
  • 创建消费者
public class Consumer {
    public static void main(String[] args) throws InterruptedException, MQClientException {
        // 构建一个消息消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumerGroup1");
        // 指定nameserver地址
       consumer.setNamesrvAddr("ip:9876");
       consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
        // 订阅一个感兴趣的话题,这个话题需要与消息的topic一致
        consumer.subscribe("TopicTest", "*");
        // 注册一个消息回调函数,消费到消息后就会触发回调。
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,ConsumeConcurrentlyContext context) {
    msgs.forEach(messageExt -> {
                    try {
                        System.out.println("收到消息:"+new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET));
                    } catch (UnsupportedEncodingException e) {}
                });
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        // 启动消费者服务
        consumer.start();
        System.out.print("Consumer Started");
    }
}
  • 问题解决

使用Java程序发送消息时报错。
关键报错信息如下:

sendDefaultImpl call timeout

提示发送消息超时。
发送消息时可以携带超时时间,默认3秒,这里将其设置成10秒:

SendResult sendResult = producer.send(msg, 10000); // 超时时间为10秒

仍然报错如下:

onnection to ip : 10911 failed

10911是broker的默认对外端口,这里提示连接broker服务失败。
修改broker配置文件:

vim conf/broker.conf

在最底下加一行:

brokerIP1=broker服务器外网IP地址

指定配置文件重启broker:

nohup bin/mqbroker -n localhost:9876 -c conf/broker.conf &

外网需要放开两个端口,nameServer的9876和remotingServer的10911。
再次使用java程序发送消息成功。

DashBoard仪表盘

DashDoard是RocketMQ官方提供的管理界面。

  • 下载

下载:https://rocketmq.apache.org/download/#rocketmq-dashboard

拉到页面最底部:
Linux安装RocketMQ及简单使用_第3张图片

  • 安装

解压,进入解压目录,通过maven打包成jar包:
也可以在IDEA中打开,然后用maven的package命令打包。

mvn clean package -Dmaven.test.skip=true 

也可以下载我已经打包好的jar包:

链接: https://pan.baidu.com/s/1hzX34vceGlU-btR8YA7b9Q?pwd=rri9 提取码: rri9

将下载下来的jar包上传到服务器/usr/local目录下。

  • 配置文件

DashBoard项目中有默认的application.properties配置文件,我们也可以在jar同级目录下新建一个application.properties文件,用于自定义参数。jar启动时当前目录下的application.properties优先级最高。不要使用yml文件,否则启动会报错。
配置如下:

rocketmq.config.namesrvAddrs=192.168.0.83:9876
rocketmq.config.dataPath=/usr/local/rocketmq-dashboard/data
server.port=8080

还有其他的选项可以配置,比如登录用户等。下面是项目中的原始application.properties配置文件:

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

server.address=0.0.0.0
server.port=8080

### SSL setting
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey

#spring.application.index=true
spring.application.name=rocketmq-dashboard
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.level.root=INFO
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#timeout for mqadminExt, default 5000ms
rocketmq.config.timeoutMillis=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket

#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=false

#set the accessKey and secretKey if you used acl
#rocketmq.config.accessKey=
#rocketmq.config.secretKey=
rocketmq.config.useTLS=false

  • 启动jar
nohup java -jar rocketmq-dashboard-1.0.0.jar &

同级nohup.out日志文件可以查看启动日志。

  • 浏览器访问

http://xxx:8080

如果是云服务器,需要去安全组开放对应的端口。成功后,如下图所示:
Linux安装RocketMQ及简单使用_第4张图片

主从架构集群

生产环境一般需要部署集群,防止单点故障,主备也能降低某一个磁盘损坏导致数据丢失的风险。
RocketMQ的分布式集群基于主从架构搭建。在多个服务器组成的集群中,指定一部分节点作为Master节点,负责响应客户端的请求。指令另一部分节点作为Slave节点,负责备份Master节点上的数据,这样,当Master节点出现故障时,在Slave节点上可以保留有数据备份,至少保证数据不会丢失。

架构图如下:
Linux安装RocketMQ及简单使用_第5张图片

环境准备

准备三台服务器,虚拟机也可以,只要注意服务器之间能互通即可。
配置host映射:

vim /etc/hosts

追加内容如下:

192.168.0.83 worker1
192.168.0.184 worker2
192.168.0.48 worker3

这里搭建的是broker两主两从,具体的服务与机器对应关系如下:

机器名 nameServer服务 broker服务
worker1 nameServer
worker2 nameServer broker-a,broker-b-s
worker3 nameServer broker-b,broker-a-s

部署nameServer

三台服务器都部署nameServer服务,参考上面的教程。

broker集群配置

RocketMQ提供了一些常见的集群方案。
在conf目录下,对应几种配置方案如下:

2m-noslave: 2主无从的集群参考配置。这种集群存在单点故障。
2m-2s-async和2m-2s-sync:2主2从的集群参考配置。其中async和sync表示主节点与从节点之间是同步同步还是异步同步。
dledger: 具备主从切换功能的高可用集群。集群中的节点会基于Raft协议随机选举出一个Leader,其作用类似于Master节点。其他的节点都是Follower,其作用类似于Slave节点。

我们这里选择2m-2s-async这种方案。

  • 配置第一组broker-a服务

worker2机器,配置broker-a的主节点:

vim conf/2m-2s-async/broker-a.properties

配置参数如下:

# 所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
# broker名字,名字一样的节点就是一组主从节点
brokerName=broker-a
# brokerid,0就表示是Master,>0的都是表示Slave
brokerId=0
# nameServer地址,分号分割
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
deleteWhen=04
fileReservedTime=120
# 存储路径
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/store
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/store/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/store/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/store/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/store/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/store/abort
# Broker的角色
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# Broker对外服务的监听端口
listenPort=10911

这里对几个需要重点关注的属性,做下简单介绍:

brokerClusterName:集群名。RocketMQ会将同一个局域网下所有brokerClusterName相同的服务自动组成一个集群,这个集群可以作为一个整体对外提供服务。
brokerName:Broker服务名。同一个RocketMQ集群当中,brokerName相同的多个服务会有一套相同的数据副本。同一个RocketMQ集群中,是可以将消息分散存储到多个不同的brokerName服务上的。
brokerId:RocketMQ中对每个服务的唯一标识。RocketMQ对brokerId定义了一套简单的规则,master节点需要固定配置为0,负责响应客户端的请求。slave节点配置成其他任意数字,负责备份master上的消息。
brokerRole:服务的角色。这个属性有三个可选项:ASYNC_MASTER,SYNC_MASTER和SLAVE。其中,ASYNC_MASTER和SYNC_MASTER表示当前节点是master节点,目前暂时不用关心他们的区别。SLAVE则表示从节点。
namesrvAddr:nameserver服务的地址。nameserver服务默认占用9876端口。多个nameserver地址用英文分号“;”隔开。
store开头的一系列配置:表示RocketMQ的存盘文件地址。在同一个机器上需要部署多个Broker服务时,不同服务的存储目录不能相同。
listenPort:表示Broker对外提供服务的端口。这个端口默认是10911。在同一个机器上部署多个Broker服务时,不同服务占用的端口也不能相同。如果你使用的是多网卡的服务器,比如阿里云上的云服务器,那么就需要在配置文件中增加配置一个brokerIP1属性,指向所在机器的外网网卡地址。

worker3机器,配置broker-a的从节点:

vim conf/2m-2s-async/broker-a-s.properties

配置参数如下:

# 所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
# broker名字,名字一样的节点就是一组主从节点
brokerName=broker-a
# brokerid,0就表示是Master,>0的都是表示Slave
brokerId=1
# nameServer地址,分号分割
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
deleteWhen=04
fileReservedTime=120
# 存储路径
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/abort
# Broker的角色
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
# Broker对外服务的监听端口
listenPort=11011
  • 配置第二组broker-b服务

worker3机器,配置broker-b主节点:

vim conf/2m-2s-async/broker-b.properties

配置参数如下:

# 所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
# broker名字,名字一样的节点就是一组主从节点
brokerName=broker-b
# brokerid,0就表示是Master,>0的都是表示Slave
brokerId=0
# nameServer地址,分号分割
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
deleteWhen=04
fileReservedTime=120
# 存储路径
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/store
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/store/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/store/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/store/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/store/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/store/abort
# Broker的角色
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
# Broker对外服务的监听端口
listenPort=10911

worker2机器,配置broker-b从节点:

vim conf/2m-2s-async/broker-b-s.properties

配置参数如下:

# 所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
# broker名字,名字一样的节点就是一组主从节点
brokerName=broker-b
# brokerid,0就表示是Master,>0的都是表示Slave
brokerId=1
# nameServer地址,分号分割
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
deleteWhen=04
fileReservedTime=120
# 存储路径
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/storeSlave/abort
# Broker的角色
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
# Broker对外服务的监听端口
listenPort=11011

启动broker服务

注意,启动时需要增加-c参数,指向我们修改的配置文件。

worker2机器上启动broker-a和broker-b-s服务:

# 启动broker-a
nohup bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
# 启动broker-b-s
nohup bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &

jps查看是否启动成功:

[root@ecs-002 rocketmq-all-4.9.5-bin-release]# jps
11841 Jps
10626 NamesrvStartup
11722 BrokerStartup
11182 BrokerStartup

worker3上启动broker-b和broker-a-s服务:

# 启动broker-b
nohup bin/mqbroker -c conf/2m-2s-async/broker-b.properties &
# 启动broker-a-s
nohup bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &

jps查看是否启动成功:

[root@ecs-003 rocketmq-all-4.9.5-bin-release]# jps
10147 Jps
9435 BrokerStartup
10062 BrokerStartup
8350 NamesrvStartup

通过RocketMQ提供的bin/mqadmin命令检查服务集群状态:
执行这个指令需要在机器上配置了NAMESRV环境变量,单机版本时在woker1中已经配置了,所以这里在woker1机器上执行该命令。

[root@hecs-403280 rocketmq-all-4.9.5-bin-release]# bin/mqadmin clusterList
#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
rocketmq-cluster  broker-a                0     192.168.0.184:10911    V4_9_5                   0.00(0,0ms)         0.00(0,0ms)          0 470241.43 0.0900
rocketmq-cluster  broker-a                1     192.168.0.48:11011     V4_9_5                   0.00(0,0ms)         0.00(0,0ms)          0 470241.43 0.0900
rocketmq-cluster  broker-b                0     192.168.0.48:10911     V4_9_5                   0.00(0,0ms)         0.00(0,0ms)          0 470241.43 0.0900
rocketmq-cluster  broker-b                1     192.168.0.184:11011    V4_9_5                   0.00(0,0ms)         0.00(0,0ms)          0 470241.43 0.0900
DefaultCluster    hecs-403280             0     192.168.0.83:10911     V4_9_5                   0.00(0,0ms)         0.00(0,0ms)          0 470241.43 0.2000

image.png
如上信息,表示集群启动成功。

DashBoard关联集群

配置文件添加nameServer:

vim application.properties

将集群nameServer服务加在namesrvAddrs后面,英文逗号分隔:

rocketmq.config.namesrvAddrs=worker1:9876,worker2:9876:worker3:9876

再次访问:

http://xxx:8080

Linux安装RocketMQ及简单使用_第6张图片
可以看到新建的rocketmq-cluster集群已经能够正常显示了。

dledger集群

RocketMQ提供的Dledger集群,具备主从角色自动转换功能的高可用集群。
架构图:
Linux安装RocketMQ及简单使用_第7张图片

部署nameServer

三台服务器都部署nameServer服务,参考上面的教程。

broker集群配置

官方依然在conf/dledger目录下给了完整示例。

  • worker1创建broker.conf文件
vim conf/dledger/broker.conf

写入如下配置:

brokerClusterName=RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/abort
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-worker1:40911;n1-worker2:40911;n2-worker3:40911
## must be unique
dLegerSelfId=n0
sendMessageThreadPoolNums=16

主要参数说明:

enableDLegerCommitLog:是否启动Dledger。true表示启动。
namesrvAddr:指定nameserver地址。
dLedgerGroup:Dledger Raft Group的名字,建议跟brokerName保持一致。
dLedgerPeers:Dledger Group内各个服务节点的地址及端口信息。同一个Group内的各个节点配置必须要保持一致。
dLedgerSelfId:Dledger节点ID,必须属于dLedgerPeers中的一个。同一个Group内的各个节点必须不能重复。
sendMessageThreadPoolNums:dLedger内部发送消息的线程数,建议配置成cpu核心数。
store开头的一系列配置:这些是配置dLedger集群的消息存盘目录。如果你是从主从架构升级成为dLedger架构,那么这个地址可以指向之前搭建住主从架构的地址。dLedger集群会兼容主从架构集群的消息格式,只不过主从架构的消息无法享受dLedger集群的两阶段同步功能。

  • worker2创建broker.conf文件
vim conf/dledger/broker.conf

写入如下配置:

brokerClusterName=RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/abort
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-worker1:40911;n1-worker2:40911;n2-worker3:40911
## must be unique
dLegerSelfId=n1
sendMessageThreadPoolNums=16
  • worker3创建broker.conf文件
vim conf/dledger/broker.conf

写入如下配置:

brokerClusterName=RaftCluster
brokerName=RaftNode00
listenPort=30911
namesrvAddr=worker1:9876;worker2:9876;worker3:9876
storePathRootDir=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/
storePathCommitLog=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/commitlog
storePathConsumeQueue=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/consumequeue
storePathIndex=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/index
storeCheckpoint=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/checkpoint
abortFile=/usr/local/rocketmq-all-4.9.5-bin-release/storeDledger/abort
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-worker1:40911;n1-worker2:40911;n2-worker3:40911
## must be unique
dLegerSelfId=n2
sendMessageThreadPoolNums=16

启动broker服务

三台机器启动broker服务:

nohup bin/mqbroker -c conf/dledger/broker.conf &

检查集群服务状态:
Linux安装RocketMQ及简单使用_第8张图片
启动成功。
Dledger集群模式下,会自动选举产生master和slave。

关闭worker2上的broker后,集群自动选举:
Linux安装RocketMQ及简单使用_第9张图片
再次启动worker2的broker,会再次加入到集群,角色为slave。

你可能感兴趣的:(#,环境搭建,RocketMQ,单机,集群,dledger)