linux安装RocketMQ
前提条件:RocketMQ是基于java语言开发的。运行RocketMQ需要java环境。JDK的版本应该 >= 1.8。请确保安装了JDK。
查看方式:
[root@iZuf6j6c7vo33inl2830e3Z rocketmq]# java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
本人用的是阿里云服务器。JDK版本是1.8,maven版本是3.6.3
一、下载RocketMQ
该地址列出了RocketMQ所有发布的版本:https://archive.apache.org/dist/rocketmq/
这里将RocketMQ安装到Linux文件系统的/usr/java/rocketmq目录
cd /usr/java/rocketmq
下载之后进行解压缩:
unzip rocketmq-all-4.8.0-bin-release.zip
这边将目录名字修改一下,解压完毕也就不需要了,删除zip包
rm -rf rocketmq-all-4.8.0-bin-release.zip
mv rocketmq-all-4.8.0-bin-release rocketmq
解压目录说明
rocketmq
├── benchmark #性能测试脚本
├── bin #命令行工具
├── conf #配置文件目录
├── lib #依赖的第三方类库
├── LICENSE
├── NOTICE
└── README.md
二、启动RocketMQ
2.1 启动NameServer
启动NameServer
nohup sh bin/mqnamesrv >/dev/null &
查看NameServer启动日志
tail -500f ~/logs/rocketmqlogs/namesrv.log
2.2 启动Broker
启动broker
nohup sh bin/mqbroker -n localhost:9876 >/dev/null &
查看Broker启动日志
tail -500f ~/logs/rocketmqlogs/broker.log
2.3 启动失败内存问题解决
这里发现会由于内存不足启动失败
RocketMQ默认的虚拟机内存较大,启动NameServer和Broker如果因为内存不足失败,需要编辑如下两个配置文件,修改JVM内存大小
# 编辑runbroker.sh和runserver.sh修改默认JVM大小 vi runbroker.sh vi runserver.sh
参考设置:
JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx128m -Xmn64m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m"
改完保存重新启动即可。查看启动日志验证是否成功。
也可以通过jps- l 来验证
[root@iZuf6j6c7vo33inl2830e3Z rocketmq]# jps -l
20358 org.apache.rocketmq.broker.BrokerStartup
19965 org.apache.rocketmq.namesrv.NamesrvStartup
22349 sun.tools.jps.Jps
2.4 测试RocketMQ
发送消息:使用安装包的Demo发送消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
接收消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
2.5 关闭RocketMQ
关闭NameServer
sh bin/mqshutdown namesrv
关闭Broker
sh bin/mqshutdown broker
三、RocketMQ集群搭建
一个完整的RocketMQ集群由NameServer集群,Broker集群,Producer集群,Consumer集群组成。本节主要介绍NameServer集群,Broker集群的搭建。
NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
3.1 集群模式
1)单Master模式
这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。
2)多Master模式
一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:
- 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
- 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
3)多Master多Slave模式(异步)
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
- 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
4)多Master多Slave模式(同步)
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
- 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
- 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
3.2 环境变量配置
vim /etc/profile
在profile文件的末尾加入如下命令
#set rocketmq
ROCKETMQ_HOME=/usr/java/rocketmq
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH
输入:wq! 保存并退出, 并使得配置立刻生效:
source /etc/profile
3.3 防火墙配置
宿主机需要远程访问虚拟机的rocketmq服务和web服务,需要开放相关的端口号,简单粗暴的方式是直接关闭防火墙
# 关闭防火墙
systemctl stop firewalld.service
# 查看防火墙的状态
firewall-cmd --state
# 禁止firewall开机启动
systemctl disable firewalld.service
或者为了安全,只开放特定的端口号,RocketMQ默认使用3个端口:9876 、10911 、11011 。如果防火墙没有关闭的话,那么防火墙就必须开放这些端口:
nameserver
默认使用 9876 端口master
默认使用 10911 端口slave
默认使用11011 端口
执行以下命令:
# 开放name server默认端口
firewall-cmd --remove-port=9876/tcp --permanent
# 开放master默认端口
firewall-cmd --remove-port=10911/tcp --permanent
# 开放slave默认端口 (当前集群模式可不开启)
firewall-cmd --remove-port=11011/tcp --permanent
# 重启防火墙
firewall-cmd --reload
3.3 单Master模式
3.3.1 创建消息存储路径
系统根目录执行一下命令,如果使用默认的存储路径,这个可以忽略不进行配置
cd /
mkdir -p /data/rocketmq/single-master/broker-a/store
mkdir -p /data/rocketmq/single-master/broker-a/store/commitlog
mkdir -p /data/rocketmq/single-master/broker-a/store/consumequeue
mkdir -p /data/rocketmq/single-master/broker-a/store/index
mkdir -p /data/rocketmq/single-master/broker-a/store/checkpoint
mkdir -p /data/rocketmq/single-master/broker-a/store/abort
3.3.2 修改broker配置文件
vi /usr/java/rocketmq/conf/broker.conf
#所属集群名字
brokerClusterName=single-master
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=公网IP:9876
# 你的公网IP
brokerIP1=公网IP
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=48
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#限制的消息大小
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=18
#拉消息线程池数量
pullMessageThreadPoolNums=18
3.3.3 启动
启动NameServer
nohup sh bin/mqnamesrv >/dev/null &
查看NameServer启动日志
tail -500f ~/logs/rocketmqlogs/namesrv.log
启动broker
nohup sh bin/mqbroker -c conf/broker.conf >/dev/null &
查看Broker启动日志
tail -500f ~/logs/rocketmqlogs/broker.log
关闭NameServer
sh bin/mqshutdown namesrv
关闭Broker
sh bin/mqshutdown broker
注意:broker启动时不会读取broker.conf中的配置,尽管也可以启动,但是如果需要使得配置文件生效,必须通过-c参数进行指定。
验证启动成功
[root@iZuf6j6c7vo33inl2830e3Z spring-application-jar]# jps -l
1354 org.apache.rocketmq.namesrv.NamesrvStartup
1739 org.apache.rocketmq.broker.BrokerStartup
[root@iZuf6j6c7vo33inl2830e3Z spring-application-jar]#
3.3.4 查看集群列表信息(集群中使用)
$ sh bin/mqadmin clusterList -n 公网ip:9876
#Cluster Name #Broker Name #BID #Addr #Version #...(略)
single-master broker-a 0 192.168.1.3:10911 V4_6_0 …
输出的每一列说明如下:
- Cluster Name:集群的名称,即brokerClusterName配置项的值
- Broker Name:Broker的名称,即brokerName配置项的值
- BID:Broker的ID,这里显示为0,即brokerId配置项的值
- Addr:监听的IP/端口,供生产者/消费者访问,端口即listenPort配置项的值
- Version:broker的版本
四、RocketMQ控制台安装
下载代码并编译打包
git clone https://github.com/apache/rocketmq-externals
cd rocketmq-console
mvn clean package -Dmaven.test.skip=true
注意:打包前在rocketmq-console
中配置namesrv
集群地址:
rocketmq.config.namesrvAddr=公网ip:9876
最好将server.port也修改一下。默认是8080。
上传到linux服务器任意一个目录。
启动rocketmq-console:注意jar包的名称需要改为自己的jar包名称
nohup java -jar -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -Xms128m -Xmx128m -Xmn32m rocketmq-console-ng-1.0.0.jar >/dev/null &
启动成功后,我们就可以通过浏览器访问:http://公网ip:port
五、遇到的问题
启动broker失败
2020-8-24 13:11:11 INFO main - Try to shutdown service thread:AllocateMappedFileService started:true lastThread:Thread[AllocateMappedFileService,5,main] 2020-8-24 13:11:11 INFO main - shutdown thread AllocateMappedFileService interrupt true 2020-8-24 13:11:11 INFO main - join thread AllocateMappedFileService elapsed time(ms) 5 90000 2020-8-24 13:11:11 INFO main - Try to shutdown service thread:PullRequestHoldService started:false lastThread:null
解决原因:将broker的存储路径storePathRootDir给注释掉。使用broker默认的存储路径(/root/store)。
可以临时解决一下。这不是很好的解决方案。具体原因未找出来。
producer没有连接上broker
com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <127.0.0.1:9876> failed
这个修改broker的配置文件。需要修改两个参数
# 你的公网IP namesrvAddr=公网ip:9876 # 你的公网IP,不指定就是127.0.0.1。而127.0.0.1在外网环境中无法访问。 brokerIP1=公网ip
rocketmq控制台也是如此。需要指定namesrvAddr的外网ip。