date: 2020-06-07title: RocketMQ学习(3)——群集部署及web管理页面 #标题
tags: RocketMQ #标签
categories: MQ # 分类
新入职的公司,在项目中用到了rocketmq,自己之前没有接触过,所以花时间把它学习一下。以便日后遇到问题可以有思路去解决。
参考文档:
和大多数消息中间件类似,都包含了producer、consumer、broker等角色,还有一个角色是namesrv,关于其各个组件的功能,在之前的文章中有写到,这里就不在赘述了。
来总结下,整个Rocket MQ消息集群就是由NameSrv/Broker、Producer/Consumer组成的,为了更清晰的理解他们之间的关系,我们以一条完整的信息流转为例,来看看rocketmq消息系统是如何运转的,如下所示:

下面是一个公司生产环境中的实际架构:

在上面的架构中,部署了3个namesrv节点,broker采用2主2从的异步复制模式进行集群部署。
废话不多说,开搞。
环境准备
| OS | 主机名 | IP | roles |
|---|---|---|---|
| Centos 7.5 | rocketmq01 | 192.168.20.2 | namesrv/master-broker-a |
| Centos 7.5 | rocketmq02 | 192.168.20.3 | namesrv/slave-broker-a |
| Centos 7.5 | rocketmq03 | 192.168.20.4 | namesrv/master-broker-b |
| Centos 7.5 | rocketmq04 | 192.168.20.5 | slave-broker-b |
注:文中用到的所有软件包,均可在我的网盘链接中找到(提取码: ye9e)。
另外需要注意,只要没有特别说明,以下操作是需要在所有节点上执行的,So….,建议有需要的话自己开发一个脚本吧。
安装jdk
jdk版本须在1.8以上,(下载地址)自行选择相应的版本。我这里选择自己之前下载的jdk,可能版本和链接中的有些不一样。
[root@rocketmq01 ~]# rpm -qa | grep jdk | xargs rpm -e --nodeps # 卸载系统自带jdk[root@rocketmq01 ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/[root@rocketmq01 ~]# tail -n4 /etc/profile # 该文件末尾写入以下内容export JAVA_HOME=/usr/local/jdk1.8.0_211export JRE_HOME=/usr/local/jdk1.8.0_211/jreexport CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarexport PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH[root@rocketmq01 ~]# source /etc/profile # 重新加载该文件[root@rocketmq01 ~]# java -version # 检测java版本java version "1.8.0_211"Java(TM) SE Runtime Environment (build 1.8.0_211-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
安装maven
# 下载并配置环境变量[root@rocketmq01 ~]# wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz[root@rocketmq01 ~]# tar zxf apache-maven-3.6.3-bin.tar.gz[root@rocketmq01 ~]# mv apache-maven-3.6.3 /usr/local/maven[root@rocketmq01 ~]# tail -n2 /etc/profile # 在文件中写入以下内容export MAVEN_HOME=/usr/local/mavenexport PATH=$PATH:$MAVEN_HOME/bin[root@rocketmq01 ~]# source /etc/profile # 重新加载文件[root@rocketmq01 ~]# mvn -v # 可以查看到版本信息即可Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)Maven home: /usr/local/mavenJava version: 1.8.0_211, vendor: Oracle Corporation, runtime: /usr/local/jdk1.8.0_211/jreDefault locale: zh_CN, platform encoding: UTF-8OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"
由于maven默认的仓库在国外,所以我们还要更改其仓库地址,如下:
[root@rocketmq01 ~]# vim /usr/local/maven/conf/settings.xml # 修改此文件....................#省略部分内容<url>http://my.repository.com/repo/path</url></mirror>--> #定位到该行(158行),写入以下内容<mirror><id>aliyun</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>https://maven.aliyun.com/nexus/content/groups/public/</url></mirror></mirrors> # 写在该行上面
至此,准备工作就完成了。
安装rocketmq
[root@rocketmq01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.7.0/rocketmq-all-4.7.0-source-release.zip[root@rocketmq01 ~]# unzip rocketmq-all-4.7.0-source-release.zip[root@rocketmq01 ~]# mv rocketmq-all-4.7.0-source-release /usr/local/rocketmq-4.7.0[root@rocketmq01 ~]# cd /usr/local/rocketmq-4.7.0/# 编译[root@rocketmq01 rocketmq-4.7.0]# mvn -Prelease-all -DskipTests clean install -U# 创建所需目录[root@rocketmq01 rocketmq-4.7.0]# mkdir -p /usr/local/rocketmq-4.7.0/data/store{commitlog,consumequeue,index,checkpoint,abort}
修改配置文件
在修改配置文件之前,我这里先解释下配置文件中的含义,以便根据生产中实际情况来修改
[root@rocketmq01 conf]# pwd # 确定当前目录/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf[root@rocketmq01 conf]# tree -L 1.├── 2m-2s-async # 多Master多Slave模式,异步复制模式├── 2m-2s-sync # 多Master多Slave模式,同步双写├── 2m-noslave # 多Master模式├── broker.conf├── dledger├── logback_broker.xml├── logback_namesrv.xml├── logback_tools.xml├── plain_acl.yml└── tools.yml
在rocketmq中部署群集,根据brokerid来判断主从关系,brokerId=0表示master,非0表示slave。
主配置文件解释如下:
# 所属集群名字brokerClusterName=Rocketmq-Cluster# broker名字,注意此处不同的配置文件填写的不一样brokerName=broker-a# 0表示Master >0表示SlavebrokerId=0# 删除文件时间点,默认凌晨 4点deleteWhen=04#文件保留时间,默认 48 小时fileReservedTime=48brokerRole=ASYNC_MASTER# 刷盘方式# - ASYNC_FLUSH 异步刷盘# - SYNC_FLUSH 同步刷盘flushDiskType=ASYNC_FLUSH# nameServer地址,分号分割namesrvAddr=192.168.20.2:9876;192.168.20.3:9876;192.168.20.4:9876# Broker 对外服务的监听端口listenPort=10911# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数defaultTopicQueueNums=4# 是否允许 Broker 自动创建TopicautoCreateTopicEnable=true# 是否允许 Broker 自动创建订阅组autoCreateSubscriptionGroup=true# commitLog每个文件的大小默认1GmapedFileSizeCommitLog=1073741824# ConsumeQueue每个文件默认存30W条,根据业务情况调整mapedFileSizeConsumeQueue=50000000destroyMapedFileIntervalForcibly=120000redeleteHangedFileInterval=120000# 检测物理文件磁盘空间diskMaxUsedSpaceRatio=88# 存储路径storePathRootDir=/usr/local/rocketmq-4.7.0/data/store# commitLog 存储路径storePathCommitLog=/usr/local/rocketmq-4.7.0/data/store/commitlog# 消费队列存储路径存储路径storePathConsumeQueue=/usr/local/rocketmq-4.7.0/data/store/consumequeue# 消息索引存储路径storePathIndex=/usr/local/rocketmq-4.7.0/data/store/index# checkpoint 文件存储路径storeCheckpoint=/usr/local/rocketmq-4.7.0/data/store/checkpoint# abort 文件存储路径abortFile=/usr/local/rocketmq-4.7.0/data/store/abort# 限制的消息大小maxMessageSize=65536flushCommitLogLeastPages=4flushConsumeQueueLeastPages=2flushCommitLogThoroughInterval=10000flushConsumeQueueThoroughInterval=60000checkTransactionMessageEnable=false# 发消息线程池数量sendMessageThreadPoolNums=128# 拉消息线程池数量pullMessageThreadPoolNums=128
接下来就去修改每个主机的配置文件,注意:每台主机要修改的配置文件都是不一样的。
rocketmq01主机配置文件
[root@rocketmq01 2m-2s-async]# pwd # 确定当前目录/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async[root@rocketmq01 2m-2s-async]# egrep -v '^$|^#' broker-a.propertiesbrokerClusterName=Rocketmq-ClusterbrokerName=broker-abrokerId=0deleteWhen=04fileReservedTime=48brokerRole=ASYNC_MASTERflushDiskType=ASYNC_FLUSHnamesrvAddr=192.168.20.2:9876;192.168.20.3:9876;192.168.20.4:9876listenPort=10911defaultTopicQueueNums=4autoCreateTopicEnable=falseautoCreateSubscriptionGroup=falsemapedFileSizeCommitLog=1073741824mapedFileSizeConsumeQueue=50000000destroyMapedFileIntervalForcibly=120000redeleteHangedFileInterval=120000diskMaxUsedSpaceRatio=88storePathRootDir=/usr/local/rocketmq-4.7.0/data/storestorePathCommitLog=/usr/local/rocketmq-4.7.0/data/store/commitlogstorePathConsumeQueue=/usr/local/rocketmq-4.7.0/data/store/consumequeuestorePathIndex=/usr/local/rocketmq-4.7.0/data/store/indexstoreCheckpoint=/usr/local/rocketmq-4.7.0/data/store/checkpointabortFile=/usr/local/rocketmq-4.7.0/data/store/abortmaxMessageSize=65536flushCommitLogLeastPages=4flushConsumeQueueLeastPages=2flushCommitLogThoroughInterval=10000flushConsumeQueueThoroughInterval=60000checkTransactionMessageEnable=falsesendMessageThreadPoolNums=128pullMessageThreadPoolNums=128
rocketmq02主机配置文件
[root@rocketmq02 2m-2s-async]# pwd/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async[root@rocketmq02 2m-2s-async]# egrep -v '^$|^#' broker-a-s.propertiesbrokerClusterName=Rocketmq-ClusterbrokerName=broker-abrokerId=1deleteWhen=04fileReservedTime=48brokerRole=SLAVEflushDiskType=ASYNC_FLUSHnamesrvAddr=192.168.20.2:9876;192.168.20.3:9876;192.168.20.4:9876listenPort=10911defaultTopicQueueNums=4autoCreateTopicEnable=falseautoCreateSubscriptionGroup=falsemapedFileSizeCommitLog=1073741824mapedFileSizeConsumeQueue=50000000destroyMapedFileIntervalForcibly=120000redeleteHangedFileInterval=120000diskMaxUsedSpaceRatio=88storePathRootDir=/usr/local/rocketmq-4.7.0/data/storestorePathCommitLog=/usr/local/rocketmq-4.7.0/data/store/commitlogstorePathConsumeQueue=/usr/local/rocketmq-4.7.0/data/store/consumequeuestorePathIndex=/usr/local/rocketmq-4.7.0/data/store/indexstoreCheckpoint=/usr/local/rocketmq-4.7.0/data/store/checkpointabortFile=/usr/local/rocketmq-4.7.0/data/store/abortmaxMessageSize=65536flushCommitLogLeastPages=4flushConsumeQueueLeastPages=2flushCommitLogThoroughInterval=10000flushConsumeQueueThoroughInterval=60000checkTransactionMessageEnable=falsesendMessageThreadPoolNums=128pullMessageThreadPoolNums=128
rocketmq03主机配置文件
[root@rocketmq03 2m-2s-async]# pwd/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async[root@rocketmq03 2m-2s-async]# egrep -v '^$|^#' broker-b.propertiesbrokerClusterName=Rocketmq-ClusterbrokerName=broker-bbrokerId=0deleteWhen=04fileReservedTime=48brokerRole=ASYNC_MASTERflushDiskType=ASYNC_FLUSHnamesrvAddr=192.168.20.2:9876;192.168.20.3:9876;192.168.20.4:9876listenPort=10911defaultTopicQueueNums=4autoCreateTopicEnable=falseautoCreateSubscriptionGroup=falsemapedFileSizeCommitLog=1073741824mapedFileSizeConsumeQueue=50000000destroyMapedFileIntervalForcibly=120000redeleteHangedFileInterval=120000diskMaxUsedSpaceRatio=88storePathRootDir=/usr/local/rocketmq-4.7.0/data/storestorePathCommitLog=/usr/local/rocketmq-4.7.0/data/store/commitlogstorePathConsumeQueue=/usr/local/rocketmq-4.7.0/data/store/consumequeuestorePathIndex=/usr/local/rocketmq-4.7.0/data/store/indexstoreCheckpoint=/usr/local/rocketmq-4.7.0/data/store/checkpointabortFile=/usr/local/rocketmq-4.7.0/data/store/abortmaxMessageSize=65536flushCommitLogLeastPages=4flushConsumeQueueLeastPages=2flushCommitLogThoroughInterval=10000flushConsumeQueueThoroughInterval=60000checkTransactionMessageEnable=falsesendMessageThreadPoolNums=128pullMessageThreadPoolNums=128
rocketmq04主机配置文件
[root@rocketmq04 2m-2s-async]# pwd/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async[root@rocketmq04 2m-2s-async]# egrep -v '^$|^#' broker-b-s.propertiesbrokerClusterName=Rocketmq-ClusterbrokerName=broker-bbrokerId=1deleteWhen=04fileReservedTime=48brokerRole=SLAVEflushDiskType=ASYNC_FLUSHnamesrvAddr=192.168.20.2:9876;192.168.20.3:9876;192.168.20.4:9876listenPort=10911defaultTopicQueueNums=4autoCreateTopicEnable=falseautoCreateSubscriptionGroup=falsemapedFileSizeCommitLog=1073741824mapedFileSizeConsumeQueue=50000000destroyMapedFileIntervalForcibly=120000redeleteHangedFileInterval=120000diskMaxUsedSpaceRatio=88storePathRootDir=/usr/local/rocketmq-4.7.0/data/storestorePathCommitLog=/usr/local/rocketmq-4.7.0/data/store/commitlogstorePathConsumeQueue=/usr/local/rocketmq-4.7.0/data/store/consumequeuestorePathIndex=/usr/local/rocketmq-4.7.0/data/store/indexstoreCheckpoint=/usr/local/rocketmq-4.7.0/data/store/checkpointabortFile=/usr/local/rocketmq-4.7.0/data/store/abortmaxMessageSize=65536flushCommitLogLeastPages=4flushConsumeQueueLeastPages=2flushCommitLogThoroughInterval=10000flushConsumeQueueThoroughInterval=60000checkTransactionMessageEnable=falsesendMessageThreadPoolNums=128pullMessageThreadPoolNums=128
修改java虚拟机默认参数
这个步骤根据实际情况,选择性的配置即可,如果你的机器内存较小,建议修改,否则会因内存分配失败而无法启动broker。
修改runser.sh文件
[root@rocketmq01 rocketmq-4.7.0]# pwd/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0[root@rocketmq01 rocketmq-4.7.0]# vim bin/runserver.sh # 修改此文件如下配置JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"# Xms:jvm虚拟机最小可用内存大小# Xmx:jvm虚拟机最大可用内存大小# Xmn:年轻代内存大小
修改runbroker.sh文件
[root@rocketmq01 rocketmq-4.7.0]# pwd/usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0[root@rocketmq01 rocketmq-4.7.0]# vim bin/runbroker.sh # 修改此文件内容如下JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn256m"
启动namesrv
[root@rocketmq01 rocketmq-4.7.0]# nohup sh bin/mqnamesrv &[root@rocketmq03 rocketmq-4.7.0]# ss -lnpt | grep 9876 # 确定端口在监听LISTEN 0 128 :::9876 :::* users:(("java",pid=58985,fd=68))# 如果端口没有正常监听,请从日志或当前目录下的nohup.out文件中找问题[root@rocketmq01 rocketmq-4.7.0]# cat ~/logs/rocketmqlogs/namesrv.log # 日志文件
启动broker集群
注意:每台主机启动时指定的配置文件都是不一样的。
# 启动master broker-a服务(主机rocketmq01)[root@rocketmq01 rocketmq-4.7.0]# nohup sh bin/mqbroker -c /usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async/broker-a.properties &>~/logs/rocketmqlogs/br.log &# 启动slave broker-a-s服务(主机rocketmq02)[root@rocketmq02 rocketmq-4.7.0]# nohup sh bin/mqbroker -c /usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async/broker-a-s.properties &>~/logs/rocketmqlogs/br.log &# 启动master broker-b服务(主机rocketmq03)[root@rocketmq03 rocketmq-4.7.0]# nohup sh bin/mqbroker -c /usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async/broker-b.properties &>~/logs/rocketmqlogs/br.log &#启动Slave broker-b-s服务(主机rocketmq04)[root@rocketmq04 rocketmq-4.7.0]# nohup sh bin/mqbroker -c /usr/local/rocketmq-4.7.0/distribution/target/rocketmq-4.7.0/rocketmq-4.7.0/conf/2m-2s-async/broker-b-s.properties &>~/br.log &
查看群集消息,确定无误
[root@rocketmq01 rocketmq-4.7.0]# sh bin/mqadmin clusterList -n 192.168.20.2:9876 # 指定任意一个namesrv节点都可查看到参与集群的节点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 #SPACERocketmq-Cluster broker-a 0 192.168.20.2:10911 V4_7_0 0.00(0,0ms) 0.00(0,0ms) 0 440721.12 -1.0000Rocketmq-Cluster broker-a 1 192.168.20.3:10911 V4_7_0 0.00(0,0ms) 0.00(0,0ms) 0 440721.12 0.0940Rocketmq-Cluster broker-b 0 192.168.20.4:10911 V4_7_0 0.00(0,0ms) 0.00(0,0ms) 0 440721.12 -1.0000Rocketmq-Cluster broker-b 1 192.168.20.5:10911 V4_7_0 0.00(0,0ms) 0.00(0,0ms) 0 440721.12 0.0940
部署rocketmq的web管理界面
这个web界面的部署在任意一台有java和maven环境的主机上部署即可。
在我以这种方式部署完管理界面后,又发现了一个相比较要省事的github项目,有兴趣可以去看一下:github地址:rocketmq-console。
[root@rocketmq01 src]# git clone -b release-rocketmq-console-1.0.0 https://github.com/apache/rocketmq-externals.git[root@rocketmq01 src]# cd rocketmq-externals/rocketmq-console/src/main/resources/[root@rocketmq01 resources]# egrep -v '^$|^#' application.properties # 修改配置文件server.contextPath=server.port=8080 # 自定义监听端口spring.application.name=rocketmq-consolespring.http.encoding.charset=UTF-8spring.http.encoding.enabled=truespring.http.encoding.force=truelogging.config=classpath:logback.xml# 指定namesrv的监听端口rocketmq.config.namesrvAddr=192.168.20.2:9876;192.168.20.3:9876;192.168.20.4:9876rocketmq.config.isVIPChannel=rocketmq.config.dataPath=/tmp/rocketmq-console/datarocketmq.config.enableDashBoardCollect=true[root@rocketmq01 rocketmq-console]# pwd # 确定当前目录/usr/src/rocketmq-externals/rocketmq-console[root@rocketmq01 rocketmq-console]# mvn clean package -Dmaven.test.skip=true # 进行编译
启动web管理界面
[root@rocketmq01 rocketmq-console]# pwd/usr/src/rocketmq-externals/rocketmq-console[root@rocketmq01 rocketmq-console]# cp -a target/rocketmq-console-ng-1.0.0.jar /usr/local/rocketmq-4.7.0/[root@rocketmq01 rocketmq-console]# cd /usr/local/rocketmq-4.7.0/[root@rocketmq01 rocketmq-4.7.0]# nohup java -jar rocketmq-console-ng-1.0.0.jar &> rocket_console.log &[root@rocketmq01 rocketmq-4.7.0]# ss -lnpt | grep 8080LISTEN 0 100 :::8080 :::* users:(("java",pid=61037,fd=19))
浏览器访问8080端口测试:

可以自行添加代理服务器,如nginx来进行访问认证。
ok了,至此结束。
