系列文章目录
rocketmq-安装篇(一)
rocketmq-手把手搭建集群模式(二)
rocketmq-各类型消息实战(三)
rocketmq-名词解释(四)
rocketmq-消息存储(五)
前言
前一章我们简单安装和部署了rocketmq 相关服务及测试了一下发送和接收信息。从这章开始我们进入rocketmq知识点的学习。
jms (java message queue )只是定义了消息接口规范(它也有自己实现一套,只是比较难用);rocketmq并没有严格遵循jms规范;
消息队列:从广义上讲是一种消息队列服务中间件,提供一套完整的信息生产、传递、消费的的软件系统。
一 rocketmq 及其他mq产品特点
github 源码 :https://github.com/apache/rocketmq-externals
1.1rocketmq场景及优缺点
场景:
- 1.削峰:当系统流量处在高峰期时,将数据先暂存,利用这个缓冲机制,再慢慢处理。
例如:电商在搞活动时,可能会发生流量陡增的情况,如果直接通过程序连接数据库进行操作,可能会导致数据库负载很高,出现假死或者崩溃的现象。而引入mq就可以把请求暂存到mq中,起到一个缓冲池的作用,程序可以再慢慢的处理。 - 2.解耦:低耦合或者跨系统的业务可以通过mq中转解耦。解耦带来的好处就是:提高系统的可扩展性
例如:在京东下单时,后续的操作会涉及订单系统、库存系统、通知系统、物流系统等等。如果通过网关系统直接一个个系统对接,这样系统间的耦合性太强,一不利于业务的扩展、二影响系统稳定性会。我们就可以在网关和各个子系统间加入一层mq,通过mq来中转消息。好比你盖房子,不用自己去对接电工、瓦工等,直接找个监工,你把活儿安排给他就行,省心省力, - 3.消息分发:发送消息给多个接收端接收。(异步、数据一致性等)
例如:当用户注册时,需要给用户发送奖励,之前通过只是发给了积分系统,现在要增加奖券的奖励。这个时候你再去更改系统业务逻辑太麻烦了,通过引入mq层,就可以动态的调整奖励相关的子系统,而不主要业务主系统做调整。
缺点:
- 降低了系统的可用性,
系统引入了外部依赖越多,系统稳定性越差,一旦MQ宕机,就会对业务造成影响
问题: 如何提供系统可用性? - 系统复杂度提高
MQ的加入大大的增加了系统的复杂度,以前系统间是同步的远程的调用,现在是通过MQ进行异步调用。
问题: 如何保证消息没有被重复消费?怎么处理消息丢失情况?如何保证消息的顺序性? - 一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发送消息,如果B、C系统处理成功,D系统处理失败
问题: 如何保证消息数据处理的一致性?
1.2四大主流MQ(kafka、ActiveMQ、RabbitMQ、RocketMQ)各自的优缺点
特性 | ActiveMQ | RabbitMQ | RocketMQ | kafka |
---|---|---|---|---|
单机吞吐量 | 万级 | 万级 | 10万级 | 10万级 。一般配合大数据类的系统来进行实时数据计算、日志采集等场景 |
topic数量对吞吐量的影响 | topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topic | topic从几十个到几百个的时候,吞吐量会大幅度下降所以在同等机器下,kafka尽量保证topic数量不要过多。如果要支撑大规模topic,需要增加更多的机器资源 | ||
时效性 | ms级 | 微秒级,这是rabbitmq的一大特点,延迟是最低的 | ms级 | 延迟在ms级以内 |
可用性 | 高,基于主从架构实现高可用性 | 高,基于主从架构实现高可用性 | 非常高,分布式架构 | 非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
消息可靠性 | 有较低的概率丢失数据 | 经过参数优化配置,可以做到0丢失 | 经过参数优化配置,消息可以做到0丢失 | |
功能支持 | MQ领域的功能极其完备 | 基于erlang开发,所以并发能力很强,性能极其好,延时很低 | MQ功能较为完善,还是分布式的,扩展性好 | 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
优劣势总结 | 社区不活跃、更新慢、未经过大规模吞吐场景验证 | 基于erlang语言,基本是不可控状态。当稳定、活跃度高 | 阿里开源,基于java开发,应用简单,大规模吞吐,性能也非常好,分布式扩展也很方便,越来越多公司在用 | 基于 scala 语言,如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高。kafka唯一的一点劣势是有可能消息重复消费, |
二 集群搭建
2.1角色介绍
Nameserver:管理broker ,通过它知道从哪个broker读写数据。
Producer:生产者,发送消息
Broker:master slave ,负责消息存储、投递、查询
Consumer:消费者,消费消息
Topic:对消息进行分类,一个Producer可以发送消息给一个或者多个Topic,一个Consumer可以订阅一个或者多个Topic消息
Message Queue:相当于Topic 的分区,用于并行发送和接收消息。(同一个Topic 的消息,可以发送到多个Queue里面)
2.2集群特点
- Nameserver 集群无状态,每个nameserver数据是一样的,之间不需要通信
- Producer 集群直接启动即可。producer和nameserver集群中的其中一个节点(随机连接)建立长连接,定期从nameserver拉取topic信息,并向提供topic服务的master建立长连接,且定时向master发送心跳。producer完全无状态,可集群部署
- Broker 分maser、slave,一个master 可以对应多个slave,一个slave只能从属于一个master。master和slave是通过在broker.conf 指定相同的BrokerName、不同的brokerId来定义。brokerId为0表示master,非0为slave。master也可以部署多个,每个broker与nameserver集群中的所有节点建立长连接,定时注册topic信息到所有的nameserver,
- Consumer与nameserver集群中的其中一个节点(随机连接)建立长连接,定期从nameserver拉取topic信息,并向提供topic服务的master、slave建立长连接,且定时向master、slave发送心跳。consumer就可以从master订阅消息,也可以从slave订阅消息,订阅规则由broker配置决定
2.3集群模式
2.3.1单master模式
- 风险较大,一旦broker重启或宕机时,会导致这个那个服务不可用。不建议线上环境部署
2.3.2多master模式
一个集群无slave,全是master,例如2个master,这种模式优缺点如下:
- 优点:配置简单,单个master宕机或重启对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢失(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高
- 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复 之前不可订阅,消息实时性会受到影响。
2.3.3多master模式多slave模式-异步
每个master配置一个slave,有多对master-slave,producer把消息发送master落盘后,直接给producer返回成功,master再同步到slave,性能高。HA采用异步复制方式,主备有短暂消息延迟(毫秒级)。配置项: flushDiskType = ASYNC_FLUSH
- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受到影响,同时master宕机后,消费者仍然可以从slave消费,而且此过程对应用透明,不需要人工干涉,性能同多master模式几乎一样。
- 缺点:master宕机,磁盘损坏情况下会丢失少量消息
2.3.4多master模式多slave模式-同步
每个master配置一个slave,有多对master-slave,producer把消息发送master落盘后,master再同步到slave后,再给producer返回成功,安全性高。HA采用同步双写方式,即只有主备都写成功,才向producer返回成功。配置项: flushDiskType = SYNC_FLUSH
- 优点:数据与服务都无单点故障,master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高。
- 缺点:性能比异步复制模式略低(大约10%左右),发送单个消息的RT(响应时长)会略高,目前版本在主节点宕机后,备机不能自动切换为主机。
1)启动NameServer
### 首先启动Name Server
$ nohup sh mqnamesrv &
### 验证Name Server 是否启动成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
2)启动Broker集群
### 在机器A,启动第一个Master broker-a ,例如NameServer的IP为:192.168.149.28
$ nohup sh mqbroker -n 192.168.149.28:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &
### 在机器B,启动第二个Master broker-b ,例如NameServer的IP为:192.168.149.28
$ nohup sh mqbroker -n 192.168.149.28:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &
### 在机器C,启动第一个Slave broker-a ,例如NameServer的IP为:192.168.149.28
$ nohup sh mqbroker -n 192.168.149.28:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &
### 在机器D,启动第二个Slave broker-b ,例如NameServer的IP为:192.168.149.28
$ nohup sh mqbroker -n 192.168.149.28:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &
2.4双主双从异步集群模式
2.4.1工作流程
双主双从架构图:
- 1、启动NameServer,NameServer起来后监听开始,等Broker、Producer、Consumer连上来,相当于一个路由控制中心。每10S检查一下Broker的心跳,超过120s没有心跳剔除该Broker
- 2、Broker启动之后,跟所有的Nameserver保持长连接,定时30s发送一次心跳包,心跳包中包含当前Broker信息(ip、port等)、Topic信息以及Borker与Topic的映射关系,。注册成功后,Nameserver集群中就有Topic和Broker的映射关系。
- 3、收发消息前,先创建Topic。创建时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic
- 4、Producer发送消息。启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker;从队列列表中轮询选择一个队列??,与队列所在的master Broker建立长连接,进行消息的发送 。定时从Nameserver拉取topic信息;和提供服务的Master建立长连接且定时发送心跳
- 5、Consumer消费消息。跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,进行消息的消费。定时从Nameserver拉取topic信息;和提供服务的Master、Slave 分别建立长连接且定时发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
2.4.2服务器环境
序号 | ip | 角色、端口 | 架构模式 |
---|---|---|---|
1 | 192.168.149.28 | Nameserver-9876、broker | Master1、slave2 |
2 | 192.168.149.29 | Nameserver-9876、broker | Master2、slave1 |
2.4.3host 添加信息
vi /etc/hosts
配置如下:
##--nameserver
192.168.149.28 rocketmq-nameserver1
192.168.149.29 rocketmq-nameserver2
##--broker
192.168.149.28 rocketmq-master1
192.168.149.28 rocketmq-master1-slave1
192.168.149.29 rocketmq-master2
192.168.149.29 rocketmq-master2-slave1
重启网卡:
#centos6的网卡重启方法:
service network restart
#centos7的网卡重启方法:
systemctl restart network
2.4.3host 防火墙配置:
宿主机需要远程访问虚拟机rocketmq服务和web服务,需要开放相关端口,简单粗暴的方式是直接关闭防火墙--注意linux版本#########################Centos 7
# 关闭防火墙
systemctl stop firewalld.service
# 查看防火墙的状态(关闭后显示notrunning,开启后显示running)
firewall-cmd --state
# 禁止firewall开机启动
systemctl disable firewalld.service
#重启firewall
firewall-cmd --reload
#########################Centos 7以下
#需要借助 iptables 命令实现,自己bd吧
或者为了安全,只开放特定的端口号,RocketMQ默认使用3个端口:9876 、10911 、11011 。如果防火墙没有关闭的话,那么防火墙就必须开放这些端口:
- nameserver 默认使用 9876 端口
- master 默认使用 10911 端口
- slave 默认使用11011 端口 (此版本4.2.0,经检事件发现默认10911)
执行以下命令:
# 开放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
2.4.4配置环境变量
为了方便操作rocketmq bin的命令,添加下环境变量,
########1、vi /etc/profile
# rocketmq env
export ROCKETMQ_HOME=/usr/local/rocketmq/rocketmq-release-4.2.0-bin-release
export PATH=$PATH:$ROCKETMQ_HOME/bin
########2、配置完成后,刷新配置生效:
source /etc/profile
2.4.5创建消息存路径
消息持久化默认在/root/store 下,重新配置下路径
# node1
mkdir -p /usr/local/rocketmq/store/master1
mkdir -p /usr/local/rocketmq/store/master1/commitlog
mkdir -p /usr/local/rocketmq/store/master1/consumequeue
mkdir -p /usr/local/rocketmq/store/master1/index
mkdir -p /usr/local/rocketmq/store/master2-slave1
mkdir -p /usr/local/rocketmq/store/master2-slave1/commitlog
mkdir -p /usr/local/rocketmq/store/master2-slave1/consumequeue
mkdir -p /usr/local/rocketmq/store/master2-slave1/index
# node2
mkdir -p /usr/local/rocketmq/store/master2
mkdir -p /usr/local/rocketmq/store/master2/commitlog
mkdir -p /usr/local/rocketmq/store/master2/consumequeue
mkdir -p /usr/local/rocketmq/store/master2/index
mkdir -p /usr/local/rocketmq/store/master1-slave1
mkdir -p /usr/local/rocketmq/store/master1-slave1/commitlog
mkdir -p /usr/local/rocketmq/store/master1-slave1/consumequeue
mkdir -p /usr/local/rocketmq/store/master1-slave1/index
2.4.6broker配置
2.4.6.1 master1的配置
node1(192.168.149.28)
vi /usr/local/rocketmq/conf/2m-2s-sync/master1.properties
配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,多个之间用分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2: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=/usr/local/rocketmq/store/master1
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/master1/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/master1/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/master1/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/master1/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/master1/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=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
2.4.6.2 master1-slave1的配置
node2(192.168.149.29)
vim /usr/local/rocketmq/conf/2m-2s-sync/master1-slave1.properties
配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2: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=/usr/local/rocketmq/store/master1-slave1
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/master1-slave1/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/master1-slave1/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/master1-slave1/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/master1-slave1/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/master1-slave1/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
2.4.6.3 master2的配置
node2(192.168.149.29)
vim /usr/local/rocketmq/conf/2m-2s-sync/master2.properties
配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2: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
#存储路径(注意,如果在一台机器上启动多个broker,这个路径要区分开)
storePathRootDir=/usr/local/rocketmq/store/master2
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/master2/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/master2/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/master2/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/master2/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/master2/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=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
2.4.6.4master2-slave1的配置
node1(192.168.149.28)
vim /usr/local/rocketmq/conf/2m-2s-sync/master2-slave1.properties
配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2: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=/usr/local/rocketmq/store/master2-slave1
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/master2-slave1/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/master2-slave1/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/master2-slave1/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/master2-slave1/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/master2-slave1/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
2.4.7修改启动脚本
根据实际情况,修改/bin/runbroker.sh和/bin/runserver.sh脚本的JVM参数,参考配置如下:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
2.4.8启动服务
2.4.8.1启动NameServer集群
分别在两台机器上启动NameServer服务:
###默认端口 9876
nohup sh bin/mqnamesrv &
#####自定义端口 ######################################################
##1、新建一个配置文件namesrv.properties,配置如下:
listenPort=9877
##2、启动
nohup sh bin/mqnamesrv -c namesrv.properties &
2.4.8.2启动Broker集群
在node1上启动master1和master2-slave1:
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master1.properties &
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master2-slave1.properties &
在node2上启动master2和master1-slave2:
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master2.properties &
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-sync/master1-slave1.properties &
2.4.8.3查看进程状态
启动后通过jps命令查看进程状态,至此一个双主双从,同步双写的集群搭建完成。
2.4.8.4查看日志
根据conf下的logback.xml,查看日志目录,
# namesrv 默认是${user.home}/logs/rocketmqlogs/namesrv.log
tail -200f namesr.log
# broker 默认在 /data/logs/rocketmqlogs下面
tail -200f broker.log
2.4.9监控平台搭建
根据上一批文章【深入浅出rocketmq-安装篇(一)】,调下nameserver配置(rocketmq.config.namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876),重新部署即可。
2.5.0问题
1、在未配置自定义端口情况下下,一个节点启动第二个broker时,报java.net.BindException: Address already in use… …
答:之前以为master和slave broker都有自定义的端口,本人使用的是rocketmq-release-4.2.0版本,可能是版本有关系,经实践,发现4.2.0版本主从broker的版本都是10911。可以listenPort=11011指定下端口。
2、Local host name unknown: java.net.UnknownHostException: bogon: bogon: Name or service not known
答:这个跟节点的hostname有关系,此节点hostname为bogon。此时需要看下/etc/hosts 里面是有配置此hostname,如果没有添加即可,搞定。