12、Kafka实战:位移主题

Kafka内部主题(Internal Topic):__Consumer_offsets

一.位移主题

老版本

  • 老版本Cosumer位移管理依托于Apache Zookeeper:他会自动或手动将位移数据提交到Zookeeper保存。
  • 当Consumer重启,它能自动从Zookeeper中读取位移数据,从而在上次消费截止的地方继续消费。
  • 这种设计使kafka Broker不需要保存位移数据,减少Broker端需要持有的状态空间,实现高伸缩性。

新版本

  • 将consumer的位移数据作为一条条普通的kafka消息,提交__consumer_offsets中。
  • 该主题保存kafka消费者的位移信息。

必须实现

  • 必须实现高持久性,支持高频的写操作

二.位移主题的消息格式

位移主题的 Key 中应该保存 3 部分内容:

Group ID,主题名,分区号

  • 保存这些元数据是为了帮助 Kafka 执行各种各样后续的操作,比如删除过期位移消息等。
  • 保存 Consumer Group 信息的消息。
  • 删除 Group 过期位移甚至是删除 Group 的消息。

tombstone消息

墓碑消息---delete mark

  • 何时写入这类消息
  • 一旦某个consumer Group下的所有Consumer实例都停止了他们的位移数据都已经被删除了
  • kafka就会向位移主题对应的分区写入tomstone消息,表示要彻底删除这个Group的信息。

Kafka集群中的第一个consumer程序时,kafka会自动创建位移主题。

位移主题是kafka自动创建的,该主题的分区数是50,副本数是3

consumer提交位移的两种方式:

  • 自动提交位移
  • 手动提交位移

设置参数 enable.auto.commit,默认为自动提交

auto.commit.interval.ms:提交间隔

三.无限制的向位移主题写入消息

  • 自动提交位移:只要consumer一直启动,就会无限的向位移主题写入消息
  • 位移主题会不停写入位移消息,这就要求kafka必须有针对性的对位移主题消息特点的消息删除策略,否则消息会越来越多,撑爆炸整个磁盘。

四.删除位移主题过期消息---Compact 策略(整理)

  • kafka使用Compact策略删除位移主题中的过期消息,避免该主题无限期膨胀
  • 对于同一个key(同一个主题)的两个消息M1和M2,如果M1发送的时间早于M2,那么M1就是过期消息
  • Compact过程就是扫描日志的所有消息,剔除那些过期的消息,然后将剩下的消息整理在一起

*

Kafka专门提供后台线程定期的巡检待Compact主题,这个后台线程叫Log cleaner

生产环境很多都出现过位移主题无限膨胀占用过多磁盘空间的问题,通常是线程挂掉导致。

Kafka 事务是一个内部主题

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: