kafka 中到底是怎么通过 __consumer_offsets 存储消费位移的

我们知道老版本的消费位移信息是存储的zookeeper 中的, 但是zookeeper 并不适合频繁的写入查询操作,所以在新版本的中消费位移信息存放在了__consumer_offsets内置topic中

那么__consumer_offsets topic 到底是怎么存储我们的消费位移信息呢?

1. 创建topic consumer_offsets_test

bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic consumer_offsets_test --replication-factor 1 --partitions 3

2. 查看topic是否创建成功

bin/kafka-topics.sh --zookeeper localhost:2181 --topic consumer_offsets_test --describe
Topic:consumer_offsets_test    PartitionCount:3    ReplicationFactor:1    Configs:
    Topic: consumer_offsets_test    Partition: 0    Leader: 0    Replicas: 0    Isr: 0
    Topic: consumer_offsets_test    Partition: 1    Leader: 1    Replicas: 1    Isr: 1
    Topic: consumer_offsets_test    Partition: 2    Leader: 2    Replicas: 2    Isr: 2

 3. 使用kafka-console-producer.sh脚本生产消息 生产10条消息

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic consumer_offsets_test

依次输入10条信息 ^C 退出

4.验证消息是否生产成功

bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic consumer_offsets_test --time -1
consumer_offsets_test:0:3
consumer_offsets_test:1:4
consumer_offsets_test:2:4 

 这里我生产了11条信息,当时kafka-console-producer.sh 多生产了一条

5.创建消费组 消费信息

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic consumer_offsets_test --from-beginning --group consumer_offsets_group

消费完信息 ^C 退出

记住刚才创建consumer_offsets_group 消费组ID 稍后会用到

6. 查询consumer_offsets_group 在 __consumer_offsets topic 中存放的位移信息
__consumer_offsets 默认分区50 那么我们的consumer_offsets_group的位移信息是放到那个分区里面了呢?

通过如下公式即可获取:
Math.abs("consumer_offsets_group".hashCode()) % 50

结果放在了11分区上

7.获取对应分区的位移信息
 在获取__consumer_offsets 信息之前需要设置consumer.properties中exclude.internal.topics=false
 因为__consumer_offsets 属于内置 topic

bin/kafka-console-consumer.sh --topic __consumer_offsets --partition 11 --bootstrap-server localhost:9092 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --consumer.config config/consumer.properties --from-beginning

[consumer_offsets_group/*消费组ID*/,consumer_offsets_test/*topic*/,1/*partition*/]::OffsetAndMetadata(offset=4/*提交的消费位移信息*/, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567461031, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,0]::OffsetAndMetadata(offset=3, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567461031, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,2]::OffsetAndMetadata(offset=4, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567461031, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,1]::OffsetAndMetadata(offset=4, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567466027, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,0]::OffsetAndMetadata(offset=3, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567466027, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,2]::OffsetAndMetadata(offset=4, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567466027, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,1]::OffsetAndMetadata(offset=4, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567468638, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,0]::OffsetAndMetadata(offset=3, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567468638, expireTimestamp=None)
[consumer_offsets_group,consumer_offsets_test,2]::OffsetAndMetadata(offset=4, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1543567468638, expireTimestamp=None)

