热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:原创《从0开始学RocketMQ》—集群搭建

本文由编程笔记#小编为大家整理,主要介绍了原创《从0开始学RocketMQ》—集群搭建相关的知识,希望对你有一定的参考价值。用两台服务器,搭建出一个双master双slave、
本文由编程笔记#小编为大家整理,主要介绍了原创《从0开始学RocketMQ》—集群搭建相关的知识,希望对你有一定的参考价值。


用两台服务器,搭建出一个双master双slave、无单点故障的高可用 RocketMQ 集群。此处假设两台服务器的物理 IP 分别为:192.168.50.1、192.168.50.2。


内容目录

1. 启动 NameServer 集群

2. 启动 Broker 集群

3. RocketMQ 可视化管理控制台:rocketmq-console

4. 集群测试


 


1. 启动 NameServer 集群

在两台服务器上分别启动 NameServer,可以得到一个无单点故障的 NameServer 服务,服务地址分别为:192.168.50.1:9876、192.168.50.2:9876。


 


2. 启动 Broker 集群

修改 Broker 配置文件,以使每台服务器上都可以启动一个 Master 角色 的 Broker 和 一个Slave 角色的 Broker。
首先找到 Broker 配置文件,此处我们搭建一个同步双写模式的集群,所以需要修改 2m-2s-sync 目录下的 broker 配置文件:


[[email protected]157-89 ~]# cd /usr/local/rocketmq-all-4.3.2-bin-release/conf/
[[email protected]
157-89 conf]# ls
2m
-2s-async 2m-2s-sync 2m-noslave broker.conf logback_broker.xml logback_namesrv.xml logback_tools.xml
[[email protected]
157-89 conf]# cd 2m-2s-sync/
[[email protected]
157-89 2m-2s-sync]# ls
broker
-a.properties broker-a-s.properties broker-b.properties broker-b-s.properties

1) 修改 192.168.50.1 服务器上的 broker-a.properties 为 Master 角色的 Broker:


namesrvAddr=192.168.50.1:9876;192.168.50.2:9876
brokerClusterName
=rocketMqCluster
brokerIP1
=192.168.50.1
brokerName
=broker-a
brokerId
=0
deleteWhen
=04
fileReservedTime
=120
mapedFileSizeConsumeQueue
=500000
brokerRole
=SYNC_MASTER
flushDiskType
=ASYNC_FLUSH
listenPort
=10911
autoCreateTopicEnable
=true
autoCreateSubscriptionGroup
=true
storePathRootDir
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a
storePathCommitLog
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a/commitlog
storePathConsumeQueue
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a/consumequeue
storePathIndex
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a/index
storeCheckpoint
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a/checkpoint
abortFile
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a/abort

2) 修改 192.168.50.2 服务器上的 broker-b.properties 为 Master 角色的 Broker:


namesrvAddr=192.168.50.1:9876;192.168.50.2:9876
brokerClusterName
=rocketMqCluster
brokerIP1
=192.168.50.2
brokerName
=broker-b
brokerId
=0
deleteWhen
=04
fileReservedTime
=120
mapedFileSizeConsumeQueue
=500000
brokerRole
=SYNC_MASTER
flushDiskType
=ASYNC_FLUSH
listenPort
=10911
autoCreateTopicEnable
=true
autoCreateSubscriptionGroup
=true
storePathRootDir
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b
storePathCommitLog
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b/commitlog
storePathConsumeQueue
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b/consumequeue
storePathIndex
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b/index
storeCheckpoint
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b/checkpoint
abortFile
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b/abort

3) 修改 192.168.50.1 服务器上的 broker-b-s.properties 为 Slave 角色的 Broker:


