Kafka核心技术与实战
胡夕
人人贷计算平台部总监,Apache Kafka Contributor
立即订阅
8408 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么要学习Kafka?
免费
Kafka入门 (5讲)
01 | 消息引擎系统ABC
02 | 一篇文章带你快速搞定Kafka术语
03 | Kafka只是消息引擎系统吗?
04 | 我应该选择哪种Kafka?
05 | 聊聊Kafka的版本号
Kafka的基本使用 (3讲)
06 | Kafka线上集群部署方案怎么做?
07 | 最最最重要的集群参数配置(上)
08 | 最最最重要的集群参数配置(下)
客户端实践及原理剖析 (14讲)
09 | 生产者消息分区机制原理剖析
10 | 生产者压缩算法面面观
11 | 无消息丢失配置怎么实现?
12 | 客户端都有哪些不常见但是很高级的功能?
13 | Java生产者是如何管理TCP连接的?
14 | 幂等生产者和事务生产者是一回事吗?
15 | 消费者组到底是什么?
16 | 揭开神秘的“位移主题”面纱
17 | 消费者组重平衡能避免吗?
18 | Kafka中位移提交那些事儿
19 | CommitFailedException异常怎么处理?
20 | 多线程开发消费者实例
21 | Java 消费者是如何管理TCP连接的?
22 | 消费者组消费进度监控都怎么实现?
深入Kafka内核 (5讲)
23 | Kafka副本机制详解
24 | 请求是怎么被处理的?
25 | 消费者组重平衡全流程解析
26 | 你一定不能错过的Kafka控制器
27 | 关于高水位和Leader Epoch的讨论
管理与监控 (12讲)
28 | 主题管理知多少?
29 | Kafka动态配置了解下?
30 | 怎么重设消费者组位移?
31 | 常见工具脚本大汇总
32 | KafkaAdminClient:Kafka的运维利器
33 | Kafka认证机制用哪家?
34 | 云环境下的授权该怎么做?
35 | 跨集群备份解决方案MirrorMaker
36 | 你应该怎么监控Kafka?
37 | 主流的Kafka监控框架
38 | 调优Kafka,你做到了吗?
39 | 从0搭建基于Kafka的企业级实时日志流处理平台
高级Kafka应用之流处理 (3讲)
40 | Kafka Streams与其他流处理平台的差异在哪里?
41 | Kafka Streams DSL开发实例
42 | Kafka Streams在金融领域的应用
结束语 (1讲)
结束语 | 以梦为马,莫负韶华!
特别放送 (2讲)
加餐 | 搭建开发环境、阅读源码方法、经典学习资料大揭秘
用户故事 | 黄云:行百里者半九十
Kafka核心技术与实战
登录|注册

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

