基础篇 RocketMQ安装


成功的秘诀就在于多努力一次。为了成功,你努力了多少次?



1. 前置安装环境

所需要的前置环境变量有:

jdk1.8+、Maven 3.2.x、Git、4G +以上的硬盘空间给Broker Server

2. 单机部署

1. 下载安装包

地址:​​mirror-hk.koddos.net/apache/rock…​​​基础篇 RocketMQ安装_后端

2. 进行文件解压之后进入文件夹

基础篇 RocketMQ安装_存储文件_02

3. 修改Name Server启动脚本中设置的内存

进入bin/文件夹中找到文件,进行修改,原来大小是4G虚拟机没有那么大所以按照256m进行修改

基础篇 RocketMQ安装_RocketMQ_03

4. 修改Broker Server启动脚本中设置的内存

进入bin/文件夹中找到文件,进行修改,原来大小是4G虚拟机没有那么大所以按照256m进行修改

基础篇 RocketMQ安装_存储文件_04

5. 启动Name Server等客户端和Broker连接

# 启动脚本
nohup sh bin/mqnamesrv &
# 查看启动日志
tail -f ~/logs/rocketmqlogs/namesrv.log

执行启动

基础篇 RocketMQ安装_配置文件_05

查看启动日志,启动成功

基础篇 RocketMQ安装_RocketMQ_06

6. 启动Broker Server 进行注册Name Server

# 启动 Broker 并且指定注册到哪个 Name Server
nohup sh bin/mqbroker -n localhost:9876 &
# 查看日志
tail -f ~/logs/rocketmqlogs/broker.log 12

执行启动

基础篇 RocketMQ安装_消息存储_07

查看日志

基础篇 RocketMQ安装_后端_08

7. 安装控制台

RocketMQ有一个可视化的dashboard,通过该控制台可以直观的查看到很多数据。

1. 下载控制台

下载地址:​​/apache/rock…​

找到一个是下图的红框进行下载

基础篇 RocketMQ安装_RocketMQ_09

2. 进行解压并修改配置文件

修改其src/main/resources中的application.properties配置文件:

  1. 原来的端口号为8080,修改为一个不常用的7000
  2. 指定RocketMQ的name server地址

基础篇 RocketMQ安装_RocketMQ_10

3. 添加依赖

在解压目录rocketmq-console的pom.xml中添加如下JAXB依赖

<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version> </dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>

4. 进行打包

利用maven进行打包

mvn clean package -Dmaven.test.skip=true

生成的文件是

基础篇 RocketMQ安装_RocketMQ_11

5. 启动

# 启动命令
nohup java -jar rocketmq-console-ng-1.0.0.jar &

运行命令

基础篇 RocketMQ安装_RocketMQ_12

进行访问:​​http://192.168.2.11:7000/#/​

基础篇 RocketMQ安装_配置文件_13

8.关闭服务

无论是关闭name server还是broker,都是使用bin/mqshutdown命令

先关闭broker

sh bin/mqshutdown broker

基础篇 RocketMQ安装_后端_14

再关闭 name server

sh bin/mqshutdown namesrv

基础篇 RocketMQ安装_消息存储_15

基础篇 RocketMQ安装_RocketMQ_16

3. 单机配置文件解析

# 指定整个broker集群的名称,或者说是RocketMQ集群的名称
brokerClusterName=rocket-MS
# 指定master-slave集群的名称。一个RocketMQ集群可以包含多个master-slave集群
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=nameserver1:9876;nameserver2:9876
#默认为新建Topic所创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议生产环境中关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议生产环境中关闭
autoCreateSubscriptionGroup=true
#Broker对外提供服务的端口,即Broker与producer与consumer通信的端口
listenPort=10911
#HA高可用监听端口,即Master与Slave间通信的端口,默认值为listenPort+1
haListenPort=10912
#指定删除消息存储过期文件的时间为凌晨4点
deleteWhen=04
#指定未发生更新的消息存储文件的保留时长为48小时,48小时后过期,将会被删除
fileReservedTime=48
#指定commitLog目录中每个文件的大小,默认1G
mapedFileSizeCommitLog=1073741824
#指定ConsumeQueue的每个Topic的每个Queue文件中可以存放的消息数量,默认30w条
mapedFileSizeConsumeQueue=300000
#在清除过期文件时,如果该文件被其他线程所占用(引用数大于0,比如读取消息),此时会阻止 此次删除任务,同时在第一次试图删除该文件时记录当前时间戳。该属性则表示从第一次拒绝删除 后开始计时,该文件最多可以保留的时长。在此时间内若引用数仍不为0,则删除仍会被拒绝。不过 时间到后,文件将被强制删除
destroyMapedFileIntervalForcibly=120000
#指定commitlog、consumequeue所在磁盘分区的最大使用率,超过该值,则需立即清除过期文件
diskMaxUsedSpaceRatio=88
#指定store目录的路径,默认在当前用户主目录中
storePathRootDir=/usr/local/rocketmq-all-4.5.0/store
#commitLog目录路径
storePathCommitLog=/usr/local/rocketmq-all-4.5.0/store/commitlog
#consumeueue目录路径
storePathConsumeQueue=/usr/local/rocketmq-all-4.5.0/store/consumequeue
#index目录路径
storePathIndex=/usr/local/rocketmq-all-4.5.0/store/index
#checkpoint文件路径
storeCheckpoint=/usr/local/rocketmq-all-4.5.0/store/checkpoint
#abort文件路径
abortFile=/usr/local/rocketmq-all-4.5.0/store/abort
#指定消息的最大大小
maxMessageSize=65536
#Broker的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=SYNC_MASTER
#刷盘策略
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
#发消息线程池数量
sendMessageThreadPoolNums=128
#拉消息线程池数量
pullMessageThreadPoolNums=128
#强制指定本机IP,需要根据每台机器进行修改。官方介绍可为空,系统默认自动识别,但多网卡时IP地址可能读取错误
brokerIP1=192.168.2.11