namesrvAddr=192.168.50.1:9876;192.168.50.2:9876
brokerClusterName
=rocketMqCluster
brokerIP1
=192.168.50.1
brokerName
=broker-b
brokerId
=1
deleteWhen
=04
fileReservedTime
=120
mapedFileSizeConsumeQueue
=500000
brokerRole
=SLAVE
flushDiskType
=ASYNC_FLUSH
listenPort
=10921
autoCreateTopicEnable
=true
autoCreateSubscriptionGroup
=true
storePathRootDir
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b-s
storePathCommitLog
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b-s/commitlog
storePathConsumeQueue
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b-s/consumequeue
storePathIndex
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b-s/index
storeCheckpoint
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b-s/checkpoint
abortFile
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-b-s/abort

4) 修改 192.168.50.2 服务器上的 broker-a-s.properties 为 Slave 角色的 Broker:


namesrvAddr=192.168.50.1:9876;192.168.50.2:9876
brokerClusterName
=rocketMqCluster
brokerIP1
=192.168.50.2
brokerName
=broker-a
brokerId
=1
deleteWhen
=04
fileReservedTime
=48
brokerRole
=SLAVE
flushDiskType
=ASYNC_FLUSH
listenPort
=10921
autoCreateTopicEnable
=true
autoCreateSubscriptionGroup
=true
storePathRootDir
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a-s
storePathCommitLog
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a-s/commitlog
storePathConsumeQueue
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a-s/consumequeue
storePathIndex
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a-s/index
storeCheckpoint
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a-s/checkpoint
abortFile
=/usr/local/rocketmq-all-4.3.2-bin-release/data/broker-a-s/abort

一台服务器上启动多个Broker 时,需指定不同的端口号,记得防火墙放开 NameServer 和 Broker 中用到的端口号哦~

分别启动四个 Broker:


nohup sh bin/mqbroker -c broker_config_file &


 


3. RocketMQ 可视化管理控制台:rocketmq-console

在服务器 192.168.50.1 上安装即可,无需集群


[[email protected]153-215 local]# git clone https://github.com/apache/rocketmq-externals.git
Cloning into rocketmq-externals...
remote: Enumerating objects:
10, done.
remote: Counting objects:
100% (10/10), done.
remote: Compressing objects:
100% (10/10), done.
remote: Total
9425 (delta 2), reused 1 (delta 0), pack-reused 9415
Receiving objects:
100% (9425/9425), 11.86 MiB | 232.00 KiB/s, done.
Resolving deltas:
100% (4235/4235), done.
[[email protected]
153-215 local]# cd rocketmq-externals/
[[email protected]
153-215 rocketmq-externals]# ls
dev README.md rocketmq
-console rocketmq-docker rocketmq-flink rocketmq-flume rocketmq-hbase rocketmq-iot-bridge rocketmq-jms rocketmq-mysql rocketmq-php rocketmq-redis rocketmq-sentinel rocketmq-serializer rocketmq-spark
[[email protected]
153-215 rocketmq-externals]# git branch
* master
[[email protected]
153-215 rocketmq-externals]# git fetch origin release-rocketmq-console-1.0.0
From https:
//github.com/apache/rocketmq-externals
* branch release-rocketmq-console-1.0.0 -> FETCH_HEAD
[[email protected]
153-215 rocketmq-externals]# git checkout -b release-1.0.0 origin/release-rocketmq-console-1.0.0
Branch
release-1.0.0 set up to track remote branch release-rocketmq-console-1.0.0 from origin.
Switched to a
new branch release-1.0.0
[[email protected]
153-215 rocketmq-externals]# ls
README.md rocketmq
-console
[[email protected]
153-215 rocketmq-externals]# ls rocketmq-console/
doc LICENSE NOTICE pom.xml README.md src style
[[email protected]
153-215 rocketmq-externals]# vim rocketmq-console/src/main/resources/application.properties

编辑 application.properties:


server.cOntextPath=/rocketmq
server.port
=8080
#spring.application.index
=true
spring.application.name
=rocketmq-console
spring.http.encoding.charset
=UTF-8
spring.http.encoding.enabled
=true
spring.http.encoding.force
=true
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
=192.168.50.1:9876;192.168.50.2:9876
#if you use rocketmq version <3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel
=
#rocketmq
-consoles data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#
set it false if you dont want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true

