Kafka offset的维护

上一篇介绍过Kafka的生产者相关的机制,这一篇来介绍一下kafka消息的offset。

由于 Consumer 在消费过程中可能会出现断电宕机等故障,Consumer 恢复后,需要从故障前的位置继续消费。所以 Consumer 需要实时记录自己消费到了哪个 Offset,以便故障恢复后继续消费。

Kafka 0.9 版本之前,Consumer 默认将 Offset 保存在 Zookeeper 中,从 0.9 版本开始,Consumer 默认将 Offset 保存在 Kafka 一个内置的 Topic 中,该 Topic 为 __consumer_offsets。

zookeeper维护

kafka 0.9 以前的版本是将offset 存储在zookeeper上的,kafka在传输数据时,数据消费成功就会修改偏移量,这样就可以保证数据不会丢失而导致传输出错;但是这也存在一个问题:那就是每次消费数据时都要将数据的offset写入一次,效率比较低,而且zookeeper与kafka的offset变化确认也需要走网络IO,这样就会给offset的维护带来不稳定性和低效

验证:

  1. 起一个生产者:bin/kafka-console-producer.sh --topic test --broker-list 10.155.110.21:21007 --producer.config config/producer.properties 在这里插入图片描述
  2. 起一个消费者:bin/kafka-console-consumer.sh --zookeeper 10.155.110.222:2181/kafka --topic test --consumer.config config/consumer.properties
  3. 使用生产者发送一条消息
  4. 连接zookeeper查看offset信息:offset增加了1 在这里插入图片描述 在这里插入图片描述

kafka自己维护offset

kafka 0.9 以后,offset的使用了内部的roker来管理,这样仅仅只需要broker,而不要zookeeper来维护,都是将topic提交给__consumer_offsets函数来执行

验证:

  1. 起一个生产者:bin/kafka-console-producer.sh --topic test --broker-list 10.155.110.21:21007 --producer.config config/producer.properties
  2. 起一个消费者:bin/kafka-console-consumer.sh --bootstrap-server 10.155.110.21:21007 --topic test --new-consumer --consumer.config config/consumer.properties
  3. 确认 consume_group 在哪个__consumer_offsets-?Math.abs(groupID.hashCode()) % numPartitions
  4. 查找__consumer_offsets 分区数中的消费组偏移量offset: 先通过 consume_group 确定分区数; 例如 "szz1-group".hashCode()%50=32; 那我们就知道 szz-group消费组的偏移量信息存放在 __consumer_offsets_32中; bin/kafka-simple-consumer-shell.sh --topic __consumer_offsets --partition 43 --broker-list 10.155.110.21:9092 --formatter "kafka.coordinator.group.GroupMetadataManager$OffsetsMessageFormatter" 在这里插入图片描述
  5. 使用生产者发送一条消息
  6. 观察步骤4中offset变化:offset增加了1 在这里插入图片描述