4. 集群部署

1. 集群搭建理论

数据复制

复制策略是Broker的Master与Slave间的数据同步方式:

  1. 同步复制

消息写入master后,master会等待slave同步数据成功后才向producer返回成功ACK

  1. 异步复制

消息写入master后,master立即向producer返回成功ACK,无需等待slave同步数据成功

刷盘策略

刷盘策略指的是broker中消息的落盘方式,即消息发送到broker内存后消息持久化到磁盘的方式。分为同步刷盘与异步刷盘:

  1. 同步刷盘

当消息持久化到broker的磁盘后才算是消息写入成功

  1. 异步刷盘

当消息写入到broker的内存后即表示消息写入成功,无需等待消息持久化到磁盘(对于异步 刷盘策略,消息会写入到PageCache后立即返回成功ACK。但并不会立即做落盘操作,而是当PageCache到达一定量时会自动进行落盘

2. Broker集群模式

多Master

broker集群仅由多个master构成,不存在Slave。同一Topic的各个Queue会平均分布在各个master节点上

  1. 优点

配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器 宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步 刷盘一条不丢),性能最高

  1. 缺点

单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅(不可消费),消息实时性会受到影响

多Master多Slave模式-异步复制

broker集群由多个master构成,每个master又配置了多个slave(在配置了RAID磁盘阵列的情况下,一个master一般配置一个slave即可)。master与slave的关系是主备关系,即master负责处理消息的读写请求,而slave仅负责消息的备份与master宕机后的角色切换

异步复制即前面所讲的复制策略中的异步复制策略,即消息写入master成功后,master立即向producer返回成功ACK,无需等待slave同步数据成功

该模式的最大特点之一是,当master宕机后slave能够自动切换为master。不过由于slave从master的同步具有短暂的延迟(毫秒级),所以当master宕机后,这种异步复制方式可能会存在少量消息的丢失问题

多Master多Slave模式-同步双写

该模式是多Master多Slave模式的同步复制实现。所谓同步双写,指的是消息写入master成功后,master会等待slave同步数据成功后才向producer返回成功ACK,即master与slave都要写入成功后才会返回成功ACK,也即双写。

该模式与异步复制模式相比,优点是消息的安全性更高,不存在消息丢失的情况。但单个消息的RT略高,从而导致性能要略低

该模式存在一个大的问题:对于目前的版本,Master宕机后,Slave不会自动切换到Master

最佳实践

一般会为Master配置RAID10磁盘阵列,然后再为其配置一个Slave。即利用了RAID10磁盘阵列的高效、安全性,又解决了可能会影响订阅的问题

5. 集群架构搭建

这里要搭建一个双主双从异步复制的Broker集群。为了方便,这里使用了两台主机来完成集群的搭建。 这两台主机的功能与broker角色分配如下表。

IP

功能

Broker 角色

192.168.2.21

NameServer + Broker

Master1 + Slave2

192.168.2.22

NameServer + Broker

Master2 + Slave1

1. 修改配置文件

我们来看一下RocketMQ 给我们提供的修改配置文件来进行搭建集群的方式,先看一下配置文件

基础篇 RocketMQ安装_存储文件_17

  1. 2m-2s-async 两主两从异步
  2. 2m-2s-sync 两主两从同步
  3. 2m-noslave 两主没有从节点
  4. dledger 另一种搭建集群的方式

我们这里搭建的是两主两从异步的集群,这样异步的更加高效一些,进入配置文件中,192.168.2.21主机节点

基础篇 RocketMQ安装_存储文件_18

修改broker-a.properties,将该配置文件内容修改为如下:192.168.2.21主机节点

# 指定整个broker集群的名称,或者说是RocketMQ集群的名称
brokerClusterName=DefaultCluster
# 指定master-slave集群的名称。一个RocketMQ集群可以包含多个master-slave集群
brokerName=broker-a
# master的brokerId为0
brokerId=0
# 指定删除消息存储过期文件的时间为凌晨4点
deleteWhen=04
# 指定未发生更新的消息存储文件的保留时长为48小时,48小时后过期,将会被删除
fileReservedTime=48
# 指定当前broker为异步复制master
brokerRole=ASYNC_MASTER
# 指定刷盘策略为异步刷盘
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876

