一、理论垫基础

在上一期中我们提到了RocketMQ的一些基础知识,在本篇博客中基于理论实战部署一下吧~
在这里插入图片描述
由RocketMQ网络部署图得知,RocketMQ中主要涉及到四种角色:NameServer注册服务器、Broker服务器、Producer生产者、Consumer消费者。每种角色都可以单独搭建集群,下面我们详细介绍一个NameServer集群、Broker集群、Producer集群、Consumer集群。

1. NameServer 集群

NameServer通常会有多个实例部署,不过 NameServer 是无状态的,即 NameServer 集群中的各个节点间是无差异的,各节点间相互不进行信息通讯。在 NameServer 内部维护着一个 Broker 列表,用来动态存储 Broker的信息。当 Broker 节点启动时,会轮询 NameServer 列表,与每个 NameServer 节点建立长连接,并发起 注册请求。所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,客户端仍然可以向其它NameServer获取路由信息。

2. Producer集群

Producer 与 NameServer集群中的其中一个节点(随机选择)建立长连接,定期从 NameServer 取 Topic 路由信息,并向提供 Topic 服务的 Master 建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。

3. Consumer集群

Consumer 与 NameServer 集群中的其中一个节点(随机选择)建立长连接,定期从 NameServer 取 Topic 路由信息,并向提供 Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定。

4. Broker集群

对于整个RocketMQ集群的部署,Name server、producer、consumer之间都是无状态的,集群中的每个节点都是一样的。

Broker 的部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master与Slave的对应关系通过指定相同的BrokerName,即多个节点指定相同的BrokerName表示是同一组的。节点的区分是由不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定期注册Topic信息到所有NameServer。

4.1 节点间数据同步 以及 消息的持久化

在这里插入图片描述

复制策略

既然 Broker 分为主从节点,那么Master与Slave 之间是如何进行数据同步呢?

关于 Broker 的Master与Slave间的数据同步方式我们称为复制策略,分为同步复制与异步复制两种方式。

  • 同步复制,即消息写入Master后,Master会等待Slave同步数据成功后才向Producer返回成功ACK;
  • 异步复制,即消息写入Master后,Master立即向Producer返回成功ACK,无需等待Slave同步数据成功。

其中异步复制策略会降低系统的写入延迟,RT变小,提高了系统的吞吐量。

刷盘策略

当消息发送到broker内存后消息如何持久化到磁盘呢?

刷盘策略,指的是Broker中消息的落盘方式,即消息发送到Broker内存后消息持久化到磁盘的方式。也分为同步刷盘与异步刷盘两种方式。

  • 同步刷盘,即当消息持久化到Broker的磁盘后才算是消息写入成功;
  • 异步刷盘,即当消息写入到Broker的内存后即表示消息写入成功,无需等待消息持久化到磁盘。

消息写入到Broker的内存,一般是写入了PageCache。对于异步刷盘策略,消息会写入到PageCache后立即返回成功ACK,但并不会立即做落盘操作,而是当PageCache到达一定量时才会自动进行落盘。异步刷盘策略会降低系统的写入延迟,RT变小,提高了系统的吞吐量。

4.2 Broker的集群模式

根据Broker集群中各个节点间关系的不同,Broker集群可以分为以下几类:

4.2.1、单Master模式

只有一个 Broker (其本质上就不能称为集群) .

这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。

4.2.2、多Master模式

broker集群仅由多个master构成,不存在Slave。

同一Topic的各个Queue会平均分布在各个master节点上。

  • 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器 宕机不可恢复情况下,由于RAID10盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步 刷盘一条不丢),性能最高;
    (以上优点的前提是,这些Master都配置了RAID磁盘阵列。如果没有配置,一旦出现某Master宕机,则会发生大量消息丢失的情况。)
  • 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅(不可消费), 消息实时性会受到影响。
4.2.3、多Master多Slave模式-异步复制

​ broker集群由多个master构成,每个master又配置了多个slave(在配置了RAID磁盘阵列的情况下,一 个master一般配置一个slave即可)。

master与slave的关系是主备关系:

  • master负责处理消息的读写请求 ;
  • slave仅负责消息的备份与master宕机后的角色切换。