<think>好的,我现在需要回答用户关于Kafka中__consumer_offsets主题的作用和功能的问题。首先,我得先回忆一下自己对这个主题的了解,或者查阅相关资料确保准确性。根据用户提供的引用内容,特别是引用[1]、[2]、[4],里面提到了consumer_offsetsKafka的内部主题,用于跟踪消费者组的消费进度。 首先,我需要明确这个主题的基本作用。用户可能想知道它为什么存在,以及它在Kafka的消息消费机制中扮演什么角色。根据引用[1],consumer_offsets用于管理消费者组的消费进度,确保消息被可靠消费。所以,我应该解释这个主题的主要功能是记录每个消费者组在各个分区的消费偏移量,也就是offset。 接下来,考虑到用户可能对技术细节感兴趣,比如这个主题的数据结构或存储方式。根据引用[2]和[3],__consumer_offsets使用Log Compaction策略来清理数据,保留每个key的最新值。这里的key应该是消费者组、主题和分区的组合,而value是对应的offset。因此,需要说明这种清理策略如何帮助节省存储空间,同时保证数据的有效性。 用户可能还会想知道如何查看或管理这个主题的数据。引用[4]给出了一个使用kafka-console-consumer.sh命令查看__consumer_offsets内容的例子,这里用到了特定的formatter来解析消息。这部分可以作为实际操作或监控的参考,但用户的问题主要是用途和功能,可能不需要深入命令细节,但可以简要提及。 另外,需要解释为什么这个主题重要。例如,在消费者重启或发生故障时,Kafka可以通过读取__consumer_offsets中的offset来恢复消费,避免重复消费或丢失消息。同时,引用[2]提到如果该主题占用磁盘空间过大,可能需要调整清理策略或配置,这也说明了管理该主题的重要性。 需要注意的是,用户提供的引用中,引用[2]和[3]都涉及清理策略的问题,可能用户在实际使用中遇到了存储问题,所以他们在提问时可能也关心如何优化或维护这个主题。不过用户当前的问题明确询问的是作用和功能,所以应集中在解释其用途,但可以在相关问题时提到存储管理的问题。 在组织回答时,应该分点说明,结构清晰。例如,首先介绍基本功能,然后详细说明记录消费位移、支持消费者组恢复、数据清理策略、监控和管理等方面。同时,结合引用中的信息,适当添加引用标记,如[^1]、[^2]等,确保信息的来源正确。 最后,生成的相关问题需要围绕用户可能进一步关心的点,比如如何优化该主题的存储、如何查看其内容,或者与其他机制的对比等。例如,如何监控consumer_offsets的大小,或者Kafka如何确保offset的可靠性等。 现在需要确保回答符合用户的要求:使用中文,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式,所以可以忽略。同时,回答要结构清晰,分点说明,引用正确,并生成相关问题。</think>### Kafka __consumer_offsets 主题的作用与功能 Kafka 的 `__consumer_offsets` 是用于**跟踪和管理消费者组消费进度**的核心内部主题,其核心功能如下: #### 1. **记录消费位移(Offset)** - 每个消费者组(Consumer Group)在消费分区(Partition)时,会定期将当前消费位移(Offset)提交到 `__consumer_offsets` 主题中[^1]。 - 位移表示消费者在分区中已成功处理的最新消息位置。例如,若消费者组 `group1` 在主题 `test` 的分区 `0` 提交了 Offset=100,则后续消费会从第 101 条消息开始。 #### 2. **支持消费者组的故障恢复** - 当消费者组发生重启或扩容时,Kafka 通过读取 `__consumer_offsets` 中存储位移值,快速定位到断点位置,避免重复消费或消息丢失[^1]。 - 例如,消费者组因故障重启后,可通过 `group.id` 从该主题中恢复消费进度。 #### 3. **数据清理策略(Log Compaction)** - `__consumer_offsets` 采用**日志压缩(Log Compaction)**策略[^2]: - 每个键(Key)对应消费者组、主题、分区的唯一组合。 - 仅保留每个键的最新位移值,历史值会被清理。 - 这种策略节省存储空间,同时确保消费者组始终能获取到最新进度。 #### 4. **监控与管理** - 可通过 Kafka 工具查看该主题内容,例如使用以下命令解析消息格式: ```bash bin/kafka-console-consumer.sh --topic __consumer_offsets --formatter "kafka.coordinator.group.OffsetsMessageFormatter" ``` 这将显示消费者组、主题、分区与位移的映射关系[^4]。 - 若该主题占用磁盘过大(如引用[2]中提到的 71G 问题),需检查清理策略是否生效,或调整配置参数(如 `offsets.retention.minutes`)。 #### 5. **与消费者提交策略的关联** - 消费者的位移提交方式(自动提交或手动提交)直接影响 `__consumer_offsets` 的更新频率。 - 高频提交会增加该主题的写入压力,低频提交可能增加重复消费风险。 --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值