胡夕 2019-07-09
你好,我是胡夕。今天我要和你分享的内容是: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/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(54)

  • 海贼王
    相对于zookeeper方案可能的劣势是,kafka得保证offset topic的读写都是线性一致的。

    但是有个疑惑,如果kafka自己实现了类似zab协议的话,那写性能会比zk高吗

    作者回复: hmm.... 哈哈哈,不知道。。。。

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

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

    2019-07-09
    5
  • 蛋炒番茄
    “自动提交位移有一个显著的优点,就是省事,你不用操心位移提交的事情,就能保证消息消费不会丢失”,对于这一点我表示疑问啊❓我记得你在之前的章节里面讲过自动提交不仅会增加消息可重复消费的可能,也可能导致部分消息丢失。比如说虽然消息拉取下来但是还没消费完就已经提交,此时服务挂了这样情况。
    2019-07-09
    4
  • 耿斌
    与 ZooKeeper 方案相比,它可能的劣势;
    想到的是,当集群中有一台 Broker 故障下线,可能会造成 __consumer_offset 丢失,导致重复消费
    2019-07-24
    2
    3
  • Coder4
    老师好,前几年一直有个说法,说kafka不适合创建过多topic,请问现在的新版还有这个问题么?

    作者回复: topic过多其实是指分区数过多。会有两个可能的问题:1. controller无法管理这么多分区;2. 分区数过多导致broker物理随机IO增加,减少吞吐量。

    第一个问题社区算是修复了吧,目前单controller能够支持20w的分区数,况且社区也在考虑做多controller方案;第二个问题目前没有太多直接的修复举措,只能说具体问题具体分析吧

    2019-07-11
    2
  • 永光
    位移主题,适用于高频写的操作,为什么ZooKeeper不适用于这种高频的写操作?zookeeper 也可以按照<Group ID,主题名,分区号 > 来写入呀?

    作者回复: ZooKeeper本身只是一个分布式协调框架,znode中保存的数据多是那些不怎么频繁修改的元数据,本身不适合频繁更新。

    是的,旧版本consumer就是这么使用ZooKeeper来保存位移的

    2019-07-11
    1
    2
  • nightmare
    比如多个线程同时消费一个分区的话,位移这么处理
    2019-07-09
    3
    2
  • yyyiue
    请问offset是以最新的为准,还是值最大的为准?

    作者回复: 最新的

    2019-07-09
    1
    2
  • 注定非凡
    1,诞生背景
    A :老版本的Kafka会把位移信息保存在Zk中,当Consumer重启后,自动从Zk中读取位移信息。这种设计使Kafka Broker不需要保存位移数据,可减少Broker端需要持有的状态空间,有利于实现高伸缩性。
    B :但zk不适用于高频的写操作,这令zk集群性能严重下降,在新版本中将消费者的位移数据作为一条条普通的Kafka消息,提交至内部主题(_consumer_offsets)中保存。实现高持久性和高频写操作。

    2,特点:
    A :位移主题是一个普通主题,同样可以被手动创建,修改,删除。。
    B :位移主题的消息格式是kafka定义的,不可以被手动修改,若修改格式不正确,kafka将会崩溃。
    C :位移主题保存了三部分内容:Group ID,主题名,分区号。

    3,创建:
    A :当Kafka集群中的第一个Consumer程序启动时,Kafka会自动创建位移主题。也可以手动创建
    B :分区数依赖于Broker端的offsets.topic.num.partitions的取值,默认为50
    C :副本数依赖于Broker端的offsets.topic.replication.factor的取值,默认为3

    4,使用:
    A :当Kafka提交位移消息时会使用这个主题
    B :位移提交得分方式有两种:手动和自动提交位移。
    C :推荐使用手动提交位移,自动提交位移会存在问题:只有consumer一直启动设置,他就会无限期地向主题写入消息。

    5,清理:
    A :Kafka使用Compact策略来删除位移主题中的过期消息,避免位移主题无限膨胀。
    B :kafka提供专门的后台线程定期巡检待compcat的主题,查看是否存在满足条件的可删除数据。

    6,注意事项:
    A :建议不要修改默认分区数,在kafka中有些许功能写死的是50个分区
    B :建议不要使用自动提交模式,采用手动提交,避免消费者无限制的写入消息。
    C :后台定期巡检线程叫Log Cleaner,若线上遇到位移主题无限膨胀占用过多磁盘,应该检查此线程的工作状态。
    2019-11-03
    1
  • 🤡
    对GroupId 还有疑惑,假设一个Group下有 3 个Consumer , 那这三个Consumer 对应的groupid 应该是一样的。这样的话怎么做key做唯一区分呢

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

    2019-08-12
    1
  • 宋晓明
    老师 消息从producer到broker里的partition其实都是有序的,这是kafka的机制保证的,那么假如我的consumer是单线程的,也能保证消费是有序的,但是吞吐量就下降了。如果consumer是多线程,如果保证有序性?

    作者回复: 如果是多个分区,即使是但consumer线程,也没法保证全局的顺序性。这是无法规避的

    2019-07-30
    1
  • ban
    老师,你说偏移量都保存到了__consumer_offsets,确实看到生成了,但是为什么我在zk还是能看到偏移量信息,记录在
    consumers/{group}/offsets/{topic}/{partition}。
    这两个有什么区别吗,还是说zk会记录还是因为我们的程序手动改成提交到zk里面了。

    作者回复: 如果使用使用老版本consumer,还是会记录在ZooKeeper中的

    2019-07-10
    1
    1
  • 玉剑冰锋
    不好意思老师,地铁上有点匆忙提问的问题没有描述清楚,我想的问的是1.文章提到__consumer_offset这个topic记录的offset信息和zk中记录的offset信息有啥区别?
    2.__consumer_offset这个topic我线上环境没有副本,文章提到副本默认是3,是我配置的问题吗?发现这个问题以后我就在线添加副本,过去好几天了仍然有十几个in progress,另外有没有办法强制终止掉这个任务重新添加副本?

    作者回复: 1. 没什么区别。你可以简单认为就是换个地方保存:)
    2. 这个其实是个bug,不过现在已经修复了。如果reassign hang住了,手动删除Zk下对应的znode就能恢复

    2019-07-10
    1
  • 玉剑冰锋
    现在kafka中同样还在使用zk,每个主题也会记录位移,跟主题位移有啥区别?另外我线上主题位置没有副本,之前从来没动过,这是啥原因导致的?

    作者回复: “每个主题也会记录位移,跟主题位移有啥区别” 这是什么意思呢?没看懂。。。。

    “我线上主题位置没有副本” 这又是什么意思呢。。。

    2019-07-10
    1
  • nico
    大神 Kafka可以发送 定时消息吗,制定某一时刻接受到消息 拜托🙏

    作者回复: 需要自己写代码实现,Kafka没有天然提供这个功能

    2019-07-09
    1
    1
  • 张天屹
    对于自动提交位移这里有两点疑惑,第一个老师说“能够避免消息丢失”,那如果自动提交之后,业务处理失败呢,不久丢失消息了吗?第二个老师说“最新消息为100,没有继续生产,这个时候消费者会不断自动提交最新位移100”,既然没有消费了,为什么还要提交呢?消费了100就提交100,之后没有消费就意味着位移没变,为啥还要提交呢?这两个问题的根源都在于不是很清楚自动位移提交的触发条件,是消费就触发吗?还是没有发生异常就触发?还是定时触发?

    作者回复: 现在自动提交位移的设计就是不管你有没有消费,就是阶段性地提交位移,即使是提交相同的位移

    2019-11-28
  • feifei
    为什么我的kafka consumer自动创建的位移主题没有副本,就只有50个分区

    作者回复: 比较老的版本中offsets.topic.replication.factor参数值并不会被严格遵守,你可以手动将__consumer_offsets的rf值调高

    2019-11-18
  • pain
    那么消费者怎么获取到自己要消费的那个分区的位移呢?是通过消费位移主题的数据吗?

    作者回复: 对的,要消费的位移是通过从位移主题获取的

    2019-10-29
  • 寂静欢喜
    想问老师,consumer offset 本身就是个主题。它是怎么实现自己offset 管理的

    作者回复: Kafka自己管理的,其实和普通主题原理是类似的

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

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

    2019-10-14
    1
收起评论
54
返回
顶部