HA采用异步复制方式,主备之间有短暂消息延迟(毫秒级),这种模式的优缺点如下:

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应透明,不需要人工干预,性能同多Master模式一样。
  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

异步复制 即前面所讲的复制策略中的异步复制策略,即消息写入master成功后,master立即向producer返回成功ACK,无需等待slave同步数据成功。 该模式的最大特点之一是,当master宕机后slave能够自动切换为master。不过由于slave从master的同步具有短暂的延迟(毫秒级),所以当master宕机后,这种异步复制方式可能会存在少量消息的丢失问题。( Slave从Master同步的延迟越短,其可能丢失的消息就越少对于Master的RAID磁盘阵列,若使用的也是异步复制策略,同样也存在延迟问题,同样也可能会丢失消息。但RAID阵列的秘诀是微秒级的(因为是由硬盘支持的),所以其丢失的数据量会更少。)

4.2.4、多Master多Slave模式-同步双写

​ 该模式是多Master多Slave模式的 同步复制 实现。所谓同步双写,指的是消息写入master成功后, master会等待slave同步数据成功后才向producer返回成功ACK,即: master与slave都要写入成功后才会返回成功ACK,也即双写。

​ 该模式与异步复制模式相比,优点是消息的安全性更高,不存在消息丢失的情况。但单个消息的RT略高,从而导致性能要略低(大约低10%)。 该模式存在一个大的问题:对于目前的版本,Master宕机后,Slave不会自动切换到Master。

最佳实践

一般会 为Master配置RAID10磁盘阵列,然后再为其配置一个Slave。 即利用了RAID10磁盘阵列的高效、安全性,又解决了可能会影响订阅的问题。

  1. RAID磁盘阵列的效率要高于Master-Slave集群。因为RAID是硬件支持的。也正因为如此, 所以RAID阵列的搭建成本较高。
  2. 多Master+RAID阵列,与多Master多Slave集群的区别是什么?
    • 多Master+RAID阵列,其仅仅可以保证数据不丢失,即不影响消息写入,但其可能会影响到消息的订阅。但其执行效率要远高于多Master多Slave集群
    • 多Master多Slave集群,其不仅可以保证数据不丢失,也不会影响消息写入。其运行效率要低 于多Master+RAID阵列

4.3 RAID(补充知识)

关于RAID相关的知识科班同学可以跳过啦~

RAID历史

​ 1988 年美国加州大学伯克利分校的 D. A. Patterson 教授等首次在论文 “A Case of Redundant Array of Inexpensive Disks” 中提出RAID 概念 ,即廉价冗余磁盘阵列( Redundant Arrayof Inexpensive Disks )。由于当时大容量磁盘比较昂贵, RAID 的基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量、性能、可靠性。随着磁盘成本和价格的不断降低, “廉价” 已经毫无意义。因此, RAID咨询委员会( RAID Advisory Board, RAB )决定用 “ 独立 ” 替代 “ 廉价 ” ,于时 RAID 变成了独立磁盘冗余阵列( Redundant Array of Independent Disks )。但这仅仅是名称的变化,实质内容没有改变。

RAID等级

​ RAID这种设计思想很快被业界接纳, RAID技术作为高性能、高可靠的存储技术,得到了非常广泛的应用。 RAID主要利用镜像、数据条带和数据校验三种技术来获取高性能、可靠性、容错能力和扩展性,根据对这三种技术的使用策略和组合架构,可以把 RAID分为不同的等级,以满足不同数据应用的需求。
​ D. A. Patterson 等的论文中定义了 RAID0 ~ RAID6 原始 RAID 等级。随后存储厂商又不断推出 RAID7 、 RAID10、RAID01 、 RAID50 、 RAID53 、 RAID100 等 RAID 等级,但这些并无统一的标准。目前业界与学术界公认的标准是 RAID0 ~ RAID6 ,而在实际应用领域中使用最多的 RAID 等级是 RAID0 、 RAID1 、 RAID3 、 RAID5 、 RAID6 和 RAID10。 RAID每一个等级代表一种实现方法和技术,等级之间并无高低之分。在实际应用中,应当根据用户的数据应用特点,综合考虑可用性、性能和成本来选择合适的RAID 等级,以及具体的实现方式。

4.3.1 关键技术

