rocketmq-手把手搭建集群模式(二)

本文详细介绍了RocketMQ的集群搭建过程,包括NameServer、Producer、Broker、Consumer的角色,以及各种集群模式,如单master、多master、多master多slave(异步、同步)。还探讨了RocketMQ与其他主流MQ产品的优缺点,并提供了具体的配置和启动步骤,强调了高可用性和消息可靠性的重要性。
摘要由CSDN通过智能技术生成

系列文章目录

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)各自的优缺点

特性ActiveMQRabbitMQRocketMQkafka
单机吞吐量万级万级10万级10万级 。一般配合大数据类的系统来进行实时数据计算、日志采集等场景
topic数量对吞吐量的影响topic可以达到几百,几千个的级别,吞吐量会有较小幅度的下降这是RocketMQ的一大优势,在同等机器下,可以支撑大量的topictopic从几十个到几百个的时候,吞吐量会大幅度下降所以在同等机器下,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角色、端口架构模式
1192.168.149.28Nameserver-9876、brokerMaster1、slave2
2192.168.149.29Nameserver-9876、brokerMaster2、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,如果没有添加即可,搞定。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值