一、概要
RocketMQ 是一个分布式消息和流媒体平台,具有低延迟、高性能和可靠性、万亿级容量和灵活的可扩展性。
整个流程如下:
1)启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来完成注册,相当于一个路由控制中心。
2)Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
3)收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
4)Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
5)Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。
总结:消息生产者生产消息前,会先向NameServer中获取Broker,这就要求Broker需先注册到NameServer中,producer获取到Broker以后,就可以生产消息并交由Broker存储,Broker内部调用模块MessageQueue存储消息,而MessageQueue又会被逻辑划分为一个一个的topic,之后,消息消费者从NameServer中获取Broker,获取到Broker后,取出消息进行消费。
二、配置机器环境
准备3台虚拟机,ip地址如下所示,进行添加本地hosts解析。
193.168.30.14 mq-1
193.168.30.25 mq-2
193.168.30.36 mq-3
三、部署JDK
1、安装JDK
每台上传JDK8安装包并解压到指定目录
tar -zxvf jdk-8u411-linux-x64.tar.gz -C /home/
2、配置JDK环境变量
编辑/etc/profile
文件,添加JDK的环境变量。
export JAVA_HOME=/home/jdk1.8.0_411
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin
3、使环境变量生效
source /etc/profile
4、检查JDK版本
java -version
四、部署Rocketmq
1、每台上传rocketmq的安装包解压并改名
unzip softs/rocketmq-all-4.9.8-bin-release.zip
mv rocketmq-all-4.9.8-bin-release/ rocketmq-4.9.8
2、配置rocketmq环境变量
编辑/etc/profile
文件,添加rocketmq的环境变量。
export ROCKETMQ_HOME=/home/rocketmq-4.9.8
export NAMESRV_ADDR='mq1nginx1:9876;mq2nginx2:9876;mq-3:9876'
3、使环境变量生效
source /etc/profile
rocketmq根据配置文件有几种模式
2m-2s-async: 2主2从异步刷盘(吞吐量较大,但是消息可能丢失)
2m-2s-sync:2主2从同步刷盘(吞吐量会下降,但是消息更安全)
2m-noslave:2主无从(单点故障),然后还可以直接配置broker.conf,进行单点环境配置
而dleger就是用来实现主从切换的。集群中的节点会基于Raft协议随机选举出一个leader,其他的就都是follower。通常正式环境会采用这种方式来搭建集群。
这里我们选择2m-2s-async
4、节点分配情况
主机名 | nemaeServer节点部署 | broker节点部署 |
mq-1 | nemaeServer | broker-a, broker-b-s |
mq-2 | nemaeServer | broker-b,broker-a-s |
mq-3 | nemaeServer |
5、配置第一组broker-a
mq-1配置borker-a的master节点,配置2m-2s-async/broker-a.properties
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
brokerIP1=mq-1
brokerIP2=mq-1
#broker名字,名字一样的节点就是一组主从节点。
brokerName=broker-a
#brokerid,0就表示是Master,>0的都是表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=mq-1:9876;mq-2:9876;mq-3:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketmq-4.9.8/data
#commitLog 存储路径
storePathCommitLog=/home/rocketmq-4.9.8/data/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketmq-4.9.8/data/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq-4.9.8/data/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq-4.9.8/data/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq-4.9.8/data/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
mq-2配置borker-a的salve节点,配置2m-2s-async/broker-a-s.properties
只需要修改brokerId和brokerRole就行
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
brokerIP1=mq-2
#broker名字,名字一样的节点就是一组主从节点。
brokerName=broker-a
#brokerid,0就表示是Master,>0的都是表示 Slave
brokerId=100
#nameServer地址,分号分割
namesrvAddr=mq-1:9876;mq-2:9876;mq-3:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketmq-4.9.8/dataslave
#commitLog 存储路径
storePathCommitLog=/home/rocketmq-4.9.8/dataslave/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketmq-4.9.8/dataslave/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq-4.9.8/dataslave/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq-4.9.8/dataslave/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq-4.9.8/dataslave/storeSlave/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
6、配置第二组Broker-b
mq-2配置broker-b的master节点,配置2m-2s-async/broker-b.properties
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
brokerIP1=mq-2
brokerIP2=mq-2
#broker名字,名字一样的节点就是一组主从节点。
brokerName=broker-b
#brokerid,0就表示是Master,>0的都是表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=mq-1:9876;mq-2:9876;mq-3:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketmq-4.9.8/data
#commitLog 存储路径
storePathCommitLog=/home/rocketmq-4.9.8/data/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketmq-4.9.8/data/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq-4.9.8/data/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq-4.9.8/data/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq-4.9.8/data/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
mq-1配置broker-b的的salve节点,配置2m-2s-async/broker-b-s.properties
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
brokerIP1=mq-1
#broker名字,名字一样的节点就是一组主从节点。
brokerName=broker-b
#brokerid,0就表示是Master,>0的都是表示 Slave
brokerId=100
#nameServer地址,分号分割
namesrvAddr=mq-1:9876;mq-2:9876;mq-3:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketmq-4.9.8/dataslave
#commitLog 存储路径
storePathCommitLog=/home/rocketmq-4.9.8/dataslave/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketmq-4.9.8/dataslave/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq-4.9.8/dataslave/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq-4.9.8/dataslave/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq-4.9.8/dataslave/storeSlave/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
其他注意
(1)、同一机器上两个实例的store目录不能相同,否则会报错Lock failed,MQalready started。
(2)、同一机器上两个实例的listenPort也不能相同,否则会报端口占用的错。
(3)、nameserver不需要进行配置,直接启动就行。这也看出nameserver是无状态的。
7、启动RocketMQ
(1)、启动nameServer
调整修改jvm内存,修改三个节点上的bin/runserver.sh(可选项,根据自己实际情况调整)
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
三个节点上启动nameServer
nohup bin/mqadminsrv &
查看进程
ps -ef | grep rocket| grep -v grep
(2)、启动broker
注意事项
启动broker是使用的mqbroker指令,只是注意启动broker时需要通过-c指定对应的配置文件。
分别在mq-1和mq-2上面启动broker-a和broker-b
启动顺序是:
broker-a
broker-a-s
broker-b
broker-b-s
nohup ./mqbroker -c ../conf/2m-2s-async/broker-a.properties &
nohup ./mqbroker -c ../conf/2m-2s-async/broker-a-s.properties &
nohup ./mqbroker -c ../conf/2m-2s-async/broker-b.properties &
nohup ./mqbroker -c ../conf/2m-2s-async/broker-b-s.properties &
查看进程
ps -ef | grep rocket| grep -v grep
8、命令行快速验证
在RocketMQ的安装包中,提供了一个tools.sh工具可以用来在命令行快速验证RocketMQ服务。
配置一个环境变量NAMESRV_ADDR,指定NameServer地址
export NAMESRV_ADDR='mq-1:9876;mq-2:9876;mq-3:9876'
发送消息:默认会发1000条消息
./bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
接收消息
./bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
五、搭建管理控制台
地址:https://github.com/apache/rocketmq-externals/tree/release-rocketmq-console-1.0.0
下载下来后,进入其中的rocket-console目录,使用maven进行编译
mvn clean package -Dmaven.test.skip=true
编译完成后,获取target下的jar包,就可以直接执行。但是这个时候要注意,在这个项目的application.properties中需要指定nameserver的地址。默认这个属性是空的,可以启动时指定。
nohup java -jar rocketmq-console-ng-1.0.1.jar --rocketmq.config.namesrvAddr=193.168.30.14:9876;193.168.30.25:9876;193.168.30.36:9876 &