镜像技术

​ 镜像技术是一种冗余技术,为磁盘提供数据备份功能,防止磁盘发生故障而造成数据丢失。

​ 对于 RAID 而言,采用镜像技术最典型地的用法就是,同时在磁盘阵列中产生两个完全相同的数据副本,并且分布在两个不同的磁盘上。镜像提供了完全的数据冗余能力,当一个数据副本失效不可用时,外部系统仍可 正常访问另一副本,不会对应用系统运行和性能产生影响。而且,镜像不需要额外的计算和校验,故障修复非常快,直接复制即可。镜像技术可以从多个副本进行并发读取数据,提供更高的读 I/O 性能,但不能并行写数据,写多个副本通常会导致一定的 I/O 性能下降。 镜像技术提供了非常高的数据安全性,其代价也是非常昂贵的,需要至少双倍的存储空间。高成本限制了镜像的广泛应用,主要应用于至关重要的数据保护,这种场合下的数据丢失可能会造成非常巨大的损失。

数据条带技术

​ 数据条带化技术是一种自动将 I/O操作负载均衡到多个物理磁盘上的技术。更具体地说就是,将一块连续的数据分成很多小部分并把它们分别存储到不同磁盘上。这就能使多个进程可以并发访问数据的多个不同部分,从而获得最大程度上的 I/O 并行能力,极大地提升性能。

数据校验技术

​ 数据校验技术是指, RAID 要在写入数据的同时进行校验计算,并将得到的校验数据存储在 RAID 成员 磁盘中。校验数据可以集中保存在某个磁盘或分散存储在多个不同磁盘中。当其中一部分数据出错时, 就可以对剩余数据和校验数据进行反校验计算重建丢失的数据。
数据校验技术相对于镜像技术的优势在于节省大量开销,但由于每次数据读写都要进行大量的校验运算,对计算机的运算速度要求很高,且必须使用硬件 RAID 控制器。在数据重建恢复方面,检验技术比镜像技术复杂得多且慢得多。

二、双主双从集群搭建【云服务器实战】

本次基于两台云服务器搭建RocketMQ集群,Broker采取双主双从,同步双写方式。先看看总体架构:
在这里插入图片描述
RocketMQ集群工作流程

  1. 启动NameServer。NameServer启动后监听端口,等待Broker、Producer、Consumer连接,相当于一个路由控制中心。
  2. 启动 Broker。与所有 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker 信息(IP+端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic跟Broker 的映射关系。
  3. 首发消息前,先创建 Topic ,创建Topic时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建Topic。
  4. 生产者发送消息。启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic存在于哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker建立长连接从而向 Broker发消息。
  5. 消费者接受消息。跟其中一台Nam

1. 环境准备

首先我们需要准备两台云服务器,小编使用的分别是两核4G的腾讯云 和 1核两G的阿里云 ,系统都是 CentOS7。

序号IP角色架构模式服务器商
1124.222.223.222Nameserver、BrokerMaster1、Slave2腾讯云
247.96.232.192Nameserver、BrokerMaster2、Slave1阿里云

在这里插入图片描述
服务器需要具备java环境、RocketMQ包,以及足够的空闲内存。关于java、RocketMQ的下载不是本文的重点就不再一一演示了~
在这里插入图片描述

第一步、Host添加信息

1、需要在两台Host添加以下信息:

vim /etc/hosts

配置如下:

# nameserver
124.222.223.222 rocketmq-nameserver1
47.96.232.192 rocketmq-nameserver2
# broker
124.222.223.222 rocketmq-master1
124.222.223.222 rocketmq-slave2
47.96.232.192 rocketmq-master2
47.96.232.192 rocketmq-slave1

配置完成后,重启网卡:

systemctl restart network

大家根据自己的服务器ip更换以上hosts文件内容。

第二步、配置防火墙

节点之间需要通信,需要开放相关的端口,或者简单粗暴的方式——直接关闭防火墙。小编为了安全,只开放特定的端口号,RocketMQ默认使用3个端口:8976109111101111009

  • nameserver默认使用 9876 端口;
  • Master 默认使用 10911 端口;
  • Slave 默认使用 11011 端口。
    在这里插入图片描述

第三步、配置环境变量

vim /etc/profile

在profile文件的末尾加入以下命令:

# rocketMQ
ROCKETMQ_HOME=/soft/RocketMQ/rocketmq-all-4.9.0-bin-release
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1sCn9c9p-1671715596559)(RocketMQ-RocketMQ集群搭建.assets/image-20221218195618242.png)]

