RocketMQ快速入门:主从、集群模式原理及搭建实操(十一)

目录

  • 0. 引言
  • 1. 前备知识
    • 1.1 namesrv集群模式
    • 1.2 broker集群模式
    • 1.2 broker主从复制原理
  • 2. 集群部署
    • 2.1 环境准备
    • 2.2 配置讲解
    • 2.3 一主多从模式部署
    • 2.4 多主无从模式部署
    • 2.5 多主多从模式部署
  • 3. 总结

0. 引言

在学习完rocketmq的基础知识后,我们进入rocketmq高可用保障的章节,即从服务部署架构角度,探索其支持的多节点部署模式。

1. 前备知识

1.1 namesrv集群模式

我们知道rocketmq主要由namesrv和broker组成,其集群的部署自然就是两个服务的集群部署。而大部分我们谈到其集群模式时,其实都是指的broker, 这是因为namesrv是无状态的,什么是无状态的呢? 简单说就是namesrv之间不互相通信,其集群部署只要部署多个节点,broker中配置上多个namesrv的地址信息,只要其中一个namesrv可用,整体就依然可用。

那么这种无状态机制是怎么实现的呢?

其实要聊到namesrv与broker的通信机制,之前我们也简单说明过,具体如下:
1、nameserver 每隔 10s 会扫描一次 Broker,对于没有超过120s都没有回应的broker做剔除处理
2、broker 每隔 30 秒会向集群中所有的 NameServer 发送心跳包(这里发送的namesrv列表,就是写在broker配置文件中的所有namesrv地址),namesrv收到心跳包后会更新状态信息和路由表

所以可以看到broker会像所有的namesrv发送心跳,所以每个namesrv自然不用相互通信了。

1.2 broker集群模式

broker支持的集群模式包括三种:

  • 单主模式

包含一个主节点,一个或多个从节点,主节点负责写操作,从节点负责读操作,主从节点之间通过主从复制机制同步数据,优点是部署维护简单,缺点是当主节点宕机时整个集群将无法工作,所以也没有完整的实现高可用
在这里插入图片描述

  • 多主模式

包含多个主节点,没有从节点,单个节点宕机时对整体集群可用性无影响,但在该节点上还未消费的消息在宕机期间就无法被消费了,短期内对有限的数据消费有影响。
在这里插入图片描述

  • 多主多从模式

包含多个主节点,多个从节点,主节点负责写,每个主节点有自己的一组从节点,从节点负责读,弥补多主模式宕机期间消息无法消费的问题,无单点故障,但相对性能会有所下降
在这里插入图片描述

1.2 broker主从复制原理

主从复制可以基于以下两种机制实现:同步复制和异步复制。

  • 同步复制: 同步复制模式下,主节点会等待至少一个从节点返回确认接收的回执后,才会给生产者发送成功接收回执,该模式强调数据的强一致性,缺点是降低了性能。其执行流程如下:
  1. 生产者会先发送消息到主broker,主broker会将消息写入到commit log中
  2. 主broker写入数据时,会唤醒WriteSocketService线程,查询commit log,将数据发送到从broker
  3. 从接收到消息后,将数据写入到自身的commit log,复制完成后返回新的更新偏移量给主
  4. 主broker同步等待到偏移量返回后,更新偏移量,如果消息偏移量大于等于主从复制请求的偏移量,则说明复制完成,然后返回消息发送成功的回执给生产者
  • 异步复制:主 Broker 发送消息后,不需要等待从 Broker 的确认,即可向生产者返回成功标识。异步复制可以提高性能,但是可能会有数据丢失的风险。
  1. 主broker启动,监听指定端口
  2. 从broker启动,与主broker建立连接
  3. 从broker每5s向主broker拉取消息,从broker收到消息后将数据写入到commit log中,同时返回偏移量给主broker,且更新自身存储的当前最大偏移量

可以看到同步异步的差别,主要是同步由主节点发起复制,异步由从节点发起复制

2. 集群部署

2.1 环境准备

两台部署了rocketmq的服务器,rocketmq在linux中的安装可参考我之前的文章:
linux安装RocketMQ并配置开机自启(一)

2.2 配置讲解

我们通过broker自带的conf目录下的配置文件2m-*,实际就可以知道如何进行配置

