【kafka原理】 消费者偏移量__consumer_offsets_相关解析

我们在kafka的log文件中发现了还有很多以 __consumer_offsets_的文件夹;总共50个;

由于Zookeeper并不适合大批量的频繁写入操作,新版Kafka已推荐将consumer的位移信息保存在Kafka内部的topic中,即__consumer_offsets topic,并且默认提供了kafka_consumer_groups.sh脚本供用户查看consumer信息。

__consumer_offsets 是 kafka 自行创建的,和普通的 topic 相同。它存在的目的之一就是保存 consumer 提交的位移。
__consumer_offsets 的每条消息格式大致如图所示
在这里插入图片描述
可以想象成一个 KV 格式的消息,key 就是一个三元组:group.id+topic+分区号,而 value 就是 offset 的值。

考虑到一个 kafka 生成环境中可能有很多consumerconsumer group,如果这些 consumer 同时提交位移,则必将加重 __consumer_offsets 的写入负载,因此 kafka 默认为该 topic 创建了50个分区,并且对每个 group.id做哈希求模运算Math.abs(groupID.hashCode()) % numPartitions,从而将负载分散到不同的 __consumer_offsets 分区上。

一般情况下,当集群中第一次有消费者消费消息时会自动创建__consumer_offsets,它的副本因子受 offsets.topic.replication.factor 参数的约束,默认值为3(注意:该参数的使用限制在0.11.0.0版本发生变化),分区数可以通过 offsets.topic.num.partitions 参数设置,默认值为50。

1. 消费Topic消息

打开一个session a,执行下面的消费者命令 ;指定了消费组:szz1-group; topic:szz1-test-topic

bin/kafka-console-consumer.sh --bootstrap-server  xxx1:9092,xxx2:9092,xxx3:9092 --group szz1-group --topic szz1-test-topic

2.产生消息

打开一个新的session b,执行生产消息命令

bin/kafka-console-producer.sh --broker-list  xxx1:9092,xxx2:9092,xxx3:9092  --topic szz1-test-topic

发送几条消息
在这里插入图片描述

然后可以看到刚刚打开的 session a 消费了消息;
在这里插入图片描述

3. 查看指定消费组的消费位置offset

bin/kafka-consumer-groups.sh --bootstrap-server xxx1:9092,xxx2:9092,xxx3:9092 --describe --group szz1-group

在这里插入图片描述
可以看到图中 展示了每个partition 对应的消费者id; 因为只开了一个消费者; 所以是这个消费者同时消费3个partition;
CURRENT-OFFSET: 当前消费组消费到的偏移量
LOG-END-OFFSET: 日志最后的偏移量
CURRENT-OFFSET = LOG-END-OFFSET 说明当前消费组已经全部消费了;

那么我把 session a 关掉;现在没有消费者之后; 我再发送几条消息看看;
在这里插入图片描述
我发送了2条消息之后, partition-0 partition-1LOG-END-OFFSET: 日志最后的偏移量分别增加了1; 但是CURRENT-OFFSET: 当前消费组消费到的偏移量 保持不变;因为没有被消费;

重新打开一个消费组 继续消费*

重新打开session之后, 会发现控制台输出了刚刚发送的2条消息; 并且偏移量也更新了
在这里插入图片描述

4. 从头开始消费 --from-beginning

如果我们用新的消费组去消费一个Topic,那么默认这个消费组的offset会是最新的; 也就是说历史的不会消费
例如下面我们新开一个session c ;消费组设置为szz1-group3

bin/kafka-console-consumer.sh --bootstrap-server   xxx1:9092,xxx2:9092,xxx3:9092 --group szz1-group3    --topic szz1-test-topic

查看消费情况

 bin/kafka-consumer-groups.sh --bootstrap-server  xxx1:9092,xxx2:9092,xxx3:9092  --describe --group szz1-group3

在这里插入图片描述
可以看到CURRENT-OFFSET = LOG-END-OFFSET ;

如何让新的消费组/者 从头开始消费呢? 加上参数 --from-beginning

5.如何确认 consume_group 在哪个__consumer_offsets-? 中

Math.abs(groupID.hashCode()) % numPartitions

6. 查找__consumer_offsets 分区数中的消费组偏移量offset

上面的 3. 查看指定消费组的消费位置offset 中,我们知道如何查看指定的topic消费组的偏移量;
那还有一种方式也可以查询

先通过 consume_group 确定分区数; 例如 "szz1-group".hashCode()%50=32; 那我们就知道 szz-group消费组的偏移量信息存放在 __consumer_offsets_32中;
通过命令

 bin/kafka-simple-consumer-shell.sh --topic __consumer_offsets --partition 32 --broker-list xxx1:9092,xxx2:9092,xxx3:9092 --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter"

在这里插入图片描述
前面的 是key 后面的是value;key由 消费组+Topic+分区数 确定; 后面的value就包含了 消费组的偏移量信息等等

然后接着我们发送几个消息,并且进行消费; 上面的控制台会自动更新为新的offset;

7 查询topic的分布情况

bin/kafka-topics.sh --describe --zookeeper xxx:2181 --topic TOPIC名称

日常运维问题排查=> 滴滴开源LogiKM一站式Kafka监控与管控平台


在这里插入图片描述

kafka_2.10-0.9是Kafka消息队列的一个版本,偏移量重置是指将消费者偏移量重置到指定的位置。 在Kafka消费者组中,每个消费者都会维护一个偏移量Offset),表示当前消费者消费主题时的位置。消费者从指定的偏移量开始读取消息,并且每次消费后会更新自己的偏移量。但有时候,需要将消费者偏移量重置到之前某个特定位置。 偏移量重置可以在以下几种情况下使用: 1. 消费者第一次加入消费者组时,如果没有指定初始的偏移量,可以通过重置偏移量从最早的消息开始消费,或者从最新的消息开始消费。 2. 消费者组内的消费者发生变化,新加入的消费者需要从之前的某个偏移量开始消费。 3. 消费者消费过程中发生错误,无法继续消费或者发生数据丢失,可以通过重置偏移量,使消费者重新从指定位置开始消费。 在kafka_2.10-0.9版本中,可以通过命令行工具kafka-consumer-groups.sh来进行偏移量重置。具体命令如下: ./bin/kafka-consumer-groups.sh --bootstrap-server <kafka_broker> --group <consumer_group> --reset-offsets --to-earliest --topic <topic> 该命令会将指定消费者组的偏移量重置到最早的消息。 此外,还可以根据需要使用--to-latest参数将偏移量重置到最新的消息。如果需要将偏移量重置到一个特定的位置,可以使用--to-offset参数并指定偏移量的值。 需要注意的是,偏移量重置是一项潜在的危险操作,可能会导致数据丢失或重复消费。在进行偏移量重置时,应该谨慎操作,确保了解重置的影响,并且提前备份数据以防止意外情况发生。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石臻臻的杂货铺

不用打赏,加微信,交个朋友就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值