移动 rocketmq-console 所在目录,编译并启动 rocketmq-console:


[[email&#160;protected]153-215 rocketmq-console]# mv /usr/local/rocketmq-externals/rocketmq-console /usr/local/rocketmq-console
[[email&#160;protected]
153-215 rocketmq-console]# cd /usr/local/rocketmq-console/
[[email&#160;protected]
153-215 rocketmq-console]# ls
doc LICENSE NOTICE pom.xml README.md src style
[[email&#160;protected]
153-215 rocketmq-console]# mvn clean package -Dmaven.test.skip=true
........
[INFO] Building jar:
/usr/local/rocketmq-console/target/rocketmq-console-ng-1.0.0-sources.jar
[INFO]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO]
------------------------------------------------------------------------
[INFO] Total time:
02:54 min
[INFO] Finished at:
2019-01-11T17:02:34+08:00
[INFO]
------------------------------------------------------------------------
[[email&#160;protected]
153-215 rocketmq-console]# ls
doc LICENSE NOTICE pom.xml README.md src style target
[[email&#160;protected]
153-215 rocketmq-console]# ls target/
checkstyle
-cachefile checkstyle-checker.xml checkstyle-result.xml classes generated-sources maven-archiver maven-status rocketmq-console-ng-1.0.0.jar rocketmq-console-ng-1.0.0.jar.original rocketmq-console-ng-1.0.0-sources.jar
[[email&#160;protected]
153-215 rocketmq-console]# java -jar target/rocketmq-console-ng-1.0.0.jar
.......
[
2019-01-11 17:04:15.980] INFO Initializing ProtocolHandler ["http-nio-8080"]
[
2019-01-11 17:04:15.991] INFO Starting ProtocolHandler [http-nio-8080]
[
2019-01-11 17:04:16.232] INFO Using a shared selector for servlet write/read
[
2019-01-11 17:04:16.251] INFO Tomcat started on port(s): 8080 (http)
[
2019-01-11 17:04:16.257] INFO Started App in 6.594 seconds (JVM running for 7.239)


 


4. 集群测试

Producer 测试代码:


public class SyncProducerTest {
public static void main(String[] args) {
DefaultMQProducer producer
= new DefaultMQProducer("producer_test_group");
producer.setNamesrvAddr(
"39.107.153.215:9876;39.107.157.89:9876");
try{
producer.start();
for(int i=0;i<100;i++){
Message message
= new Message("topic_test", "tag_test", ("Hello World" + 1).getBytes("UTF-8"));
SendResult sendResult
= producer.send(message);
System.out.println(JSON.toJSON(sendResult));
}
producer.shutdown();
}
catch (Exception e){
e.printStackTrace();
}
}
}

Consumer 测试代码:


public class SyncConsumerTest {
public static void main(String[] args) {
DefaultMQPushConsumer consumer
= new DefaultMQPushConsumer("consumer_test_group");
consumer.setNamesrvAddr(
"39.107.153.215:9876;39.107.157.89:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
try {
consumer.subscribe(
"topic_test", "*");
consumer.registerMessageListener((MessageListenerConcurrently) (messageList, context)
-> {
System.out.println(Thread.currentThread().getName()
+ " Receive New Message:" + messageList);
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
});
consumer.start();
}
catch (Exception e){
e.printStackTrace();
}
}
}

SyncProducerTest 运行日志:

技术分享图片

SyncConsumerTest 运行日志:

技术分享图片

通过日志可以看到,消费者、生产者收发消息都是正常的,我们去可视化管理控制台查看下 http://192.168.50.1:8080/rocketmq:

技术分享图片

通过管控台可以看到,双 master 双 slave 的 broker 集群一切正常,并可进一步看到每个 broker 处理消息的情况。



推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
author-avatar
yoyokk99的秋天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有