在这里插入图片描述
其配置项主要有以下几项:

  1. brokerClusterName=DefaultCluster # 集群名称,同一集群保持一致
  2. brokerName=broker-a # broker组名称,同一主从保持一致
  3. brokerId=1 # brokerid, 每个broker节点唯一,0 表示 Master,>0 表示 Slave
  4. deleteWhen=04 # 删除策略,通常配合时间使用,如每天的“04”点
  5. fileReservedTime=48 # 文件保留时间,单位为小时
  6. brokerRole=SLAVE # 角色,SLAVE从节点,ASYNC_MASTER 异步主节点,SYNC_MASTER 同步主节点
    当为同步主节点时,生产者发送消息给主节点成功,也要发送给从节点成功之后,集群才会返回成功给生产者;当为异步主节点,生产者发送给主节点,主节点写入成功后就会返回成功回执给生产者。
  7. flushDiskType=ASYNC_FLUSH # 主从复制模式,ASYNC_FLUSH异步刷盘,SYNC_FLUSH同步刷盘

2.3 一主多从模式部署

1、提前部署3个namesrv服务节点,3个broker服务节点,其中计划1个为主节点,2个从节点

broker服务节点角色
192.168.244.27
192.168.244.28
192.168.244.29

2、修改主节点服务器的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

3、修改两个从节点的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 1 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 节点ip
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 2 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29 # 节点ip

4、启动3个namesrv

5、启动3个broker

6、查询集群状态

# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0 
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"

在这里插入图片描述

7、也可以通过管理后台查看集群节点
在这里插入图片描述
8、使用之前的代码测试消息发送
在这里插入图片描述
消息消费也正常
在这里插入图片描述

2.4 多主无从模式部署

1、提前部署2个namesrv服务节点,2个broker服务节点,其中计划2个为主节点,无从节点

broker服务节点角色
192.168.244.27
192.168.244.28

2、修改其中一个节点服务器的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

3、修改另一个节点的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

4、启动2个namesrv

5、启动2个broker

6、查询集群状态

# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0 
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876"

在这里插入图片描述

2.5 多主多从模式部署

1、提前部署3个namesrv服务节点,4个broker服务节点,其中计划2个为主节点,2个从节点

broker服务节点角色
192.168.244.27主1
192.168.244.28主2
192.168.244.29从1
192.168.244.30从2

2、修改主1节点服务器的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

3、修改主2节点的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 0 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 节点ip, 另一个是192.168.244.29

4、修改两个从节点的配置分别为

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.30

4、启动3个namesrv

5、启动4个broker

6、查询集群状态

# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0 
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"

显示有2个主节点,2个从节点
在这里插入图片描述

3. 总结

综上,我们针对rocketmq的三种集群模式部署就讲解完成了,如果需要调整刷盘模式,调整flushDiskType参数即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

和Bug较劲的第n天:[Error: Unable to open snapshot file: No such file or directory]

问题描述 最近做了一个小demo,基于parcel的,在迁移仓库的时候发生了一个报错 [Error: Unable to open snapshot file: No such file or directory] 原因分析: 在迁移仓库的时候,我将项目放入了一个以中文命名的文件夹里&#xf…

模电基础 - 信号的运算和处理

目录 一. 简介 二. 加法 三. 减法 四. 乘法 五. 除法 六. 总结 一. 简介 在模电基础中,信号的运算和处理是非常重要的内容。 信号的运算包括加法、减法、乘法、除法等。通过使用集成运放,可以很容易地实现这些运算。例如,利用反相输入…

算法的几种常见形式

算法(Algorithm) 算法(Algorithm)是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中,算法是程序的核心部分,它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…

宜春旅游集散中心展厅OLED透明屏方案设计

一、项目概述 为提升宜春旅游集散中心展厅的现代化展示水平,增强游客的参观体验,我们计划在展厅的核心区域引入OLED透明屏技术。该方案旨在通过高科技的视觉呈现方式,将展品信息以虚拟与现实相结合的方式展现,打造出一个既具科技感…

谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录 一,OpenFeign的简介二,OpenFeign的使用步骤1,场景说明2,引入依赖2,开启OpenFeign3,编写Feign接口4,使用feign调用远程接口5,验证 错误记录 上一节学习了注册中心&#xff0…

鼠标录制工具|键鼠轨迹录制,实现自动办公

利用键鼠录制工具录制固定的鼠标点击、键盘输入等操作,实现自动化执行固定操作,节省时间。鼠标录制功能可以录制多步骤的操作,将录制的动作保存并命名,甚至可以编辑操作速度。下面将演示几种生活中常见的案例,详细讲解…

