Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
文章目录
- Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
- 1. 副本的基本概念
- 2. 副本同步和一致性
- 2.1 AR(Assigned Replicas)
- 2.2 ISR(In-Sync Replicas)
- 2.3 OSR(Out-of-Sync Replicas)
- 2.4 HW(High Watermark)
- 2.5 LEO(Log End Offset)
- 2.6 简单事例理解HW与LEO的关系
- 3. 副本的工作流程
- 4. 副本同步的关键参数
- 5. 副本同步常见问题
- 5.1 副本滞后(Replica Lag)
- 5.2 副本丢失(Replica Loss)
- 5.3 ISR (In-Sync Replica) 不一致
- 5.4 副本数量不足(Under-replicated Partitions)
- 5.5 副本重新分配失败
- 5.6 领导者选举延迟
- 5.7 副本同步时间长*
- 5.8 副本丢失或被移出 ISR
- 5.9 副本配置不当
Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
Kafka 的副本机制是其高可用性和容错性的核心之一,它确保在发生故障时数据不会丢失,同时允许系统继续提供服务。副本机制通过将每个分区的数据复制到多个 Broker 上,保证了即使某个 Broker 宕机,数据仍然可以通过其他 Broker 访问。
1. 副本的基本概念
- 副本(Replica):每个 Kafka 分区都会有多个副本,这些副本分布在不同的 Broker 上。副本包括:
- 领导者副本(Leader Replica):每个分区只能有一个领导者副本,负责处理生产者的写入请求和消费者的读取请求。领导者副本是所有客户端请求的入口。
- 追随者副本(Follower Replica):其他副本是追随者副本,追随者副本的任务是从领导者副本同步数据。追随者副本不直接处理客户端的读写请求,它们仅用于数据的备份。
2. 副本同步和一致性
Kafka 在数据存储和分布式消息传递中使用了多个概念和指标来描述消息的状态、副本的同步情况,以及如何处理消费者的读取。以下是这些概念和指标的详细介绍:
2.1 AR(Assigned Replicas)
定义:
- AR(Assigned Replicas) 代表的是 Kafka 分区的 所有副本,包括领导者副本(Leader Replica)和所有追随者副本(Follower Replicas)。
作用:
- AR 列表表示分区的副本拓扑,显示所有属于该分区的副本。
- AR 中的副本包括 ISR 中的副本和 OSR 中的副本。也就是说,AR 包括所有的副本,無論它們是否同步。
举例:
假设 Kafka 分区有 3 个副本:
- 领导者副本:
r1
, - 追随者副本:
r2
和r3
。
那么,AR 列表就是 [r1, r2, r3]
。无论 r2
和 r3
是否与领导者同步,都会包含在 AR 列表中。
2.2 ISR(In-Sync Replicas)
定义:
- ISR(In-Sync Replicas) 代表的是与 Kafka 分区 领导者副本同步 的副本。只有同步副本才被认为是与领导者保持一致的副本,并且能够承载新的写入操作。
作用:
- ISR 是 Kafka 中保证数据一致性和高可用性的重要机制,所有写入操作都需要同步到 ISR 中的副本。
- 如果副本不能及时同步数据,它将被移出 ISR 列表。
举例:
假设分区有 3 个副本:r1
(领导者)、r2
和 r3
。如果 r1
和 r2
保持同步,而 r3
延迟了很长时间并未同步,它会被从 ISR 中移除。此时,ISR 列表是 [r1, r2]
。
2.3 OSR(Out-of-Sync Replicas)
定义:
- OSR(Out-of-Sync Replicas) 代表的是那些滞后于领导者副本的副本,即它们未能及时同步领导者的日志,因而不在 ISR 列表中。
作用:
- OSR 副本无法保证数据一致性,因为它们不能及时同步数据。
- Kafka 会尽可能让这些副本重新同步,以便它们可以重新加入 ISR 列表。
举例:
如果 r3
因网络问题滞后于 r1
,它会被认为是 OSR,并从 ISR 中移除。直到它追赶上领导者副本,才会重新加入 ISR。
2.4 HW(High Watermark)
定义:
- HW(High Watermark) 是 Kafka 中的一个关键指标,它表示 Kafka 分区中所有副本(特别是 ISR 中的副本)已经 确认并同步 的 最高偏移量。简单来说,HW 是 Kafka 中最新已被写入的、所有副本均已同步的消息偏移量。
作用:
- HW 代表了 Kafka 集群的 已提交数据的最大偏移量,即所有同步副本能够确认并读取的最大偏移量。
- 只有偏移量小于或等于 HW 的消息才对消费者可见。
- 高水位线的更新会影响消费者的读取位置,只有当消息的偏移量小于或等于 HW 时,消费者才能读取该消息。
举例:
假设 Kafka 分区的领导者副本 r1
写入了偏移量 1000
,并且此时该消息已同步到 ISR 中的所有副本(例如 r2
和 r3
)。此时,HW 为 1000
,意味着所有副本都已经确认并能够读取该消息。
2.5 LEO(Log End Offset)
定义:
- LEO(Log End Offset) 是 Kafka 分区 当前日志的末尾偏移量。它代表 Kafka 分区中 最后一条消息的偏移量。
作用:
- LEO 用来描述一个分区的日志进度,表示分区日志中所有消息的 最大偏移量。
- 它帮助 Kafka 管理分区中的消息存储,因为当 LEO 被更新时,意味着新的消息被写入分区。
举例:
假设 Kafka 分区的日志写入了 1500 条消息,那么 LEO 就是 1500
,表示这是该分区最新写入的偏移量。如果一个消费者的偏移量是 1499
,那么它会尝试消费 1500
之后的消息。
2.6 简单事例理解HW与LEO的关系
- 开始分区存在3个副本,此时HW和LEO的值都为3;
- 生产者将消息写入Leader副本后,follower副本进行消息同步;
3.同步过程中,leader副本的LEO为8,follower0的LEO为6,follower1的LEO为5;当前分区的HW最小值为5;
4.等待同步完成,LEO和HW的值为8。
3. 副本的工作流程
-
生产者写入数据:
- 生产者将消息发送到分区的领导者副本。领导者副本接收并写入数据。
- 领导者副本将写入的数据同步到所有的追随者副本。同步方式是异步的,即领导者副本会先处理生产者的请求,而不是等待所有追随者副本完成同步。
-
消费者读取数据:
- 消费者只能从领导者副本读取数据。领导者副本确保它的数据是最新的且与其他副本同步一致。
-
副本同步过程:
- 每个追随者副本定期从领导者副本拉取日志数据。追随者副本会确保其存储的数据与领导者副本的数据一致。
- 追随者副本会记录日志的偏移量,每次同步时,更新其当前的偏移量。
4. 副本同步的关键参数
replication.factor
:每个分区的副本数量,通常设置为 3,表示每个分区有 3 个副本(1 个领导者副本,2 个追随者副本)。min.insync.replicas
:指定一个分区在进行生产者写入时,必须有多少个副本是同步的。若少于这个数量,写入请求将被拒绝。这个配置确保了数据的一致性和高可用性。unclean.leader.election.enable
:是否允许未同步副本作为领导者进行选举。通常该配置为false
,表示只有 ISR 中的副本才能被选为新的领导者。replica.lag.time.max.ms
:副本同步最大容忍延迟时间。如果副本的同步延迟超过该时间,它将被移出 ISR。
5. 副本同步常见问题
Kafka 副本机制是确保数据可靠性和高可用性的重要机制。副本机制通过将每个分区的数据复制到多个 broker 上,保证即使某个 broker 或分区失败,数据依然可以从其他副本中恢复。然而,在实际生产环境中,副本机制可能会遇到一些常见问题。以下是 Kafka 副本机制的一些常见问题及其解决方案。
5.1 副本滞后(Replica Lag)
问题描述:
副本滞后是指某个追随者副本(Follower Replica)没有及时跟上领导者副本(Leader Replica)的数据更新,导致其数据落后。副本滞后通常是由网络延迟、磁盘性能问题、资源瓶颈等原因引起的。
可能影响:
- 消费者读取时可能会读取到过时的数据。
- 如果副本滞后太久,可能导致不可用副本,从而影响 Kafka 集群的可用性和数据一致性。
- 写入请求可能会因副本不足而失败。
解决方案:
- 增强网络带宽,优化数据传输速率。
- 提升硬件性能,特别是磁盘 I/O 性能(使用 SSD 而非 HDD)。
- 合理配置副本同步参数,如
replica.fetch.max.bytes
、replica.fetch.wait.max.ms
等。 - 在负载高峰期间,考虑增加集群资源,扩展 broker 数量。
5.2 副本丢失(Replica Loss)
问题描述:
副本丢失是指某个副本(特别是追随者副本)在集群故障时丢失数据。副本丢失通常发生在 Kafka broker 突然崩溃或由于磁盘损坏、网络分区等问题导致无法与领导者副本同步。
可能影响:
- 数据丢失,尤其是在副本配置为
min.insync.replicas
的情况下,若副本数不足,生产者可能会失败,造成数据丢失。 - 消费者可能会读取不到数据,导致消费者进度回退。
解决方案:
- 配置
min.insync.replicas
,确保在写入时必须有足够的副本处于同步状态。 - 启用持久化存储,避免副本因磁盘丢失而导致数据丢失。
- 定期进行数据备份,防止因硬件故障造成的数据丢失。
- 使用分区和副本的负载均衡,确保副本的分布均匀,降低单点故障的风险。
5.3 ISR (In-Sync Replica) 不一致
问题描述:
ISR 是指副本队列中与领导者副本同步的副本。如果一个副本滞后过多,或者无法正常与领导者同步,则该副本会被从 ISR 列表中移除。ISR 不一致通常是由于网络延迟、磁盘瓶颈、或者配置不当等原因导致的。
可能影响:
- 如果 ISR 中的副本数低于
min.insync.replicas
配置,生产者会因为写入确认失败而收到NotEnoughReplicasException
错误。 - 如果副本数量不足,可能会导致数据丢失或集群不可用。
解决方案:
- 配置合理的
min.insync.replicas
值,确保每个分区至少有两个副本处于同步状态。 - 定期检查 ISR 状态,确保副本处于同步状态。
- 优化 Kafka 集群的网络性能和磁盘 I/O 性能,减少副本同步的延迟。
5.4 副本数量不足(Under-replicated Partitions)
问题描述:
当某个分区的副本数不足时(即副本数量低于预期值),会出现 “Under-replicated Partitions” 的情况。可能由于副本丢失、broker 故障、或者 ISR 不一致等原因导致。
可能影响:
- 数据的可靠性降低,部分副本不可用时可能导致写入失败。
- Kafka 会报告 “Under-replicated Partitions”,提醒运维人员某些分区的副本数量不够。
解决方案:
- 定期监控 Kafka 集群的 “Under-replicated Partitions” 状态。
- 在生产环境中,至少为每个分区配置两个副本。
- 如果副本不足,手动触发副本恢复或增加新的 broker 进行数据平衡。
5.5 副本重新分配失败
问题描述:
副本重新分配是指将分区的副本从一个 broker 移动到另一个 broker 的过程。这个过程可能由于磁盘满、网络问题或者节点故障而失败。
可能影响:
- 副本分布不均匀,可能导致集群负载不平衡。
- 如果副本重新分配失败,可能导致某些分区的副本数不足。
解决方案:
- 监控 Kafka 的负载情况,确保副本分配均匀。
- 使用 Kafka 自带的工具进行副本重新分配,或者手动触发分配过程。
- 检查 Kafka 的
broker
日志,识别是否存在硬件瓶颈或配置问题。
5.6 领导者选举延迟
问题描述:
Kafka 的领导者副本是负责处理分区读写请求的副本。领导者副本可能会因为某些原因(如故障或重新选举)需要重新选举。这会导致领导者选举的延迟,进而影响到整个分区的可用性。
可能影响:
- 写入请求可能会被暂时阻塞,导致生产者写入失败。
- 消费者可能暂时无法消费该分区的消息。
解决方案:
- 配置合理的
unclean.leader.election.enable
,避免在副本同步尚未完成时强制进行领导者选举。 - 使用可靠的硬件和网络,避免因硬件故障导致领导者选举频繁发生。
- 使用
min.insync.replicas
配置来限制仅在副本同步的情况下进行领导者选举。
5.7 副本同步时间长*
问题描述:
副本同步时间过长通常是由于生产者写入数据的速度过快,或者副本(追随者)无法及时处理传输的数据。这可能由于磁盘 I/O 性能差、网络瓶颈、资源竞争等因素导致。
可能影响:
- 副本同步延迟可能会导致消费者读取数据时读取到不一致的数据。
- 如果副本滞后时间过长,可能会影响到分区的可靠性和写入的确认机制。
解决方案:
- 使用更高性能的硬件,特别是更快的磁盘(如 SSD)。
- 优化 Kafka 配置参数,例如
replica.fetch.max.bytes
,提高副本同步的效率。 - 通过增加 Kafka broker 节点来分担负载,确保副本同步不受资源瓶颈的限制。
5.8 副本丢失或被移出 ISR
问题描述:
当副本因为滞后过多或者某些原因无法及时与领导者副本同步时,它会被移出 ISR(In-Sync Replicas)列表。如果某些副本长时间未能同步,它们可能会被永久丢失或移出 ISR。
可能影响:
- 数据可靠性降低,特别是在某些副本长时间滞后时。
- 如果副本丢失或移出 ISR,生产者会因缺少足够副本而出现
NotEnoughReplicasException
错误。
解决方案:
- 确保
min.insync.replicas
设置合理,防止副本滞后导致写入失败。 - 定期监控 ISR 状态,及时发现副本滞后问题。
- 使用 Kafka 的分区和副本重新分配工具,确保副本分布均匀,避免单个节点的故障影响整个分区。
5.9 副本配置不当
问题描述:
副本配置不当可能会导致 Kafka 集群的可用性下降,例如设置过低的副本数、配置不合理的副本同步参数等。
可能影响:
- 副本数过低会增加数据丢失的风险。
- 副本同步参数配置不当可能导致副本同步延迟或失败。
解决方案:
- 为每个分区配置至少两个副本。
- 通过监控工具定期检查副本的同步状态。
- 配置合理的副本同步参数,确保副本能及时同步。
相关文章:

Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)
文章目录 Kafka 副本机制(包含AR、ISR、OSR、HW 和 LEO 介绍)1. 副本的基本概念2. 副本同步和一致性2.1 AR(Assigned Replicas)2.2 ISR(In-Sync Replicas)2.3 OSR(Out-of-Sync Replicas…...

爬虫基础(二)Web网页的基本原理
一、网页的组成 网页由三部分构成:HTML、JavaScript、CSS。 (1)HTML HTML 相当于网页的骨架,它通过使用标签来定义网页内容的结构。 举个例子: 它把图片标签为img、把视频标签为video,然后组合到一个界面…...

外网访问禅道软件项目管理系统
禅道项目管理软件是一款国产的开源免费项目管理软件,专注于研发项目管理,旨在帮助企业或团队提高项目管理的效率和质量。 本文将详细的介绍如何在 Windows 系统电脑端下载运行禅道软件项目管理系统,并且结合路由侠内网穿透实现外网访问本地的…...

Python 梯度下降法(五):Adam Optimize
文章目录 Python 梯度下降法(五):Adam Optimize一、数学原理1.1 介绍1.2 符号说明1.3 实现流程 二、代码实现2.1 函数代码2.2 总代码2.3 遇到的问题2.4 算法优化 三、优缺点3.1 优点3.2 缺点 四、相关链接 Python 梯度下降法(五&a…...

笔试-二进制
应用题 将符合区间[l,r]内的十进制整数转换为二进制表示,请问不包含“101”的整数个数是多少? 实现 l int(input("请输入下限l,其值大于等于1:")) r int(input("请输入上限r,其值大于等于l&#x…...

springboot 2.7.6 security mysql redis jwt配置例子
数据库结构用的是若依的数据库基本结构,ruoyi.vip。 总体参考了文章:https://blog.csdn.net/qq_45847507/article/details/126681110 本文章只包含不同的地方,相同的不再赘述。 1、创建spring工程,jdk1.8,maven。 pom.xml中依赖部…...

FreeRTOS从入门到精通 第十六章(任务通知)
参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、任务通知简介 1、概述 (1)任务通知顾名思义是用来通知任务的,任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 (2&#…...

TensorFlow 简单的二分类神经网络的训练和应用流程
展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括: 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中,数据准备是通过两个 Numpy 数…...

无人机图传模块 wfb-ng openipc-fpv,4G
openipc 的定位是为各种模块提供底层的驱动和linux最小系统,openipc 是采用buildroot系统编译而成,因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢?因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来,从而…...

.cc扩展名是什么语言?C语言必须用.c为扩展名吗?主流编程语言扩展名?Java为什么不能用全数字的文件名?
.cc扩展名是什么语言? .cc是C语言使用的扩展名,一种说法是它是c with class的简写,当然C语言使用的扩展名不止.cc和.cpp, 还包含.cxx, .c, .C等,这些在不同编译器系统采用的默认设定不同,需要区分使用。当然,编译器提…...

【MyDB】4-VersionManager 之 3-死锁及超时检测
【MyDB】4-VersionManager 之 3-死锁及超时检测 死锁及超时检测案例背景LockTable锁请求与等待管理 addvm调用addputIntoList,isInList,removeFromList 死锁检测 hasDeadLock方法资源释放与重分配 参考资料 死锁及超时检测 本章涉及代码:top/…...

【Linux】使用管道实现一个简易版本的进程池
文章目录 使用管道实现一个简易版本的进程池流程图代码makefileTask.hppProcessPool.cc 程序流程: 使用管道实现一个简易版本的进程池 流程图 代码 makefile ProcessPool:ProcessPool.ccg -o $ $^ -g -stdc11 .PHONY:clean clean:rm -f ProcessPoolTask.hpp #pr…...

【OpenGL】OpenGL游戏案例(二)
文章目录 特殊效果数据结构生成逻辑更新逻辑 文本渲染类结构构造函数加载函数渲染函数 特殊效果 为提高游戏的趣味性,在游戏中提供了六种特殊效果。 数据结构 PowerUp 类只存储存活数据,实际逻辑在游戏代码中通过Type字段来区分执行 class PowerUp …...

28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
这篇文章是《.NET 8 实战–孢子记账–从单体到微服务》系列专栏的《单体应用》专栏的最后一片和开发有关的文章。在这片文章中我们一起来实现一个数据统计的功能:报表数据汇总。这个功能为用户查看月度、年度、季度报表提供数据支持。 一、需求 数据统计方面&…...

Java 泛型<? extends Object>
在 Java 泛型中,<? extends Object> 和 <?> 都表示未知类型,但它们在某些情况下有细微的差异。泛型的引入是为了消除运行时错误并增强类型安全性,使代码更具可读性和可维护性。 在 JDK 5 中引入了泛型,以消除编译时…...

FPGA|使用quartus II通过AS下载POF固件
1、将开发板设置到AS下载挡位,或者把下载线插入到AS端口 2、打开quartus II,选择Tools→Programmer→ Mode选择Active Serial Programming 3、点击左侧Add file…,选择 .pof 文件 →start 4、勾选program和verify(可选࿰…...

“新月之智”智能战术头盔系统(CITHS)
新月人物传记:人物传记之新月篇-CSDN博客 相关文章链接(更新): 星际战争模拟系统:新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 目录 一、引言 二、智能头盔控制系统概述 三、系统架…...

php:代码中怎么搭建一个类似linux系统的crontab服务
一、前言 最近使用自己搭建的php框架写一些东西,需要用到异步脚本任务的执行,但是是因为自己搭建的框架没有现成的机制,所以想自己搭建一个类似linux系统的crontab服务的功能。 因为如果直接使用linux crontab的服务配置起来很麻烦࿰…...

【LeetCode: 958. 二叉树的完全性检验 + bfs + 二叉树】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

MinDoc 安装与部署
下载可执行文件 mindoc mindoc_linux_amd64.zip 上传并解压压缩包 cd /opt mkdir mindoc cd mindocunzip mindoc_linux_amd64.zip 创建数据库 CREATE DATABASE mindoc_db DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; 配置数据库 将解压目录下 conf/app.conf.exam…...

从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(基础组件实现)
目录 基础组件实现 如何将图像和文字显示到OLED上 如何绘制图像 如何绘制文字 如何获取字体? 如何正确的访问字体 如何抽象字体 如何绘制字符串 绘制方案 文本绘制 更加方便的绘制 字体附录 ascii 6x8字体 ascii 8 x 16字体 基础组件实现 我们现在离手…...

windows系统如何检查是否开启了mongodb服务
windows系统如何检查是否开启了mongodb服务!我们有很多软件开发,网站开发时候需要使用到这个mongodb数据库,下面我们看看,如何在windows系统内排查,是否已经启动了本地服务。 在 Windows 系统上,您可以通过…...

VS安卓仿真器下载失败怎么办?
如果网络不稳定,则VS的安卓仿真器很容易下载失败,如下 Downloaded file <USER_HOME>\AppData\Local\Temp\xamarin-android-sdk\x86_64-35_r08.zip not found for Android SDK archive https://dl.google.com/android/repository/sys-img/google_a…...

计算机网络一点事(24)
TCP可靠传输,流量控制 可靠传输:每字节对应一个序号 累计确认:收到ack则正确接收 返回ack推迟确认(不超过0.5s) 两种ack:专门确认(只有首部无数据) 捎带确认(带数据…...

视频拼接,拼接时长版本
目录 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg imageio,适合视频较短 视频较长,分辨率较大,这个效果很好,不耗用内存 ffmpeg import subprocess import glob import os from nats…...

制造企业的成本核算
一、生产成本与制造费用的区别 (1)生产成本,是直接用于产品生产,构成产品实体的材料成本。 包括企业在生产经营过程中实际消耗的原材料、辅助材料、备品备件、外购半成品、燃料、动力包装物以及其它直接材料,和直接参加产品生产的工人工资,以及按生产工人的工资总额和规…...

doris:高并发导入优化(Group Commit)
在高频小批量写入场景下,传统的导入方式存在以下问题: 每个导入都会创建一个独立的事务,都需要经过 FE 解析 SQL 和生成执行计划,影响整体性能每个导入都会生成一个新的版本,导致版本数快速增长,增加了后台…...

LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略
LLMs之WebRAG:STORM/Co-STORM的简介、安装和使用方法、案例应用之详细攻略 目录 STORM系统简介 1、Co-STORM 2、更新新闻 STORM系统安装和使用方法 1、安装 pip安装 直接克隆GitHub仓库 2、模型和数据集 两个数据集 FreshWiki数据集 WildSeek数据集 支持…...

鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)_鸿蒙arkui tab 切换动画
PageTransitionExit({type?: RouteType,duration?: number,curve?: Curve | string,delay?: number}) 在HarmonyOS中,PageTransitionEnter和PageTransitionExit是用于控制页面切换动画的参数。它们分别表示页面进入和退出时的动画。1. type(动画类型…...

图漾相机-ROS2-SDK-Ubuntu版本编译(新版本)
文章目录 前言1.Camport ROS2 SDK 介绍1.1 Camport ROS2 SDK源文件介绍1.2 Camport ROS2 SDK工作流程1.2.1 包含头文件1.2.2 2 初始化 ROS 2 节点1.2.3 创建节点对象1.2.4 创建发布者对象并实现发布逻辑1.2.5 启动 ROS 2 1.3 ROS2 SDK环境配置与编译1.3.1 Ubuntu 20.04 下ROS2 …...