Kafka 核心技术与实战
胡夕
Apache Kafka Committer,老虎证券技术总监
52815 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
开篇词 (1讲)
结束语 (1讲)
Kafka 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

16 | 揭开神秘的“位移主题”面纱

位移主题与ZooKeeper方案的比较
定期巡检待Compact的主题
使用Compaction策略删除过期消息
自动提交位移和手动提交位移
Consumer提交位移时会写入该主题
可手动创建,分区数和副本数可自定义
Kafka集群中第一个Consumer程序启动时自动创建
3种消息格式:Consumer Group信息、删除Group过期位移、保存位移值
保存Kafka消费者的位移信息
要求高持久性和支持高频的写操作
将Consumer的位移数据作为Kafka消息提交到__consumer_offsets中
新版本Consumer推出全新的位移管理机制,包括位移主题
Kafka社区在0.8.2.x版本开始酝酿修改设计
旧版Consumer的位移管理依赖于ZooKeeper
开放讨论
消息删除策略
用途
创建方式
消息格式
位移管理机制
背景及原因
位移主题
Kafka中神秘的内部主题(Internal Topic)__consumer_offsets

该思维导图由 AI 生成,仅供参考

你好,我是胡夕。今天我要和你分享的内容是:Kafka 中神秘的内部主题(Internal Topic)__consumer_offsets。
__consumer_offsets 在 Kafka 源码中有个更为正式的名字,叫位移主题即 Offsets Topic。为了方便今天的讨论,我将统一使用位移主题来指代 __consumer_offsets。需要注意的是,它有两个下划线哦。
好了,我们开始今天的内容吧。首先,我们有必要探究一下位移主题被引入的背景及原因,即位移主题的前世今生。
在上一期中,我说过老版本 Consumer 的位移管理是依托于 Apache ZooKeeper 的,它会自动或手动地将位移数据提交到 ZooKeeper 中保存。当 Consumer 重启后,它能自动从 ZooKeeper 中读取位移数据,从而在上次消费截止的地方继续消费。这种设计使得 Kafka Broker 不需要保存位移数据,减少了 Broker 端需要持有的状态空间,因而有利于实现高伸缩性。
但是,ZooKeeper 其实并不适用于这种高频的写操作,因此,Kafka 社区自 0.8.2.x 版本开始,就在酝酿修改这种设计,并最终在新版本 Consumer 中正式推出了全新的位移管理机制,自然也包括这个新的位移主题。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka位移主题__consumer_offsets在Kafka中扮演着重要的角色,用于保存消费者的位移信息。该主题通过将位移数据作为普通的Kafka消息提交到__consumer_offsets中,实现了高持久性和支持高频的写操作。位移主题的消息格式包括保存Consumer Group信息的消息、用于删除Group过期位移的消息以及用于删除Group信息的tombstone消息。位移主题通常在Kafka集群中第一个Consumer程序启动时自动创建,分区数和副本数由相应的Broker端参数控制。Kafka Consumer提交位移的方式有自动提交和手动提交两种,其中手动提交位移需要开发者承担位移提交的责任。此外,Kafka使用Compact策略来删除位移主题中的过期消息,避免该主题无限期膨胀。对于同一个Key的两条消息,如果早于后一条消息,则被视为过期消息。Kafka提供了专门的后台线程Log Cleaner来定期巡检待Compact的主题,以删除满足条件的可删除数据。这些技术特点使得位移主题在Kafka中具有重要意义,对于理解Kafka的位移管理机制和消费者位移信息的保存具有重要意义。文章总结了Kafka位移主题__consumer_offsets的重要性和作用,以及其消息格式、提交方式和管理策略。通过将元数据以消息的方式存入Kafka内部主题,Kafka实现了高持久性和高吞吐量,满足了子服务的需求,避免了对外部系统的依赖。与ZooKeeper方案相比,位移主题可能存在的劣势需要进一步思考和讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Kafka 核心技术与实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(126)

  • 最新
  • 精选
  • 此方彼方Francis
    之前遇到过的一个问题跟大家分享一下,原因描述不正确的地方还请大佬指正: log cleaner线程挂掉还有可能导致消费端出现:Marking Coordinator Dead! 原因大概如下: log cleaner线程挂掉之后会导致磁盘上位移主题的文件越来越多(当然,大部分是过期数据,只是依旧存在),broker内存中会维护offsetMap,从名字上看这个map就是维护消费进度的,而这个map和位移主题的文件有关联,文件越来越多会导致offsetMap越来越大,甚至导致offsetMap构建失败(为什么会失败没有搞明白),offsetMap构建失败之后broker不会承认自己是coordinator。 消费者组找coordinator的逻辑很简单:abs(consumer_groupName.hashCode) % __consumer_offset.partition.num对应的partition所在的broker就是这个group的coordinate,一旦这个broker的offsetMap构建失败,那么这个broker就不承认自己是这个group的coordinate,这个group的消费就无法继续进行,会出现Marking Coordinator Dead错误。 此时需要删除过期的位移主题的文件(根据文件名很容易确定哪个是最新的),重启broker。重启过程中需要关注log cleaner是否会再次挂掉。 PS:上述问题在broker重启和正常运行中都有可能遇到。

    作者回复: 是个很好的梳理思路~

    2020-02-14
    7
    59
  • Eco
    有个问题想请教一下,这个位移主题,Consumer是像消费其他主题的分区的内容一样去获取数据的话,那么这本身不也得有个位移,那这个位移又保存到哪里的呢?这样下去不就陷入了一个死循环了吗?要么就不是像正常的消费消息那样去从位移主题获取当前消费者对于某个主题的分区的位移?

    作者回复: 好问题!其实Kafka并不太关注__consumer_offsets消费的情况,不过Coordinator的确会在JVM中把所有分区当前已提交的最新位移缓存起来,并且通过这个缓存来决定哪个consumer当前消费到了哪个位移。

    2020-01-15
    7
    28
  • mellow
    老师能讲一下,同一个group下的consumer启动之后是怎么去offset topic 拿到该group上次消费topic每个partition的最新offset呢?是根据key来定位offset topic的partition吗,然后拿到所有消息得到最新的offset吗

    作者回复: 它会去寻找其Coordinator Leader副本对应的broker去拿。根据group.id找到对应Coordinator的分区数

    2019-07-09
    5
    23
  • 王藝明
    老师好! 为什么位移主题写入消息时,不直接替换掉原来的数据,像 HashMap 一样呢?而是要堆积起来,另起线程来维护位移主题

    作者回复: 位移主题也是主题,也要遵循Kafka底层的日志设计思路,即append-only log

    2019-10-14
    3
    21
  • sharpdeep
    有个困惑: 位移主题用来记住位移,那么这个位移主题的位移由谁来记住呢?

    作者回复: 位移主题的位移由Kafka内部的Coordinator自行管理

    2020-03-26
    2
    15
  • 🤡
    对GroupId 还有疑惑,假设一个Group下有 3 个Consumer , 那这三个Consumer 对应的groupid 应该是一样的。这样的话怎么做key做唯一区分呢

    作者回复: 每个client都有自己的member id和client id用于区分彼此

    2019-08-12
    3
    14
  • HZ
    老师 有两点不太清楚 1. 位移主题里面,对于同一个consumer group的位移提交记录,是分布在50个partitions中吗? 2. 如果把位移主题当作kafka里面的一个普通主题,那么写入这个主题的数据可以保证不丢失吗? 写入是ack=all? 同时,broker端的min.insync.replicas的设置有影响吗?

    作者回复: 1. 同一个group的位移记录只保存在一个partition上 2. 没错,写入就是acks=all的设置 3. min.insync.replicas对位移主题依然适用

    2020-02-24
    4
    13
  • 西边一抹残阳
    胡老师,消费者提交的位移消息,保存到位移主题分区是随机的吗?就是某一个消费者的提交第一个位移数据保存在位移主题的A分区里面,第二个位移数据保存在位移主题的B分区里面 还有消费者是怎样获取已消费的位移数据

    作者回复: 不是随机的。通常来说,同一个group下的所有消费者提交的位移数据保存在位移主题的同一个分区下

    2020-01-04
    12
  • 谦寻
    consumer端 日常业务发版呢,那每次发版需要重启consumer不是也会导致Rebalance,这个如何规避

    作者回复: 可以考虑使用standalone consumer,否则group机制无法避免

    2019-07-15
    2
    12
  • Coder4
    老师好,前几年一直有个说法,说kafka不适合创建过多topic,请问现在的新版还有这个问题么?

    作者回复: topic过多其实是指分区数过多。会有两个可能的问题:1. controller无法管理这么多分区;2. 分区数过多导致broker物理随机IO增加,减少吞吐量。 第一个问题社区算是修复了吧,目前单controller能够支持20w的分区数,况且社区也在考虑做多controller方案;第二个问题目前没有太多直接的修复举措,只能说具体问题具体分析吧

    2019-07-11
    4
    9
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部