输入:wq!保存并推出,并使得配置立刻生效:

source /etc/profile

这一步仅是方便在服务器任何路径下都可以执行rocketmq的bin目录下的命令,可跳过。

第四步、创建消息存储路径

RocketMQ消息持久化的位置默认是在/root/store/commitlog,为了方便操作我们自定义消息的存储路径~

# 在第一台服务器执行
mkdir /soft/RocketMQ/store-a
mkdir /soft/RocketMQ/store-a/commitlog
mkdir /soft/RocketMQ/store-a/consumequeue
mkdir /soft/RocketMQ/store-a/index

mkdir /soft/RocketMQ/store-b-s
mkdir /soft/RocketMQ/store-b-s/commitlog
mkdir /soft/RocketMQ/store-b-s/consumequeue
mkdir /soft/RocketMQ/store-b-s/index

# 在第二台服务器执行
mkdir /soft/RocketMQ/store-b
mkdir /soft/RocketMQ/store-b/commitlog
mkdir /soft/RocketMQ/store-b/consumequeue
mkdir /soft/RocketMQ/store-b/index

mkdir /soft/RocketMQ/store-a-s
mkdir /soft/RocketMQ/store-a-s/commitlog
mkdir /soft/RocketMQ/store-a-s/consumequeue
mkdir /soft/RocketMQ/store-a-s/index

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQKPOKnR-1671717131825)(RocketMQ-RocketMQ集群搭建.assets/image-20221219223509303.png)]

提示:以上操作两台服务器都执行一遍~


2. Broker 配置文件

我们查看一下conf 下的文件,我们本次搭建双主双从的方式故选择 2m-2s-sync
在这里插入图片描述
进入 2m-2s-sync ,在对应的服务器上配置对应的配置文件。如在124.222.223.222服务器上实现Master1、Slave2,修改 broker-a.propertiesbroker-b-s.properties即可。
在这里插入图片描述

第一步、配置 Master1

124.222.223.222服务器上修改broker-a.properties配置文件

vim /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-a.properties

修改配置如下:

#暴露外网的IP
brokerIP1=124.222.223.222
brokerIP2=124.222.223.222
#所属集群名字
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=/soft/RocketMQ/store-a
#commitLog 存储路径
storePathCommitLog=/soft/RocketMQ/store-a/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/soft/RocketMQ/store-a/consumequeue
#消息索引存储路径
storePathIndex=/soft/RocketMQ/store-a/index
#checkpoint 文件存储路径
storeCheckpoint=/soft/RocketMQ/store-a/checkpoint
#abort 文件存储路径
abortFile=/soft/RocketMQ/store-a/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

第二步、配置 Slave2

124.222.223.222服务器上修改broker-b-s.properties配置文件

vim /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-b-s.properties

修改配置如下:

#暴露外网的IP
brokerIP1=124.222.223.222
brokerIP2=124.222.223.222
#所属集群名字
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=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/soft/RocketMQ/store-b-s
#commitLog 存储路径
storePathCommitLog=/soft/RocketMQ/store-b-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/soft/RocketMQ/store-b-s/consumequeue
#消息索引存储路径
storePathIndex=/soft/RocketMQ/store-b-s/index
#checkpoint 文件存储路径
storeCheckpoint=/soft/RocketMQ/store-b-s/checkpoint
#abort 文件存储路径
abortFile=/soft/RocketMQ/store-b-s/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

第三步、配置 Master2

47.96.232.192服务器上修改broker-b.properties配置文件

vim /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-b.properties

修改配置如下:

#暴露外网的IP
brokerIP1=47.96.232.192
brokerIP2=47.96.232.192
#所属集群名字
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
#存储路径
storePathRootDir=/soft/RocketMQ/store-b
#commitLog 存储路径
storePathCommitLog=/soft/RocketMQ/store-b/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/soft/RocketMQ/store-b/consumequeue
#消息索引存储路径
storePathIndex=/soft/RocketMQ/store-b/index
#checkpoint 文件存储路径
storeCheckpoint=/soft/RocketMQ/store-b/checkpoint
#abort 文件存储路径
abortFile=/soft/RocketMQ/store-b/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

