Kafka的存储模型

有部分内容转自https://www.jianshu.com/p/3e54a5a39683这篇讲的很详细 易懂

Kafka一个Topic可以有多个Partition,多个线程,每个线程负责一个Partition进行读写

每个Paratition可以有多个LogSegment,每个LogSegment文件包括一个日志数据文件和两个索引文件(偏移量索引文件和消息时间戳索引文件)。

以上红字部分就是他的存储模型

其中,每个LogSegment中的日志数据文件大小均相等(该日志数据文件的大小可以通过在Kafka Broker的config/server.properties配置文件的中的“log.segment.bytes”进行设置,默认为1G大小(1073741824字节),在顺序写入消息时如果超出该设定的阈值,将会创建一组新的日志数据和索引文件

Kafka的索引文件是采用稀疏索引的方式,每隔一定的字节数建立了一条索引

所以在添加数据时,如果还没有LogSegment,就会建第一个LogSegment,然后把数据顺序写在该LogSegment的日志数据文件里,然后再把索引加到偏移量索引文件里去

偏移量索引文件的每条索引由offset和position组成,每个索引条目可以唯一确定在各个分区数据文件的一条消息

在查找数据时

先根据Position定位到LogSegment,再根据Position和offset在logSegment找到日志数据文件中对应数据的位置

原理就是这样

<think> 我们正在讨论Kafka的位移模型Kafka的位移(offset)是消费者在分区中消费位置的关键概念。位移模型主要涉及消费者如何管理其消费进度。 需要涵盖以下内容: 1. 位移的存储位置(如__consumer_offsets主题) 2. 位移提交方式(自动提交和手动提交) 3. 位移管理策略(如自动位移重置策略:earliest, latest) 4. 消费者组(Consumer Group)与位移的关系 5. 可能涉及精确一次语义(Exactly-once)中的位移管理 然后根据回答提出3-5个相关问题。 </think> ### Kafka位移模型深度解析 Kafka的位移模型是消息消费位置管理的核心机制,包含以下关键设计: --- #### 1. **位移的本质定义** - **分区级位移**:每个分区独立维护消费位置(Partition Offset) - **位移三元组**:`<消费者组, 主题, 分区> → 位移值` - **位移值特性**: - 单调递增的64位整数 - 仅表示消费顺序(不包含时间戳) #### 2. **位移存储机制** | 存储方式 | 工作原理 | 特点 | |-------------------|--------------------------------------|--------------------------| | __consumer_offsets | 内置compacted主题存储位移 | 高持久化/支持故障恢复 | | 外部存储 | 可配置到DB/Redis(需自定义协调器) | 灵活但增加复杂度 | | 内存存储 | 测试环境临时使用 | 重启后位移丢失 | #### 3. **位移提交策略对比** ```mermaid graph LR A[自动提交] -->|enable.auto.commit=true| B[定时异步提交] C[手动提交] --> D[同步提交] C --> E[异步提交] D --> F[阻塞直至Broker确认] E --> G[无阻塞但可能重复消费] ``` - **自动提交风险**:可能提交未完成处理的位移(导致消息丢失) - **手动提交最佳实践**: ```java while (true) { ConsumerRecords<String, String> records = consumer.poll(100); for (ConsumerRecord record : records) { process(record); // 业务处理 } consumer.commitSync(); // 同步提交确保原子性 } ``` #### 4. **位移重置策略** | 策略 | 触发条件 | 典型场景 | |--------------|---------------------------|--------------------------| | earliest | 无位移或位移过期 | 全量数据回溯 | | latest | 无位移或位移过期 | 仅消费新数据 | | none | 无有效位移 | 抛出NoOffsetException | | timestamp | 指定时间戳 | 精准时间点回溯 | #### 5. **位移管理高级特性** - **事务位移提交**: - 与业务操作绑定原子提交(实现Exactly-Once语义) - 依赖事务协调器(Transaction Coordinator) - **增量位移提交**: - 允许提交特定分区位移(`commitSync(Map<TopicPartition, OffsetAndMetadata>)`) - **位移查询API**: - `endOffsets()`获取分区末端位移 - `position()`获取当前消费位置 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值