企业微信hook接口协议,移除群成员通知

移除群成员通知 返回示例 {"flag": 0, "receiver": 0, "sender_name": "", "is_room": 1, "server_id": 15318083, "send_time": 1687688952, "sender": 1688855749266556, "referid&…

插件更新了!

最近花了点时间,给网页插件添加了新功能,下面简单给大家介绍一下如何使用 我们安装好插件后,进入网页就可以看到一个带logo的按钮了,我们可以点一下就可以跳出快捷操作 不同页面点击会出现不同的功能,大家可以根据自己…

跨境传输需要遵守哪些准则,如何做到有效管控?

在全球化的商业环境中,跨国企业面临着数据跨境传输的挑战。随着业务的扩展,企业需要在不同国家和地区之间高效、安全地传输大量数据。选择合适的跨境传输方案对于保障数据安全、提高业务效率、遵守法律法规至关重要。 跨境传输数据需要遵守的准则和规定主…

Nginx:关于实现跨域代理

运维专题 Nginx:关于实现跨域代理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.ne…

发那科机床联网串口配置

本文章仅针对无网口,需要通过串口输出采集数据情况。跟这篇文章互为参考,一个理论,一个实战。 Fanuc DPRNT宏程序串口采集-CSDN博客 一、禁用机器串口监控 选择System、monit 二、设置参数可写 在MDI模式中字符面板上按OFS/SET键,连按致屏…

终于搞定了通过两路蓝牙接收数据

一直想做无线传感器,通过蓝牙来接收数据,无奈因为arduino接收串口数据的一些问题,一直搁到现在。因为学校里给学生开了选修课,所以手边有一些nano和mega可以使用,所以就做了用两个nano加上两个蓝牙模块来发射数据&…

经常用借呗和花呗对征信有影响吗?

说起支付宝里的花呗和借呗,大伙儿肯定都不陌生,它们俩就像是支付宝里的信用贷款双胞胎,名字相近,性格却大相径庭。现在,这俩兄弟都乖乖地接入了央行的征信大家庭,你的每一次使用,都会被记录得清…

DDD架构

1.DDD架构的概念: 领域驱动设计(Domain-Driven Design, DDD)是一种软件设计方法,旨在将软件系统的设计和开发焦点集中在领域模型上,以解决复杂业务问题 2.DDD架构解决了什么问题: 在以前的mvc架构种,三层结…

产品经理-交互设计动手实践(11)

业内有很多画交互的工具,这里不过多介绍,互联网公司最常用的工具是Axure,墨刀,蓝湖,小瀑 它是一个专业的快速原型设计工具,使用它能够快速创建线框图、流程图、原型和规格说明文档。 它能快速、高效地创建原型,同时支持多人协作设…

华为HCIP Datacom H12-821 卷30

1.单选题 以下关于OSPF协议报文说法错误的是? A、OSPF报文采用UDP报文封装并且端口号是89 B、OSPF所有报文的头部格式相同 C、OSPF协议使用五种报文完成路由信息的传递 D、OSPF所有报文头部都携带了Router-ID字段 正确答案:A 解析: OSPF用IP报…

【人工智能】-- 法律与伦理

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉伦理问题 🍈隐私泄露问题 🍍人工智能与隐私泄露的紧密关联 🍍数…

上海慕尼黑电子展开展,启明智显携物联网前沿方案亮相

随着科技创新的浪潮不断涌来,上海慕尼黑电子展在万众瞩目中盛大开幕。本次展会汇聚了全球顶尖的电子产品与技术解决方案,成为业界瞩目的焦点。启明智显作为物联网彩屏显示领域的佼佼者携产品亮相展会,为参展者带来了RTOS、LINUX全系列方案及A…

鸿蒙 arkts 实现手机号中间四位隐藏, 可以使用 substring [ 简单适用新手 ]

1, 看效果 2, 直接cv代码就可以 Preview Entry Component struct Setting {Statephone:string 15555555555maskPhoneNumber(phone:string){const start phone.substring(0,3)const end phone.substring(7)return ${start}****${end}}build() {Column(){Text(this.maskPhon…

Leetcode2542-最大子序列的分数

1.问题转换 首先明确题意,要选取的值和num1,num2两个数组都有关,但是num1中选取的是k个数,num2中选取的是1个数,显然num2中的数所占的权重较大(对结果影响较大),所以我们就可以对nu…