RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,于2016年11月成为 Apache 孵化项目,并于2017年9月25日成为 Apache 的顶级项目。其前身是MetaQ (Metamorphosis),它并不遵循任何规范(如JMS,AMQP等),但是参考了各种规范与同类产品的设计思想,其主要借鉴的产品是Apache Kafka。
中间件是位于平台(硬件和操作系统)和应用之间的通用服务,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,中间件可以有符合接口和协议规范的多种实现。
RocketMQ=Rocket Message Queue也就是消息队列,作为经历过多次阿里巴巴双十一这种“超级工程”的洗礼并有稳定出色表现的国产中间件,以其高性能、低延时和高可靠等特性近年来也已经被越来越多的国内企业使用。其主要特点有:
RocketMQ 网络部署特点:
下面是一张 RocketMQ 的部署结构图,里面涉及了 RocketMQ 核心的四大组件:Name Server、Broker、Producer、Consumer ,每个组件都可以部署成集群模式进行水平扩展。
结合部署架构图,描述集群工作流程:
只有一个 Master节点,这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。
一个集群无Slave,全是Master,例如2个Master或者3个Master。
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级)。
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功。
介绍一下我们搭建集群的环境:
OS:CentOS Linux release 8.2.2004 (Core)
IP:192.168.0.24(1个master 和 1个slave) 192.168.0.27(1个master 和 1个slave)
jdk:1.8.0_271
git:2.18.2
maven:Apache Maven 3.6.3
防火墙是关闭状态,SELinux是Disabled。
在192.168.0.24和192.168.0.27两台机器上分别创建:
192.168.0.24:
[root@dxm24 ~]# mkdir -p /data/rocketmq
[root@dxm24 ~]# cd /data/rocketmq/
192.168.0.27:
[root@dxm27 ~]# mkdir -p /data/rocketmq
[root@dxm27 ~]# cd /data/rocketmq/
在192.168.0.24和192.168.0.27两台机器中其中一台上执行wget命令,下载完成之后,scp到另一台机器即可。我们这里在192.168.0.24上执行下载,然后scp到192.168.0.27上。
[root@dxm24 rocketmq]# wget https://mirror.bit.edu.cn/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip
[root@dxm24 rocketmq]# ll -h
在192.168.0.24这台机器上执行:
[root@dxm24 rocketmq]# scp rocketmq-all-4.7.1-bin-release.zip [email protected]:/data/rocketmq/
然后去192.168.0.27的/data/rocketmq目录下查看一下:
[root@dxm27 rocketmq]# ll -h
两台机器上都要执行
[root@dxm24 rocketmq]# unzip rocketmq-all-4.7.1-bin-release.zip -d /usr/local/
[root@dxm27 rocketmq]# unzip rocketmq-all-4.7.1-bin-release.zip -d /usr/local/
两台机器上都要执行
#先检查用户rocketmq和组rocketmq是否存在
#检查组是否存在
cat /etc/group | grep rocketmq
#如果不存在,创建组
groupadd rocketmq
#检查用户rocketmq是否存在
cat /etc/passwd | grep rocketmq
或者
id rocketmq
#如果不存在,创建用户
useradd -g rocketmq rocketmq
两台机器上都要执行:
在192.168.0.24上执行:
[root@dxm24 rocketmq]# mkdir -p /data/rocketmq/store/{rootdir-a-m,commitlog-a-m,consumequeue-a-m,index-a-m,checkpoint-a-m,abort-a-m,rootdir-b-s,commitlog-b-s,consumequeue-b-s,index-b-s,checkpoint-b-s,abort-b-s}
[root@dxm27 rocketmq]# mkdir -p /data/rocketmq/store/{rootdir-b-m,commitlog-b-m,consumequeue-b-m,index-b-m,checkpoint-b-m,abort-b-m,rootdir-a-s,commitlog-a-s,consumequeue-a-s,index-a-s,checkpoint-a-s,abort-a-s}
两台服务器都要修改/etc/hosts,加入下面两行:
192.168.0.24 rocketmq-nameserver-1
192.168.0.27 rocketmq-nameserver-2
两台服务器都要修改/etc/profile,加入下面两行:
export ROCKETMQ_HOME=/usr/local/rocketmq-all-4.7.1-bin-release
export PATH=$ROCKETMQ_HOME/bin:$PATH
使其生效:
[root@dxm24 rocketmq]# source /etc/profile
[root@dxm27 rocketmq]# source /etc/profile
先查看RocketMQ配置文件有哪些:
[root@dxm27 rocketmq]# ll /usr/local/rocketmq-all-4.7.1-bin-release/conf/
如图,因为我们采用的是双主双从异步复制,默认的rocketmq已经为我们配置了相应配置目录2m-2s-async,所以修改的配置文件是2m-2s-async目录下的配置文件。
192.168.0.24 rocketmq-nameserver-1 角色:broker-a-master & broker-b-slave
所以在192.168.0.24机器上,要修改broker-a.properties和broker-b-s.properties:
[root@dxm24 rocketmq]# cd /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/
[root@dxm24 2m-2s-async]# vim broker-a.properties
broker-a.properties配置如下内容:
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=dxm-rocket-mq-cluster
#broker名字,名字一样的节点就是一组主从节点。注意此处不同的配置文件填写的不一样
brokerName=rocketmq-nameserver-1
#brokerId 0 表示 Master,>0 表示 Slave
brokerId=0
# Broker 对外服务的监听端口
listenPort=10911
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
# 删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker role有3种:SYNC MASTER、ASYNC MASTER、SLAVE。关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,SYNC即同步更新,指当Slave和Master消息同步完成后,再返回发送成功的状态。ASYNC即异步更新,master与slave有短暂消息延迟,毫秒级。本文在此使用了异步复制集群模式,线上环境推荐使用同步双写模式,即SYNC_MASTER
brokerRole=ASYNC_MASTER
# 刷盘方式 ASYNC_FLUSH 异步刷盘
flushDiskType=ASYNC_FLUSH
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store/rootdir-a-m
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog-a-m
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue-a-m
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index-a-m
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint-a-m
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort-a-m
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-b-s.properties配置如下内容:
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=dxm-rocket-mq-cluster
#broker名字,名字一样的节点就是一组主从节点。注意此处不同的配置文件填写的不一样
brokerName=rocketmq-nameserver-2
#brokerId 0 表示 Master,>0 表示 Slave
brokerId=1
# Broker 对外服务的监听端口
listenPort=10921
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
# 删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker role有3种:SYNC MASTER、ASYNC MASTER、SLAVE。关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,SYNC即同步更新,指当Slave和Master消息同步完成后,再返回发送成功的状态。ASYNC即异步更新,master与slave有短暂消息延迟,毫秒级。本文在此使用了异步复制集群模式,线上环境推荐使用同步双写模式,即SYNC_MASTER
brokerRole=SLAVE
# 刷盘方式 ASYNC_FLUSH 异步刷盘
flushDiskType=ASYNC_FLUSH
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store/rootdir-b-s
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog-b-s
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue-b-s
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index-b-s
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint-b-s
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort-b-s
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
192.168.0.27 rocketmq-nameserver-2 角色:broker-b-master & broker-a-slave
所以在192.168.0.27机器上,要修改broker-b.properties和broker-a-s.properties:
[root@dxm27 conf]# cd /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/
[root@dxm27 2m-2s-async]# vim broker-b.properties
broker-b.properties配置如下内容:
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=dxm-rocket-mq-cluster
#broker名字,名字一样的节点就是一组主从节点。注意此处不同的配置文件填写的不一样
brokerName=rocketmq-nameserver-2
brokerIP1=192.168.0.27
#brokerId 0 表示 Master,>0 表示 Slave
brokerId=0
# Broker 对外服务的监听端口
listenPort=10911
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
# 删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker role有3种:SYNC MASTER、ASYNC MASTER、SLAVE。关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,SYNC即同步更新,指当Slave和Master消息同步完成后,再返回发送成功的状态。ASYNC即异步更新,master与slave有短暂消息延迟,毫秒级。本文在此使用了异步复制集群模式,线上环境推荐使用同步双写模式,即SYNC_MASTER
brokerRole=ASYNC_MASTER
# 刷盘方式 ASYNC_FLUSH 异步刷盘
flushDiskType=ASYNC_FLUSH
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store/rootdir-b-m
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog-b-m
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue-b-m
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index-b-m
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint-b-m
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort-b-m
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-a-s.properties配置如下内容:
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=dxm-rocket-mq-cluster
#broker名字,名字一样的节点就是一组主从节点。注意此处不同的配置文件填写的不一样
brokerName=rocketmq-nameserver-1
#brokerId 0 表示 Master,>0 表示 Slave
brokerId=1
# Broker 对外服务的监听端口
listenPort=10921
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver-1:9876;rocketmq-nameserver-2:9876
# 删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker role有3种:SYNC MASTER、ASYNC MASTER、SLAVE。关键词SYNC和ASYNC表示Master和Slave之间同步消息的机制,SYNC即同步更新,指当Slave和Master消息同步完成后,再返回发送成功的状态。ASYNC即异步更新,master与slave有短暂消息延迟,毫秒级。本文在此使用了异步复制集群模式,线上环境推荐使用同步双写模式,即SYNC_MASTER
brokerRole=SLAVE
# 刷盘方式 ASYNC_FLUSH 异步刷盘
flushDiskType=ASYNC_FLUSH
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/rocketmq/store/rootdir-a-s
#commitLog 存储路径
storePathCommitLog=/data/rocketmq/store/commitlog-a-s
#消费队列存储路径存储路径
storePathConsumeQueue=/data/rocketmq/store/consumequeue-a-s
#消息索引存储路径
storePathIndex=/data/rocketmq/store/index-a-s
#checkpoint 文件存储路径
storeCheckpoint=/data/rocketmq/store/checkpoint-a-s
#abort 文件存储路径
abortFile=/data/rocketmq/store/abort-a-s
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
注意:
1、同一机器上两个实例的store目录不能相同,否则会报错 Lock failed,MQ already started
2、同一机器上两个实例的listenPort也不能相同。否则会报端口占用的错
调一下JVM,包括nameserver 和 broker。限于自己机器的配置,参数调小一下。但Rocketmq最少的堆是1g,否则无法启动。两台机器执行相同的操作。
[root@dxm24 2m-2s-async]# cd /usr/local/rocketmq-all-4.7.1-bin-release/bin/
[root@dxm24 bin]# vim runserver.sh
修改以下内容:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
[root@dxm24 bin]# vim runbroker.sh
修改以下内容:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g"
最少的堆是1g,由于本地资源有限,我就设置最少了。
要先启动nameserver,再启动broker,两台机器执行相同的操作。
[root@dxm24 bin]# vim /usr/local/rocketmq-all-4.7.1-bin-release/start_rocketmq_nameserver.sh
内容如下:
#!/bin/bash
source /etc/profile
nohup sh /usr/local/rocketmq-all-4.7.1-bin-release/bin/mqnamesrv > /data/rocketmq/store/rocketmqnamesrv.log 2>&1 &
加上可执行权限:
[root@dxm24 bin]# chmod +x /usr/local/rocketmq-all-4.7.1-bin-release/start_rocketmq_nameserver.sh
然后scp到192.168.0.27机器相同目录上一份启动脚本文件。
[root@dxm24 bin]# scp /usr/local/rocketmq-all-4.7.1-bin-release/start_rocketmq_nameserver.sh [email protected]:/usr/local/rocketmq-all-4.7.1-bin-release/
[root@dxm24 bin]# vim /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_a_m.sh
内容如下:
#!/bin/bash
nohup sh /usr/local/rocketmq-all-4.7.1-bin-release/bin/mqbroker -c /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-a.properties > /data/rocketmq/store/broker-a-m.log 2>&1 &
加上可执行权限:
[root@dxm24 bin]# chmod +x /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_a_m.sh
[root@dxm24 bin]# vim /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_b_s.sh
内容如下:
#!/bin/bash
nohup sh /usr/local/rocketmq-all-4.7.1-bin-release/bin/mqbroker -c /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-b-s.properties > /data/rocketmq/store/broker-b-s.log 2>&1 &
加上可执行权限:
[root@dxm24 bin]# chmod +x /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_b_s.sh
192.168.0.27 rocketmq-nameserver-2 角色:broker-b-master & broker-a-slave
start_broker_b_m.sh:
[root@dxm27 2m-2s-async]# vim /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_b_m.sh
内容如下:
#!/bin/bash
nohup sh /usr/local/rocketmq-all-4.7.1-bin-release/bin/mqbroker -c /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-b.properties > /data/rocketmq/store/broker-b-m.log 2>&1 &
加上可执行权限:
[root@dxm27 2m-2s-async]# chmod +x /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_b_m.sh
[root@dxm27 2m-2s-async]# vim /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_a_s.sh
内容如下:
#!/bin/bash
nohup sh /usr/local/rocketmq-all-4.7.1-bin-release/bin/mqbroker -c /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-a-s.properties > /data/rocketmq/store/broker-a-s.log 2>&1 &
加上可执行权限:
[root@dxm27 2m-2s-async]# chmod +x /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_a_s.sh
上面我们启动完服务之后都看了日志,能确定是启动成功得。不过这里要说的是使用jps指令能看到一个NameSrvStartup进程和两个BrokerStartup进程。
[root@dxm27 rocketmq-all-4.7.1-bin-release]# mqadmin clusterList --namesrvAddr=192.168.0.27:9876
[root@dxm24 bin]# mqadmin clusterList --namesrvAddr=192.168.0.24:9876
这个关闭服务,我就找其中一个机器一下,大家知道有这个东西就行。
[root@dxm27 bin]# mqshutdown namesrv
[root@dxm27 bin]# mqshutdown broker
从Rocket的社区扩展项目中获取一下控制台源码,然后maven打包编译,得到的jar包就是我们要的,然后运行这个jar包即可。我们在其中一台服务器上生成jar包即可。
[root@dxm27 rocketmq]# git clone https://github.com/apache/rocketmq-externals.git
[root@dxm27 rocketmq]# cd rocketmq-externals/rocketmq-console/
[root@dxm27 rocketmq-console]# mvn clean package -Dmaven.test.skip=true
看到这个就说明编译打包完成。在目录下就会多出一个target目录,cd到这个目录下就可以看到jar包。
rocketmq-console-ng-2.0.0.jar就是我们最终要的jar包。
启动之前,我们还是编写一个启动脚本,不为别的,就是为了方便自己。
把rocketmq-console-ng-2.0.0.jar拷贝到/usr/local/rocketmq-all-4.7.1-bin-release/下
[root@dxm27 target]# cp /data/rocketmq/rocketmq-externals/rocketmq-console/target/rocketmq-console-ng-2.0.0.jar /usr/local/rocketmq-all-4.7.1-bin-release/
注意: 在这个项目的application.properties中需要指定nameserver的地址,默认这个属性是空的。我们可以编辑jar包的这个配置文件,在里面配置一下属性,具体操作步骤如下:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# vim rocketmq-console-ng-2.0.0.jar
此时会列出jar里面所有的文件,需要输入/app搜索定位到application.properties配置文件,按一次回车键即可定位到这个配置文件,再按一次回车键即可编辑该配置文件,如图:
此时按i即可对配置文件进行编辑,如图:
rocketmq.config.namesrvAddr可以配置IP,也可以写域名,我们这里之前已经配置了hosts了,所以我们这里改为使用域名,这样写的好处就是以后如果IP地址变了,我们不需要再修改jar包的配置文件,只要修改/etc/hosts配置即可。
ESC,输入:wq保存即可。
[root@dxm27 rocketmq-all-4.7.1-bin-release]# java -jar rocketmq-console-ng-2.0.0.jar
[root@dxm27 target]# vim /usr/local/rocketmq-all-4.7.1-bin-release/start_console.sh
内容如下:
#!/bin/bash
nohup java -jar /usr/local/rocketmq-all-4.7.1-bin-release/rocketmq-console-ng-2.0.0.jar &
增加可执行权限:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# chmod +x start_console.sh
执行启动脚本,然后访问IP:8080
[root@dxm27 target]# sh /usr/local/rocketmq-all-4.7.1-bin-release/start_console.sh
查看进程和端口监听情况:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep java | grep console
[root@dxm27 rocketmq-all-4.7.1-bin-release]# netstat -ntlp | grep 8080
其实随着业务的发展现在会使用更多的服务器,每台服务器也会安装更多的服务,手动人为的管理效率非常低下,如果我们加入systemctl管理,那么服务的启动、停止、状态查看等就非常方便,而且为了防止断电之后,还得挨个找服务器启动对应的服务,光找哪些服务在哪些机器上部署就够麻烦的了,这样下去非常耗时,我们设置为开机自启动之后,再怎么断电也不用怕了。
我们先在192.168.0.27这台服务器上执行,然后在192.168.0.24上执行相同操作即可。
创建namesrv.service服务文件
[root@dxm27 rocketmq-all-4.7.1-bin-release]# vim /etc/systemd/system/namesrv.service
内容如下:
[Unit]
Description=rocketmq-namesrv
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User=rocketmq
Group=rocketmq
ExecStart=sh /usr/local/rocketmq-all-4.7.1-bin-release/start_rocketmq_nameserver.sh
ExecStop=/usr/local/rocketmq-all-4.7.1-bin-release/bin/mqshutdown namesrv
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl daemon-reload
因为我们在服务脚本里面指定了用户和组都是rocketmq,所以我们要修改/usr/local/rocketmq-all-4.7.1-bin-release这个目录下和/data/rocketmq/这个目录下所有文件的属组和属主,否则会因为没有权限导致无法执行。修改之前,如图:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# chown -R rocketmq.rocketmq /usr/local/rocketmq-all-4.7.1-bin-release/
[root@dxm27 rocketmq-all-4.7.1-bin-release]# chown -R rocketmq.rocketmq /data/rocketmq/
# 停止上面手动后台启动的namesrv服务
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep java | grep NamesrvStartup
root 3279 0.1 3.1 4139528 119544 pts/0 Sl 19:11 0:13 /usr/local/jdk/bin/java -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:-UseLargePages -Djava.ext.dirs=/usr/local/jdk/jre/lib/ext:/usr/local/rocketmq-all-4.7.1-bin-release/bin/../lib:/usr/local/jdk/lib/ext -cp .:/usr/local/rocketmq-all-4.7.1-bin-release/bin/../conf: org.apache.rocketmq.namesrv.NamesrvStartup
[root@dxm27 rocketmq-all-4.7.1-bin-release]# kill -9 3279
# 检查是否还存在namesrv进程
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep java | grep NamesrvStartup
# 查询所有服务单元是否有namesrv
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl list-unit-files | grep namesrv
namesrv.service disabled
# 存在,且非开启自启动,使用systemctl启动namesrv服务
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl start namesrv.service
# 查看namesrv服务状态
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl status namesrv.service
Active: active (running) 可以看到namesrv服务已经启动成功。查看进程以及端口的监听情况:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep namesrv
[root@dxm27 rocketmq-all-4.7.1-bin-release]# netstat -ntlp | grep 9876
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl list-unit-files | grep namesrv
namesrv.service disabled
# disabled表示非开机自启动
# 设置为开机自启动
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl enable namesrv.service
Created symlink /etc/systemd/system/multi-user.target.wants/namesrv.service → /etc/systemd/system/namesrv.service.
# 再次查看
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl list-unit-files | grep namesrv
namesrv.service enabled
# enabled表示是开机自启动,执行重启命令
[root@dxm27 rocketmq-all-4.7.1-bin-release]# reboot
#重启后再次查看namesrv服务已启动完成。
我们先在192.168.0.27这台服务器上执行,然后在192.168.0.24上执行相同操作即可。要注意的是两台机器的broker脚本不一样,这个在服务文件修改的时候要注意下。
这个脚本是用于合并服务器上那两个sh脚本的,这样一来服务文件里面只要执行这个脚本即可。
[root@dxm27 rocketmq-all-4.7.1-bin-release]# vim start_broker.sh
内容如下:
/usr/local/rocketmq-all-4.7.1-bin-release/start_broker_b_m.sh & /usr/local/rocketmq-all-4.7.1-bin-release/start_broker_a_s.sh
增加可执行权限:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# chmod +x start_broker.sh
创建broker.service服务文件
[root@dxm27 rocketmq-all-4.7.1-bin-release]# vim /etc/systemd/system/broker.service
内容如下:
[Unit]
Description=rocketmq-broker
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User=rocketmq
Group=rocketmq
ExecStart=sh /usr/local/rocketmq-all-4.7.1-bin-release/start_broker.sh
ExecStop=/usr/local/rocketmq-all-4.7.1-bin-release/bin/mqshutdown broker
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl daemon-reload
# 停止上面手动后台启动的broker服务
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep java | grep broker
root 3310 2.0 14.6 4857392 562184 pts/0 Sl 19:11 3:26 /usr/local/jdk/bin/java -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:/dev/shm/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking [Unit]
-Djava.ext.dirs=/usr/local/jdk/jre/lib/ext:/usr/local/rocketmq-all-4.7.1-bin-release/bin/../lib:/usr/local/jdk/lib/ext -cp .:/usr/local/rocketmq-all-4.7.1-bin-release/bin/../conf: org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-b.properties
root 3390 1.9 21.9 5901712 844260 pts/0 Sl 19:11 3:11 /usr/local/jdk/bin/java -server -Xms1g -Xmx1g -Xmn1g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1g -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:/dev/shm/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking -Djava.ext.dirs=/usr/local/jdk/jre/lib/ext:/usr/local/rocketmq-all-4.7.1-bin-release/bin/../lib:/usr/local/jdk/lib/ext -cp .:/usr/local/rocketmq-all-4.7.1-bin-release/bin/../conf: org.apache.rocketmq.broker.BrokerStartup -c /usr/local/rocketmq-all-4.7.1-bin-release/conf/2m-2s-async/broker-a-s.properties
[root@dxm27 rocketmq-all-4.7.1-bin-release]# kill -9 3310
[root@dxm27 rocketmq-all-4.7.1-bin-release]# kill -9 3390
# 检查是否还存在broker进程
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep java | grep broker
# 查询所有服务单元是否有broker
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl list-unit-files | grep broker
broker.service disabled
# 存在,且非开启自启动,使用systemctl启动broker服务
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl start broker.service
# 查看broker服务状态
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl status broker.service
Active: active (running) 可以看到broker服务已经启动成功。查看进程以及端口的监听情况:
[root@dxm27 rocketmq-all-4.7.1-bin-release]# ps aux | grep java | grep broker
[root@dxm27 rocketmq-all-4.7.1-bin-release]# netstat -ntlp | grep 10911
[root@dxm27 rocketmq-all-4.7.1-bin-release]# netstat -ntlp | grep 10921
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl list-unit-files | grep broker
broker.service disabled
# disabled表示非开机自启动
# 设置为开机自启动
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl enable broker.service
Created symlink /etc/systemd/system/multi-user.target.wants/broker.service → /etc/systemd/system/broker.service.
# 再次查看
[root@dxm27 rocketmq-all-4.7.1-bin-release]# systemctl list-unit-files | grep broker
broker.service enabled
# enabled表示是开机自启动,执行重启命令
[root@dxm27 rocketmq-all-4.7.1-bin-release]# reboot
#重启后再次查看broker服务已启动完成。
rocketmq默认情况下配置的内存都太大,不适合在开发测试环境中使用,所以我们需要根据自己服务器的配置情况适当的调低JVM。主要是修改runbroker.sh里面的参数。
本机明明已经安装了jdk,并且也配置了环境变量,依然提示这个错误信息。
解决方法: 运行which java来查看java的路径,比如为/usr/local/jdk/bin/java。
修改bin/runserver.sh和bin/runbroker.sh和bin/tools.sh,注释掉校验JAVA_HOME语句,并明确指定JAVA路径:
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
#[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
#export JAVA_HOME
export JAVA="/usr/local/jdk/bin/java"
Broker 重启可能会导致正在发往这台机器的的消息发送失败,RocketMQ提供了一种优雅关闭Broker的方法,通过执行以下命令会清除Broker的写权限,过40s后,所有客户端都会更新Broker路由信息,此时再关闭Broker就不会发生发送消息失败的情况,因为所有消息都发往了其他 Broker。
[root@dxm27 rocketmq-all-4.7.1-bin-release]# sh mqadmin wipeWritePerm -b brokerName -n namesrvAddr