本系列文章主要介绍RocketMQ的相关知识,并通过示例代码介绍RocketMQ的使用方法。
本文为系列文章的第二篇,主要介绍RocketMQ的部署方法。
说明:本文中RocketMQ采用“多Master多Slave(同步双写)”模式。
1 概述
1.1 操作系统及软件信息
本文中部署RocketMQ时,使用的操作系统和软件信息如下:
软件名称 | 版本信息 |
---|---|
操作系统 | CentOS Linux release 7.3.1611, 64bit |
JDK | jdk1.8-1.8.0_201-fcs |
MAVEN | maven-3.6.0 |
GIT | git version 1.8.3.1 |
1.2 服务器信息
本文中部署的RocketMQ包括2个NameServer、2个Master和2个Slave,所以在资源允许的条件下,实际需要6台服务器来进行部署工作。但受资源所限,本文中将使用2台服务器来进行部署。服务器的信息及用途如下:
服务器名称 | 服务器IP | 用途 |
---|---|---|
node1 | 192.168.213.128 | NameServer-1、Master-1、Slave-1 |
node2 | 192.168.213.129 | NameServer-2、Master-2、Slave-2 |
2 RocketMQ部署
2.1 安装JDK
执行下列操作,在服务器上安装JDK。
1. 在Oracle官网的下载页面(Java Downloads | Oracle),找到对应的JDK软件包,然后下载。在本文的示例中,需要下载Linux x64版本的jdk软件包,如下图所示:
2. 下载上图所示的JDK软件包后,将其上传到服务器上,并使用rpm命令安装,信息如下:
[root@node1 /opt]# rpm -ivh jdk-8u201-linux-x64.rpm
warning: jdk-8u201-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:jdk1.8-2000:1.8.0_201-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
[root@node1 /opt]#
3. 通过修改“.bash_profile”文件(新增如下内容),配置JAVA环境变量:
# Config for JDK
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export PATH=$JAVA_HOME/bin:$PATH
4. 运行如下命令,查看jdk是否安装成功:
[root@node1 ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
[root@node1 ~]#
上述查询结果表明,JDK安装成功了。
2.2 安装Maven
执行下列操作,在服务器上安装Maven。
1. 在官网中下载Maven二进制包,链接为:Maven – Download Apache Maven
2. 将下载的Maven二进制包上传到服务器上,并解压,命令如下:
[root@node1 /opt]# tar xvzf apache-maven-3.6.0-bin.tar.gz
3. 通过修改“.bash_profile”文件(新增如下内容),将解压后的apache-maven的bin文件夹路径添加到PATH环境变量中,配置Maven环境变量:
# Config for maven
export PATH=/opt/apache-maven-3.6.0/bin:$PATH
4. 运行如下命令,查看Maven是否安装成功:
[root@node1 ~]# mvn -v
Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-25T02:41:47+08:00)
Maven home: /opt/apache-maven-3.6.0
Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /usr/java/jdk1.8.0_201-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-514.el7.x86_64", arch: "amd64", family: "unix"
[root@node1 ~]#
上述查询结果表明,Maven安装成功了。
2.3 安装RocketMQ
执行下列操作,在服务器上安装RocketMQ。
1. 在官网中下载RocketMQ源码包,链接为:Apache Download Mirrors
2. 将RocketMQ源码包上传到服务器上,并解压,相关命令如下:
[root@node1 ~]# cd /opt/
[root@node1 /opt]# unzip rocketmq-all-4.4.0-source-release.zip
3. 进入解压后的RocketMQ文件夹中,运行mvn命令,构建RocketMQ的二进制内容,命令如下:
[root@node1 /opt/rocketmq-all-4.4.0]# mvn -Prelease-all -DskipTests clean install -U
如果上述命令执行成功,则说明RocketMQ安装完成了,RocketMQ安装在文件夹“/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq”之下。
2.4 配置RocketMQ
在完成了RocketMQ的安装之后,还需要对其进行配置。
2.4.1 配置NameServer
在RocketMQ安装目录中的conf文件夹下创建NameServer的配置文件,信息如下:
【node1服务器】:
[root@node1 /opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/conf]# cat namesvc-1.properties
# 监听端口
listenPort=9876
[root@node1 /opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/conf]#
【node2服务器】:
[root@node2 /opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/conf]# cat namesvc-2.properties
# 监听端口
listenPort=9876
[root@node2 /opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/conf]#
2.4.2 配置Broker
在RocketMQ安装目录中的conf文件夹下,默认会提供几种常见模式的broker配置文件,由于本文部署的是“多Master多Slave(同步双写)”模式,对应的配置文件在“conf/2m-2s-sync”下,所以需要修改该目录下的配置文件。
说明:本文中使用异步刷盘的持久化方式。
【node1服务器】:
node1服务器上的Broker Master的配置文件(broker-a.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.
# 所属集群名字
brokerClusterName=DefaultCluster
# Broker名字。不同的Broker填写的不一样
brokerName=broker-a
# 0表示Master,>0表示Slave
brokerId=0
# 删除文件时间点,默认凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=48
# Broker角色,同步双写Master
brokerRole=SYNC_MASTER
# 刷盘方式(持久化),异步刷盘
flushDiskType=ASYNC_FLUSH
# NameServer地址,使用分号分割
namesrvAddr=192.168.213.128:9876;192.168.213.129:9876
# Broker对外服务的监听端口
listenPort=10911
# 是否允许Broker自动创建Topic,建议线下开启,线上关闭
#autoCreateTopicEnable=true
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
#defaultTopicQueueNums=4
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
#autoCreateSubscriptionGroup=true
# ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
# 存储路径
storePathRootDir=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a/store
# CommitLog存储路径
storePathCommitLog=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a/commitlog
# 消费队列存储路径
storePathConsumeQueue=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a/consumequeue
# 消息索引存储路径
storePathIndex=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a/index
# Checkpoint文件存储路径
storeCheckpoint=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/a/checkpoint
# abort文件存储路径
abortFile=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a/abort
# 限制的消息大小
maxMessageSize=65536
# CommitLog每个文件的大小默认1G
#mapedFileSizeCommitLog=1073741824
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
#diskMaxUsedSpaceRatio=88
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#checkTransactionMessageEnable=false
# 发消息线程池数量
#sendMessageThreadPoolNums=128
# 拉消息线程池数量
#pullMessageThreadPoolNums=128
说明:brokerRole的几个可选参数值为ASYNC_MASTER(异步复制Master)、SYNC_MASTER(同步双写Master)及SLAVE。
node1服务器上的Broker Slave的配置文件(broker-a-s.properties)与Broker Master大体相同,几个不同点如下:
# 0表示Master,>0表示Slave
brokerId=1
# Broker角色,同步双写Slave
brokerRole=SLAVE
# Broker对外服务的监听端口
listenPort=10921
# 存储路径
storePathRootDir=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a-s/store
# CommitLog存储路径
storePathCommitLog=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a-s/commitlog
# 消费队列存储路径
storePathConsumeQueue=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a-s/consumequeue
# 消息索引存储路径
storePathIndex=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a-s/index
# Checkpoint文件存储路径
storeCheckpoint=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/a-s/checkpoint
# abort文件存储路径
abortFile=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/a-s/abort
【node2服务器】:
node2服务器上的Broker Master的配置文件(broker-b.properties)与node1的大体相同,几个不同点如下:
# Broker名字。不同的Broker填写的不一样
brokerName=broker-b
# 存储路径
storePathRootDir=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b/store
# CommitLog存储路径
storePathCommitLog=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b/commitlog
# 消费队列存储路径
storePathConsumeQueue=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b/consumequeue
# 消息索引存储路径
storePathIndex=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b/index
# Checkpoint文件存储路径
storeCheckpoint=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/b/checkpoint
# abort文件存储路径
abortFile=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b/abort
node2服务器上的Broker Slave的配置文件(broker-b-s.properties)与Broker Master的大体相同,几个不同点如下:
# 0表示Master,>0表示Slave
brokerId=1
# Broker角色,同步双写Slave
brokerRole=SLAVE
# Broker对外服务的监听端口
listenPort=10921
# 存储路径
storePathRootDir=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b-s/store
# CommitLog存储路径
storePathCommitLog=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b-s/commitlog
# 消费队列存储路径
storePathConsumeQueue=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b-s/consumequeue
# 消息索引存储路径
storePathIndex=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b-s/index
# Checkpoint文件存储路径
storeCheckpoint=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/b-s/checkpoint
# abort文件存储路径
abortFile=/opt/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/workdir/b-s/abort
2.4.3 修改NameServer服务配置
根据服务器的实际情况(如内存大小),修改NameServer服务的JVM配置。NameServer服务的JVM配置位于RocketMQ的安装目录下的“bin/runserver.sh”中,修改该文件的如下内容:
JAVA_OPT="${JAVA_OPT} -server -Xms200m -Xmx200m -Xmn100m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
说明:本文中将JVM堆的初始化值和最大值统一设置为200m,并将新生代大小设置为100m,主要是因为本文中用到的虚拟机内存容量不大,实际上线上使用是可以配置为默认的4G堆内存的。
2.4.4 修改Broker服务配置
根据服务器的实际情况(如内存大小),修改Broker服务的JVM配置。Broker服务的JVM配置位于rocketmq的安装目录下的“bin/runbroker.sh”中,修改该文件的如下内容:
JAVA_OPT="${JAVA_OPT} -server -Xms300m -Xmx300m -Xmn200m"
2.5 启动服务
完成了RocketMQ的安装和配置之后,就可以启动NameServer和Broker了。
2.5.1 启动NameServer
首先启动NameServer服务。在RocketMQ的安装目录下,运行如下命令:
【node1服务器】:
nohup sh bin/mqnamesrv -c conf/namesvc-1.properties &
【node2服务器】:
nohup sh bin/mqnamesrv -c conf/namesvc-2.properties &
2.5.2 启动Broker
NameServer服务启动成功后,在RocketMQ的安装目录下,运行如下命令,启动Broker:
【node1服务器(Broker Master)】:
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties &
【node1服务器(Broker Slave)】:
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties &
【node2服务器(Broker Master)】:
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties &
【node2服务器(Broker Slave)】:
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties &
2.6 日志分析
默认情况下,NameServer和Broker的日志存放在“~/logs/rocketmqlogs/”文件夹下,可以通过修改conf下的配置文件“logback_namesrv.xml”和“logback_broker.xml”改变日志的存放位置。
2.7 安装控制台
执行下列操作,安装RocketMQ的控制台。
1. 获取RocketMQ的控制台源码包(rocketmq-console),命令如下:
wget https://github.com/apache/rocketmq-externals/archive/rocketmq-console-1.0.0.tar.gz
2. 解压RocketMQ控制台源码包,进入解压后的目录中,并执行如下命令安装rocketmq-console:
mvn clean package -Dmaven.test.skip=true
3. 运行如下命令,启动RocketMQ控制台:
java -jar target/rocketmq-console-ng-1.0.0.jar --server.port=12581 --rocketmq.config.namesrvAddr='192.168.213.128:9876;192.168.213.129:9876'
4. 在浏览器中输入rocketmq-console的部署服务器地址(如 http://192.168.213.128:12581/#/),即可打开RocketMQ的控制台,如下图:
2.8 发送/接收消息
可以使用RocketMQ自带的工具tool.sh,测试RocketMQ的发送和接收消息功能。
在发送/接收消息之前,需要设置NameServer的位置信息,RocketMQ提供了多种方式供我们选择,简单起见,在这里使用环境变量NAMESRV_ADDR。信息如下:
export NAMESRV_ADDR='192.168.213.128:9876;192.168.213.129:9876'
完成上述设置后,可以使用以下命令测试发送消息(充当生产者角色):
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
上述命令的部分运行结果如下:
从上面的运行结果可以看出,生产者的消息有的发往broker-a、有的发往broker-b了,这说明RocketMQ自动实现了发送消息的负载均衡。
然后使用如下命令测试接收消息(充当消费者角色):
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
2.9 常用命令
1. 使用mqshutdown脚本停止NameServer或Broker,命令如下:
sh bin/mqshutdown broker | namesrv
关于RocketMQ编程示例的具体内容,请参考本系列文章的第三篇。