专栏首页JAVA同学会RocketMQ系列(二)环境搭建

RocketMQ系列(二)环境搭建

RocketMQ的基本概念在上一篇中给大家介绍了,这一节将给大家介绍环境搭建。RocketMQ中最基础的就是NameServer,我们先来看看它是怎么搭建的。

NameServer

RocketMQ要求的环境是JDK8以上,我们先检查一下环境,

[root@centOS-1 ~]# java -version
openjdk version "11.0.3" 2019-04-16 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.3+7-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.3+7-LTS, mixed mode, sharing)

我的这个机器并没有刻意的安装JDK,而是系统自带的OpenJDK 11,这应该也是没有问题的。然后我们从RocketMQ官网下载最新的安装包,并且上传到/opt目录下,

[root@centOS-1 opt]# ll
-rw-r--r--.  1 root  root 13838456 6月   3 08:49 rocketmq-all-4.7.0-bin-release.zip

然后我们解压这个zip包,

[root@centOS-1 opt]# unzip rocketmq-all-4.7.0-bin-release.zip

这里使用的是unzip命令,如果你的机器里没有这个命令,可以使用yum install安装一个。解压以后,进入到RocketMQ的主目录,并且启动一下NameServer。

[root@centOS-1 opt]# cd rocketmq-all-4.7.0-bin-release
[root@centOS-1 rocketmq-all-4.7.0-bin-release]# ./bin/mqnamesrv
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Unrecognized VM option 'UseCMSCompactAtFullCollection'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

这里出了一个错误Error: Could not create the Java Virtual Machine,这是由于RocketMQ的启动文件都是按照JDK8配置的,而我们这里使用的是OpenJDK11,有很多命令参数不支持导致的,如果小伙伴们使用的是JDK8,正常启动是没有问题的。