修改broker-b-s.properties 将该配置文件内容修改为如下:192.168.2.21主机节点

brokerClusterName=DefaultCluster
# 指定这是另外一个master-slave集群
brokerName=broker-b
# slave的brokerId为非0
brokerId=1
# 指定删除消息存储过期文件的时间为凌晨4点
deleteWhen=04
# 指定未发生更新的消息存储文件的保留时长为48小时,48小时后过期,将会被删除
fileReservedTime=48
# 指定当前broker为slave
brokerRole=SLAVE
# 指定刷盘策略为异步刷盘
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876
# 指定Broker对外提供服务的端口,即Broker与producer与consumer通信的端口。默认 10911。由于当前主机同时充当着master1与slave2,而前面的master1使用的是默认端口。这 里需要将这两个端口加以区分,以区分出master1与slave2
listenPort=11911
# 指定消息存储相关的路径。默认路径为~/store目录。由于当前主机同时充当着master1与 slave2,master1使用的是默认路径,这里就需要再指定一个不同路径
storePathRootDir=~/store-s
storePathCommitLog=~/store-s/commitlog
storePathConsumeQueue=~/store-s/consumequeue
storePathIndex=~/store-s/index
storeCheckpoint=~/store-s/checkpoint
abortFile=~/store-s/abort

接下来我们需要修改另一个主机节点:192.168.2.22 主机节点,同样需要修改rocketMQ解压目录的conf目录的子目录2m-2s-async中的两个配置文件,修改broker-b.properties将该配置文件内容修改为如下:

# 指定整个broker集群的名称,或者说是RocketMQ集群的名称
brokerClusterName=DefaultCluster
# 指定master-slave集群的名称。一个RocketMQ集群可以包含多个master-slave集群
brokerName=broker-b
# master的brokerId为0
brokerId=0
# 指定删除消息存储过期文件的时间为凌晨4点
deleteWhen=04
# 指定未发生更新的消息存储文件的保留时长为48小时,48小时后过期,将会被删除
fileReservedTime=48
# 指定当前broker为异步复制master
brokerRole=ASYNC_MASTER
# 指定刷盘策略为异步刷盘
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876

修改broker-a-s.properties将该配置文件内容修改为如下:

brokerClusterName=DefaultCluster
# 指定这是另外一个master-slave集群
brokerName=broker-a
# slave的brokerId为非0
brokerId=1
# 指定删除消息存储过期文件的时间为凌晨4点
deleteWhen=04
# 指定未发生更新的消息存储文件的保留时长为48小时,48小时后过期,将会被删除
fileReservedTime=48
# 指定当前broker为slave
brokerRole=SLAVE
# 指定刷盘策略为异步刷盘
flushDiskType=ASYNC_FLUSH
# 指定Name Server的地址
namesrvAddr=192.168.2.21:9876;192.168.2.22:9876
# 指定Broker对外提供服务的端口,即Broker与producer与consumer通信的端口。默认 10911。由于当前主机同时充当着master1与slave2,而前面的master1使用的是默认端口。这 里需要将这两个端口加以区分,以区分出master1与slave2
listenPort=11911
# 指定消息存储相关的路径。默认路径为~/store目录。由于当前主机同时充当着master1与 slave2,master1使用的是默认路径,这里就需要再指定一个不同路径
storePathRootDir=~/store-s
storePathCommitLog=~/store-s/commitlog
storePathConsumeQueue=~/store-s/consumequeue
storePathIndex=~/store-s/index
storeCheckpoint=~/store-s/checkpoint
abortFile=~/store-s/abort

2. 启动Name Server集群

分别启动192.168.2.21与192.168.2.22两个主机中的NameServer。启动命令完全相同

nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log

192.168.2.21 节点Name Server启动成功

基础篇 RocketMQ安装_后端_19

192.168.2.22 节点Name Server启动成功

基础篇 RocketMQ安装_配置文件_20

3. 启动两个Master Broker节点

先启动192.168.2.21上面的master broker节点

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &

基础篇 RocketMQ安装_消息存储_21

查看启动日志

tail -f ~/logs/rocketmqlogs/broker.log

基础篇 RocketMQ安装_配置文件_22

注册Name Server 成功也启动成功了

再启动192.168.2.22上面的master broker节点

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties &

基础篇 RocketMQ安装_消息存储_23

查看启动日志

tail -f ~/logs/rocketmqlogs/broker.log

基础篇 RocketMQ安装_后端_24

同样192.168.2.22 上的master broker 也成功了

4. 启动两个Slave Broker节点

先启动192.168.2.21上面的从节点

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties &

基础篇 RocketMQ安装_后端_25

查看启动日志

tail -f ~/logs/rocketmqlogs/broker.log

基础篇 RocketMQ安装_后端_26

接着启动192.168.2.22上面的从节点

nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties

基础篇 RocketMQ安装_RocketMQ_27

查看启动日志

tail -f ~/logs/rocketmqlogs/broker.log

基础篇 RocketMQ安装_存储文件_28

同理也启动成功了