第四步、配置 Slave1

47.96.232.192服务器上修改broker-a-s.properties配置文件

vim /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-a-s.properties

修改配置如下:

#暴露外网的IP
brokerIP1=47.96.232.192
brokerIP2=47.96.232.192
#所属集群名字
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=/soft/RocketMQ/store-a-s
#commitLog 存储路径
storePathCommitLog=/soft/RocketMQ/store-a-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/soft/RocketMQ/store-a-s/consumequeue
#消息索引存储路径
storePathIndex=/soft/RocketMQ/store-a-s/index
#checkpoint 文件存储路径
storeCheckpoint=/soft/RocketMQ/store-a-s/checkpoint
#abort 文件存储路径
abortFile=/soft/RocketMQ/store-a-s/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

3. 服务启动

第一步、启动NameServer集群

分别在 124.222.223.222、47.96.232.192服务器上启动NameServer

创建用来存放nameserver日志的文件

[root@hgwtencent /]# cd /soft/RocketMQ/
[root@hgwtencent RocketMQ]# mkdir -p store/log
[root@hgwtencent RocketMQ]# touch store/log/namesrv.log
[root@hgwtencent RocketMQ]# touch store/log/broker1.log
[root@hgwtencent RocketMQ]# touch store/log/broker2.log

启动 NameServer~

[root@hgwtencent RocketMQ]# cd /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/bin
[root@hgwtencent rocketmq-all-4.9.0-bin-release]# nohup sh mqnamesrv > ../../store/log/namesrv.log 2>&1 &

第二步、启动Broker集群

1、在124.222.223.222上启动master1和slave2

[root@hgwtencent bin]# cd /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/bin/
[root@hgwtencent bin]# nohup sh mqbroker -c /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-a.properties > ../../store/log/broker1.log 2>&1 &
[root@hgwtencent bin]# nohup sh mqbroker -c /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-b-s.properties  > ../../store/log/broker2.log 2>&1 &

2、在47.96.232.192 上启动master2和slave1

[root@hgwalibabacloud 2m-2s-sync]# cd /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/bin/
[root@hgwalibabacloud bin]# nohup sh mqbroker -c /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-b.properties  > ../../store/log/broker1.log 2>&1 &
[root@hgwalibabacloud bin]# nohup sh mqbroker -c /soft/RocketMQ/rocketmq-all-4.9.0-bin-release/conf/2m-2s-sync/broker-a-s.properties  > ../../store/log/broker2.log 2>&1 &

第三步、验收

启动后通过JPS查看启动进程
在这里插入图片描述
查看日志

# 查看nameServer日志
tail -500f ~/logs/rocketmqlogs/namesrv.log
# 查看broker日志
tail -500f ~/logs/rocketmqlogs/broker.log

在这里插入图片描述
关闭命令

mqshutdown broker
mqshutdown namesrv

4. 集群监控平台搭建

这里需要将两台服务器的11009端口开放,rocketmq-Dashboard管理页面默认端口为8080,小伟这因为8080被占用故调整为7777

第一步、下载并解压

rocketmq-console已经不在原先的仓库了,已经被迁移到RocketMQ Dashboard。进入到这个dashboard仓库:https://github.com/apache/rocketmq-dashboard。下载zip包并解压。
在这里插入图片描述

第二步、修改配置文件

修改rocketmq.config.namesrvAddr=后面为你的NameServer集群地址

在这里插入图片描述

第三步、编译打包并部署

进入 /rocketmq-dashboard-master 目录

cd /Users/gwh/Documents/Software/tools/rocketmq/rocketmq-dashboard-master   

执行编辑打包命令:mvn clean package -Dmaven.test.skip=true

mvn clean package -Dmaven.test.skip=true

等待命令执行完成之后在/rocketmq-dashboard-master/target 目录下就可以看到打好的jar包啦!上传到服务器run起来~
在这里插入图片描述

nohup java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar &> store/log.log &

在这里插入图片描述
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