一、RocketMQ介绍
(最开始RocketMQ是阿里研究出来的,在2016-11-28捐赠给了开源软件基金会Apache。)
1.1. 简介
RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力
选用理由:
强调集群无单点,可扩展,任意一点高可用,水平可扩展。
海量消息堆积能力,消息堆积后,写入低延迟。
支持上万个队列
消息失败重试机制
消息可查询
开源社区活跃
成熟度(经过双十一考验)
1.2 关键概念
1.2.1. 主题与标签
主题Tpoic:第一级消息类型,书的标题 标签Tags:第二级消息类型,书的目录,可以基于Tag做消息过滤
例如:
主题:
订单交易 标签:
订单交易-创建
订单交易-付款
订单交易-完成
1.2.2. 发送与订阅群组
生产组:用于消息的发送。
消费组:用于消息的订阅处理。
生产组和消费组,方便扩缩机器,增减处理能力,集群组的名字,用于标记用 途中的一员。每次只会随机的发给每个集群中的一员。
RocketMQ的集群方式 和优缺点如下:
1、单机模式 (配置简单,单master宕机后未恢复前消息不可发送、订阅和消费,整个系统都瘫痪了,风险较大)
2、多master (配置简单,磁盘配置raid10,单master宕机未恢复前消息不可订阅和消费)
3、多master多slave异步复制(即使磁盘村怀,消息丢失非常少,消息可以通过slave来消费)
4、多master多slave同步双写(性能相对3下降10%,消息不会丢失,应用最广)
二、双主双从模式的配置
配置rocketmq前请确保所有机器都已经安装jdk,本文介绍的是apache版本的rocketmq4.2.0版本的双主双从模式的配置以及rocketmq-console监控部署,不适于alibaba版本。
1、服务器环境
ip 角色 模式
10.1.101.3 broker-a NameServer,Broker Master
10.1.101.7 broker-b NameServer,Broker Master
10.1.101.8 broker-a-s NameServer,Broker Slave
10.1.101.9 broker-a-s NameServer,Broker Slave
2、Host添加信息
四台机器执行:
# vi /etc/hosts
设置四台机器的hosts文件如下:
10.1.101.3 mqnameserver1
10.1.101.7 mqnameserver2
10.1.101.8 mqnameserver3
10.1.101.9 mqnameserver4
10.1.101.3 broker-a
10.1.101.7 broker-b
10.1.101.8 broker-a
10.1.101.9 broker-b
重启网卡:
# service network restart
相互ping一下;
然后就是将RocketMQ的压缩包进行解压,
先创建存放解压文件的目录:
# mkdir /usr/local/rocketmq-4.2.0
从rocketmq官网下载的rocketmq-all-4.2.0-bin-release.zip按照官网的流程通过解压编译后,将rocketmq-all-4.2.0/distribution/target/apache-rocketmq.tar.gz文件上传到四台服务器:
进入该文件的目录下,比如:
# cd /home/sovinchan
解压到/usr/local/rocketmq-4.2.0目录下,
#tar -zvxf apache-rocketmq.tar.gz -C /usr/local/rocketmq-4.2.0
并创建软连接
# ln -s rocketmq-4.2.0 rocketmq
3、创建数据存储路径(四台机器都要创建)
我是直接在软连接的目录下来存储产生的数据的,因此进入到/recoketmq目录下
# cd /usr/local/rocketmq
# mkdir data
# mkdir data/commitlog
# mkdir data/consumerqueue
# mkdir data/index
4、修改RocketMQ的配置文件:
配置文件位置:
# cd /usr/local/rocketmq/conf/2m-2s-async/
对应的ip的机器修改对应的配置文件:
10.1.101.3 broker-a.properties
10.1.101.7 broker-b.properties
10.1.101.8 broker-a-s.properties
10.1.101.9 broker-b-s.properties
比如将10.1.101.3的机器修改成如下内容:
# vi broker-a.properties
#所属集群名字 自定义
brokerClusterName=rocketmq-cluster
#broker名字,不同配置文件不同(主节点和从节点一致)
brokerName=broker-a
#0表示Master >0表示Slave
brokerId=0
#删除文件时间点 默认为0点
deleteWhen=04
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
# 刷盘方式:ASYNC_FLUSH 异步刷盘 SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#nameServer地址,分号分割
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876;mqnameserver3:9876;mqnameserver4:9876
#brokerIP
brokerIP1=10.1.101.3
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
#listenPort=10911
rejectTransactionMessage=false
fetchNamesrvAddrByAddressServer=false
#存储路径
storePathRootDir=/usr/local/rocketmq/data
#消费队列存储路径存储路径
storePathCommitLog=/usr/local/rocketmq/data/commitlog
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/data/index
#刷新commitlog间隔时间
flushIntervalCommitLog=1000
flushCommitLogTimed=false
#文件保存时间 默认为48小时
fileReservedTime=72
maxTransferBytesOnMessageInMemory=262144
maxTransferCountOnMessageInMemory=32
maxTransferBytesOnMessageInDisk=65536
maxTransferCountOnMessageInDisk=8
accessMessageInMemoryMaxRatio=40
messageIndexEnable=true
messageIndexSafe=false
haMasterAddress=
cleanFileForciblyEnable=true
其中不同机器需要分别配置的项:
(1) brokerId=0表示是master,大于0则表示是slave;
(2) brokerName=broker-a要对应;在10.1.101.3 机器上是broker-a,在10.1.101.7 上则是broker-b,在10.1.101.8上为broker-a-s,在10.1.101.9上为broker-b-s,
(3)brokerRole=,两个主机设置为:ASYNC_MASTER,两个从机为:SLAVE,一定不要弄错
(4)brokerIP1=10.1.101.3 对应ip的机器设置成对应的ip
5、修改日志配置文件
在创建的软连接文件夹rocketmq下创建一个logs目录
# mkdir /usr/local/rocketmq/logs
然后执行
# cd /usr/local/rocketmq/conf && sed -i 's#${user.home}#/usr/local/rocketmq#g' *.xml
进行日志文件的替换,sed是linux的替换命令。四台机器同样操作。
6、修改启动脚本参数(JVM参数的调优,生产环境默认即可不要修改!!!)
因为我们之前将nameServer和broker放在了同一台机器上,所以需要分别对nameServer和broker进行jvm的性能调优。生产环境默认即可不要修改。
1)broker的调优
# vi /usr/local/rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m - XX:PermSize=128m -XX:MaxPermSize=320m"
2)nameserver的调优
# vi /usr/local/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m - XX:PermSize=128m -XX:MaxPermSize=320m"
7、启动两台机器的NameServer:先启动四台机器的NameServer,再启动四台机器的Borker,关机的时候顺序相反,先关闭四台机器的Broker,再关闭四台机器的Nameserver。
# cd /usr/local/rocketmq/bin
# nohup sh mqnamesrv &
上面这条命令nohup是起一个守护线程。
查看进程:
#jps
查看namesrv日志:
# tail -f /usr/local/rocketmq/logs/rocketmqlogs/namesrv.log
8、启动Broker:
10.1.101.3:
# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties &
10.1.101.7:
# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b.properties &
10.1.101.8:
# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties &
10.1.101.9
# nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-b-s.properties &
查看进程:
# jps
查看broker日志:
# tail -f /usr/local/rocketmq/logs/rocketmqlogs/broker.log
9、停止服务,与启动时顺序相反,先停broker,再停NameServer
停止broker
# ./mqshutdown broker
停止NameServer
# ./mqshutdown namesrv
二、rocketmq-console搭建
rocketmq-console是一个用于监控rocketmq的springboot搭建的web项目,界面效果如下:
github地址为:https://github.com/apache/rocketmq-externals
1、下载zip文件后解压,然后修改配置文件,使管理界面与rocketmq集群产生关联。
rocketmq-externals-master/rocketmq-console/src/main/resources/application.properties
修改内容及修改结果如下图所示(只需修改一项:rocketmq.config.namesrvAddr):
2、编译rocketmq-console(建议在已安装maven的linux环境下编译,在windows中我没编译成功,暂时没找到原因)
先进入rocketmq-console目录下
# cd /home/ss/rocketmq-console
编译命令
# mvn clean package -Dmaven.test.skip=true(注意:不要直接使用mvn package,会提示很多错误)
3、将rocketmq-console/target 目录下的rocketmq-console-ng-1.0.0.jar复制或者上传到自定义的一个目录,比如
# mv rocketmq-console-ng-1.0.0.jar /home/jar
因为是springboot项目,自带有tomcat,直接运行即可
# cd /home/jar
4、运行jar包
# nohup java -jar rocketmq-console-ng-1.0.0.jar &
这里用的是守护进程方式启动的jar包,即使关闭窗口jar包也不会停止运行
5、使用浏览器访问管理界面,地址为:ip地址+8080端口号
6、可能遇到的问题
画面可以正常启动,不过从控制台的监控日志上看,存在如下的错误日志。
org.apache.rocketmq.remoting.exception.RemotingTimeoutException: wait response on the channel <192.168.1.80:10918> timeout, 5000(ms)
原因是isVIPChannel默认为true,会监控rocketmq的vip通道,将该属性设置为false即可。
设置后的配置文件如下所示:
server.contextPath=
server.port=8080
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=10.1.101.3:9876;10.1.101.7:9876;10.1.101.8:9876;10.1.101.9:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=false
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/usr/local/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true