一、环境说明
CentOS7;RocketMQ4.5.2;防火墙关闭;虚拟机地址:192.168.0.40,192.168.0.41,192.168.0.42,192.168.0.75;
因为之前该虚拟机上搭建了其他的东西,因此这次就指定别名了,直接通过ip和端口访问;
二、软件说明
RocketMQ本是阿里自己的,后来捐给阿帕奇了,截止到我写这篇博客的时候,阿帕奇公布的RocketMQ的版本是4.5.2,因此这次安装的是4.5.2的。
下载地址:http://rocketmq.apache.org/,首页展示的最新本的版本,点击进去下载即可,若需要之前的版本,可点击Documentation--》左边Download--》选择你想要安装的版本即可安装,选择Binary版本的,可直接安装使用,不要选择Source版本的,那个是源码版本的,无法直接使用还得编译。
三、单机版搭建
单机版的我安装在192.168.0.75虚拟机上
1、上传安装包到75虚拟机的/root目录
2、解压,并重命名为rocketmq,unzip rocketmq-all-4.5.2-bin-release.zip,mv rocketmq-all-4.5.2-bin-release rocketmq
3、创建RocketMQ存储文件的目录,依次执行如下命令:
cd rocketmq
mkdir logs
mkdir store
cd store/
mkdir commitlog
mkdir consumequeue
mkdir index
文件夹说明:
logs:存储RocketMQ日志目录
store:存储RocketMQ数据文件目录
commitlog:存储RocketMQ消息信息
consumequeue、index:存储消息的索引数据
4、 修改配置文件,进入rocketmq的conf目录
conf目录配置文件说明:
2m-2s-async:2主2从异步
2m-2s-sync :2主2从同步
2m-noslave :2主没有从
因为要搭建单机版的,所以只要对其中一个文件夹中的文件进行修改即可,我们修改2m-2s-async的配置实现。
4.1、进入2m-2s-async目录,修改第1个配置文件broker-a.properties,vim broker-a.propertie
将如下配置覆盖掉broker-a.properties所有配置:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示Master, > 0 表示slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=192.168.0.75: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=/root/rocketmq/store
#commitLog存储路径
storePathCommitLog=/root/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/root/rocketmq/store/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
#发消息线程池数量
#sendMessageTreadPoolNums=128
#拉消息线程池数量
#pullMessageTreadPoolNums=128
4.2、进入conf目录,替换所有xml中的${user.home},保证日志路径正确
sed -i 's#${user.home}#/root/rocketmq#g' *.xml
注意:sed -i在这里起一个批量替换的作用,
sed -i 's#原字符串#新字符#g' 替换的文件
5、RocketMQ对内存的要求比较高,最少1G,如果内存太少,会影响RocketMQ的运行效率和执行性能。我们需要修改bin目录下的runbroker.sh和runserver.sh文件
runbroker.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"
runserver.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
6、启动RocketMQ,注意先启动namesrv再启动broker
启动namesrv,nohup sh mqnamesrv &
再启动broker,nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
输入jps查看进程,可看到NamesrvStartup和BrokerStartup两个进程即代表启动
四、RocketMQ控制台安装
我们这里直接将RocketMQ控制代码的源码放到IDEA中运行,后面我们可以打包成jar包在虚拟机上运行。RocketMQ的控制台由一些RocketMQ爱好者提供。
下载地址:https://github.com/apache/rocketmq-externals/tree/master
将rocketmq-connect-console下载并导入到我们本地的idea中,然后修改application.properties,配置RocketMQ的namesrv地址,如下图:
修改好以后找到启动类启动以后即可查看如下图,等RocketMQ收到消息以后即可在该控制台查看消息的情况
五、集群搭建
1、搭建说明
我准备了四台虚拟机:192.168.0.40,192.168.0.41,192.168.0.42,192.168.0.75
准备搭建两主两从异步刷盘同步复制集群,40,41为主,42,75为从
刷盘:broker收到消息以后会先存在内存中,如果消息从内存写入磁盘然后再反馈给客户端收到消息即为同步刷盘,若消息写入内存以后直接反馈给客户端收到消息,等待某个时间段再统一从内存写入到磁盘中则为异步刷盘。同步刷盘频繁跟磁盘交互,效率不如异步刷盘的高。
复制:broker分为主从,主收到消息以后复制到从节点,然后再反馈给客户端,则为同步复制,否则为异步复制。
工作中常用的是异步刷盘和同步复制相结合的模式,保证无单点的情况。
2、环境准备
75上刚才已经安装了RocketMQ,现在要将其作为一个从节点使用,那么若75处于运行当中,则先停止75上的RocketMQ,启动时候是先启动namesrv再启动broker,停止的时候则先停止broker再停止namesrv。
进入75的rocketmq的bin文件夹下,执行以下命令:
sh mqshutdown broker
sh mqshutdown namesrv
3、4台机器一起解压rocketmq压缩文件,最后将解压文件存放在/root/rocketmq目录下。
分别在4台机器的rocketmq目录下执行如下操作:
mkdir logs
mkdir store
cd store/
mkdir commitlog
mkdir consumequeue
mkdir index
进入40集群rocketmq/conf/2m-2s-sync目录下配置对应的配置文件,修改broker-a.properties配置文件,如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示Master, > 0 表示slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存储路径
storePathCommitLog=/root/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/root/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=SYNC_MASTER
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageTreadPoolNums=128
#拉消息线程池数量
#pullMessageTreadPoolNums=128
修改broker-b.properties文件,如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示Master, > 0 表示slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存储路径
storePathCommitLog=/root/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/root/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=SYNC_MASTER
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageTreadPoolNums=128
#拉消息线程池数量
#pullMessageTreadPoolNums=128
修改broker-a-s.properties文件,如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示Master, > 0 表示slave
brokerId=1
#nameServer 地址,分号分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存储路径
storePathCommitLog=/root/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/root/rocketmq/store/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
#发消息线程池数量
#sendMessageTreadPoolNums=128
#拉消息线程池数量
#pullMessageTreadPoolNums=128
修改broker-b-s.properties文件,如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示Master, > 0 表示slave
brokerId=1
#nameServer 地址,分号分割
namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75: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=/root/rocketmq/store
#commitLog存储路径
storePathCommitLog=/root/rocketmq/store/commitlog
#消费队列存储路径
storePathConsumeQueue=/root/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/root/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/root/rocketmq/store/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
#发消息线程池数量
#sendMessageTreadPoolNums=128
#拉消息线程池数量
#pullMessageTreadPoolNums=128
将节点信息拷贝到每台机器,在40机器执行如下命令:
scp broker-*.properties 192.168.0.41:/root/rocketmq/conf/2m-2s-sync
scp broker-*.properties 192.168.0.42:/root/rocketmq/conf/2m-2s-sync
scp broker-*.properties 192.168.0.75:/root/rocketmq/conf/2m-2s-sync
进入到每台机器的conf目录,替换日志文件路径,执行如下命令:
sed -i 's#${user.home}#/root/rocketmq#g' *.xml
进入每台机器的bin目录下,需改runbroker.sh和runserver.sh文件:
runbroker.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g"
runserver.sh
改前:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
改后:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
4、启动集群
先在每台服务器启动namesrv
nohup sh mqnamesrv &
再启动broker,
40服务器执行如下启动命令:
nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-a.properties > /dev/null 2>&1 &
41服务器执行如下启动命令:
nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-b.properties > /dev/null 2>&1 &
42服务器执行如下启动命令:
nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-a-s.properties > /dev/null 2>&1 &
75服务器执行如下启动命令:
nohup sh mqbroker -c /root/rocketmq/conf/2m-2s-sync/broker-b-s.properties > /dev/null 2>&1 &
输入jps查看进程,每台机器上看到NamesrvStartup和BrokerStartup即为启动成功。
5、控制台查看集群
在控制台的项目application.properties的namesrv地址,如下修改:
rocketmq.config.namesrvAddr=192.168.0.40:9876;192.168.0.41:9876;192.168.0.42:9876;192.168.0.75:9876
6、启动控制台服务,并访问控制台,如下:
这里如果想停掉服务,可以先停掉broker:
sh mqshutdown broker
再关闭namesrv:
sh mqshutdown namesrv
7、问题注意
当使用控制台的项目查看集群的时候,启动以后可能会报:RemotingConnectException: connect to <172.17.0.1:10909> failed,
如果你的rocketmq版本小于3.5.8,那么你需要在控制台的项目的application.properties中的rocketmq.config.isVIPChannel设置为false即可解决,如下图:
若你的rocketmq版本大于3.5.8,那么控制台的项目的application.properties中的rocketmq.config.isVIPChannel不需要设置任何值,其默认是true,但是你需要在对应机器的集群配置文件中加上,brokerIP1=你机器的ip,据说是因为你虚拟机多网卡导致的,指定以后就没整个问题了。
举个例子:41机器,我启动broker时根据上面的命令我用的是conf/2m-2s-sync/broker-b.properties文件,那么我在broker-b.properties中加入brokerIP1=你机器的ip即可,如下图