在这里我们改一下RocketMQ的启动文件,

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim bin/runserver.sh 
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
#在CLASSPATH中添加RocketMQ的lib目录
#export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
export CLASSPATH=.:${BASE_DIR}/lib/*:${BASE_DIR}/conf:${CLASSPATH}

修改的地方我们增加了注释,在ClassPath里添加了lib目录,然后在这个文件的末尾,注释掉升级JDK后不支持的几个参数,

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails"
#JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
#JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

好了,修改完以后,我们保存退出,再次启动,这次我们在后台启动NameServer,

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# nohup ./bin/mqnamesrv &

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# tail -500f ~/logs/rocketmqlogs/namesrv.log 

然后查看一下日志,在日志中看到main - The Name Server boot success. serializeType=JSON,说明NameServer启动成功了。

单点的NameServer肯定是不能满足我们的要求的,怎么也要做个集群吧。NameServer是一个无状态的服务,节点之间没有任何数据往来,所以NameServer的集群搭建不需要任何的配置,只需要启动多个NameServer服务就可以了,它不像Zookeeper集群搭建那样,需要配置各个节点。在这里我们就启动3个NameServer节点吧,对应我们的3台机器,192.168.73.130,192.168.73.131,192.168.73.132

Broker

NameServer集群搭建完成,下面就搭建Broker了,Broker呢,我们要搭建一个两主两从结构的,主从之间异步备份,保存磁盘也是使用异步的方式。如果你对主从同步和保存磁盘的方式还不了解,看看上一节的内容吧。异步两主两从这种结构的配置,在RocketMQ中已经有例子了,我们先一下配置文件。

[root@centOS-1 rocketmq-all-4.7.0-bin-release]# vim conf/2m-2s-async/broker-a.properties 

这个配置文件是broker-a“主”的配置文件,

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH

其中,

  • brokerClusterName是MQ集群的名称,我们改为RocketMQ-Cluster。
  • brokerName是队列的名字,配置为broker-a。
  • brokerId是队列的id,0代表是“主”,其他正整数代表着“从”。
  • deleteWhen=04 代表着commitLog过期了,就会被删除。
  • fileReservedTime是commitLog的过期时间,单位是小时,这里配置的是48小时。
  • brokerRole,队列的角色,ASYNC_MASTER是异步主。
  • flushDiskType,保存磁盘的方式,异步保存。

再看看broker-a的从配置,

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

其中,集群的名字一样,队列的名字一样,只是brokerId和brokerRole不一样,这里的配置代表着它是队列broker-a的“从”。broker-b的配置和broker-a是一样的,只是brokerName不一样而已,在这里就不贴出来了。

两主两从的配置文件都已经配置好了,我们来规划一下,我们的NameServer是3台192.168.73.130,192.168.73.131,192.168.73.132,broker按照如下部署:

  • broker-a(主):192.168.73.130
  • broker-a(从):192.168.73.131
  • broker-b(主):192.168.73.131
  • broker-b(从):192.168.73.130

接下来,我们启动broker,在192.168.73.130上启动 broker-a(主)和broker-b(从)。和NameServer一样,我们需要修改一下启动的脚本,否则也会报错误。我们修改的是runbroker.sh这个文件,修改的内容和前面是一样的,这里就不赘述了。在启动文件中,内存大小配置的是8g,如果机器的内存不够,可以适当减少一下内存。

这里还要做个说明,由于我们在一台机器上启动了两个broker实例,监听端口和日志存储的路径都会有冲突。那么我们在192.168.73.130的broker-b(从)的配置文件中,增加配置,如下:

brokerClusterName=RocketMQ-Cluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=11911
storePathRootDir=~/store-b                       

broker-b(从)的端口改为11911,区别默认的10911;storePathRootDir改为~/store-b,区分默认的~/store

同样在192.168.73.131的broker-a(从)也要做修改,如下:

brokerClusterName=RocketMQ-Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

listenPort=11911
storePathRootDir=~/store-a

然后,我们在192.168.73.130上启动,如下,

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-a.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &
  • -c 指定的是配置文件,分别指定的是broker-a(主)和broker-b(从)。
  • -n 指定的是NameServer的地址,指定了3个,用,隔开。

再在192.168.73.131上启动,如下,

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-b.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

nohup ./bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876' &

好,如果没有出现错误,到这里,集群就搭建成功了。这里边有个小坑,大家一定要注意,就是-n后面的地址一定要用''括起来,并且地址之间要用;,否则,我们在查看集群列表时,是看不到的。

mqadmin

集群已经搭建好了,我们可以查看一下集群的状态,查看集群的状态,我们可以使用mqadmin,命令如下:

./bin/mqadmin clusterlist -n '192.168.73.130:9876;192.168.73.131:9876;192.168.73.132:9876'
  • clusterlist 是查看集群的命令
  • -n 后面是NameServer的地址,注意这里也要用''括起来,并且地址之间要用;隔开

执行结果如下:

#Cluster Name     #Broker Name            #BID  #Addr                  #Version                #InTPS(LOAD)       #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
RocketMQ-Cluster  broker-a                0     192.168.73.130:10911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 -1.0000
RocketMQ-Cluster  broker-a                1     192.168.73.131:11911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 0.2956
RocketMQ-Cluster  broker-b                0     192.168.73.131:10911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 0.2956
RocketMQ-Cluster  broker-b                1     192.168.73.130:11911   V4_7_0                   0.00(0,0ms)         0.00(0,0ms)          0 442039.47 -1.0000

我们可以看到在这个NameServer中心中,只有一个broker集群RocketMQ-Cluster,有两个broker,broker-abroker-b,而且每一个broker都有主从,broker的ip我们也可以看到。

好了~ 到这里RocketMQ的集群就搭建好了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RocketMQ系列(二)环境搭建

    RocketMQ的基本概念在上一篇中给大家介绍了,这一节将给大家介绍环境搭建。RocketMQ中最基础的就是NameServer,我们先来看看它是怎么搭建的。

    小忽悠
  • RocketMQ 环境搭建

    张申傲
  • Appium系列|Appium环境搭建(二)

    Android Studio是专门用来开发Android应用的IDE(集成开发环境),类似于其他IDE如Eclipse。有时候需要查看开发源码、编写个A...

    测试邦
  • SDL系列讲解(二) 环境搭建

    准备环境 这一节,我们讲解下如何搭建SDL 的 Android开发环境。我们当前的电脑环境为: 系统 Window 7 64位 内存 8...

    用户1263308
  • Linux环境搭建系列(1) —— JAVA 环境的搭建

    求和小熊猫
  • RocketMQ之——单机环境搭建

    今天,带来一篇搭建RocketMQ单机环境的文章,为后面的分布式事务专栏做准备。RocketMQ是阿里巴巴开源的一款高性能分布式消息中间件,有关RocketMQ...

    冰河
  • 【Rocketmq】通过 docker 快速搭建 rocketmq 环境

    {RmHome} 要替换成你的宿主机想保存 MQ 的日志与数据的地方,通过 docker 的 -v 参数使用 volume 功能,把你本地的目录映射到容器内的...

    KIWI
  • Appium系列|Appium环境搭建(一)

    Appium是一种现在市面上很流行的自动化测试的工具,可以用来进行Android端、iOS端、Windows应用的自动化。对于移动端应用,它既支持应用内...

    测试邦
  • soupui系列|测试环境搭建

    SoapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。该工具既可作为一个单独的测试软件使用,也...

    测试邦
  • RestAssured接口系列|环境搭建

    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.h...

    测试邦
  • python入门系列----环境搭建

    可在官网下载, 一般是龟速下载, 可通过淘宝镜像站下载: https://npm.taobao.org/mirrors, 推荐点此直接下载

    devecor
  • Flutter系列(三)——环境搭建(Windows)

    开始正式使用Flutter之前,需要搭建环境 本文,只是针对Windwos系统,如果是MAC的话,请参考这篇文章

    Demo_Yang
  • Flutter系列(三)——环境搭建(Windows)

    由于众所周知的原因,国内访问Flutter可能会收到限制,所有Flutter官方为中国开发者搭建了临时镜像,大家只需要把镜像变量加入到用户环境变量当中:

    Demo_Yang
  • Spring Boot系列之环境搭建

    16年开始就在写Spring Boot相关的文章了,之前一直是在自己猿天地的博客上发布,今年开始维护公众号,大部分时间都在写新的文章。

    猿天地
  • Substrate 开发系列 - 环境搭建

    Polkadot 目标是成为一个连接各区块链的区块链(网络),Substrate 是 Polkadot 生态中重要的一环, 他是一套工具与框架的集合,让我们以模...

    Tiny熊
  • RocketMQ源码之路(一)搭建RocketMQ源码环境

    本文不再赘述如何去fork代码,如何去git clone代码,笔者认为多数读者都会这些基本操作,如果正在阅读的您尚未掌握这些技巧,可以去查看一下其他博主的文章,...

    itlemon
  • Mybatis系列全解(二):Mybatis简介与环境搭建

    Mybatis系列全解,我们预计准备10+篇文章,让我们了解到 Mybatis 的基本全貌,真正从入门到上手,从上手到精通,本文为首篇,我们开始。

    潘潘和他的朋友们
  • .Net Core系列教程(一)——环境搭建一、目标:二、环境安装:

    微软在前些天发布了.Net Core 1.0,总算可以在我的这些Linux小鸡上跑.Net了,最近体验了下,感觉还不错,下面就以写一个网站为例,把整个的过程记录...

    徐大嘴
  • Nginx学习系列之搭建环境

    进入root模式,安装两个组件.指令-y表示安装过程需要选择是否同意的全部选同意  autoconf表示自动配置 automake表示自动make

    郑小超.

扫码关注云+社区

领取腾讯云代金券