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核心技术与实战
登录|注册

26 | 你一定不能错过的Kafka控制器

胡夕 2019-08-01
你好,我是胡夕。今天我要和你分享的主题是:Kafka 中的控制器组件。
控制器组件(Controller),是 Apache Kafka 的核心组件。它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群。集群中任意一台 Broker 都能充当控制器的角色,但是,在运行过程中,只能有一个 Broker 成为控制器,行使其管理和协调的职责。换句话说,每个正常运转的 Kafka 集群,在任意时刻都有且只有一个控制器。官网上有个名为 activeController 的 JMX 指标,可以帮助我们实时监控控制器的存活状态。这个 JMX 指标非常关键,你在实际运维操作过程中,一定要实时查看这个指标的值。下面,我们就来详细说说控制器的原理和内部运行机制。
在开始之前,我先简单介绍一下 Apache ZooKeeper 框架。要知道,控制器是重度依赖 ZooKeeper 的,因此,我们有必要花一些时间学习下 ZooKeeper 是做什么的。
Apache ZooKeeper 是一个提供高可靠性的分布式协调服务框架。它使用的数据模型类似于文件系统的树形结构,根目录也是以“/”开始。该结构上的每个节点被称为 znode,用来保存一些元数据协调信息。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Kafka核心技术与实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(30)

  • nightmare
    类似rocket mq写一个name server的注册模块出来,代替zookeeper ,从而实现 控制器选举 ,元数据共享,还有broker信息注册等功能
    2019-08-01
    8
  • 曾轼麟
    老师控制器选举是不是漏了一个环节,重新选出的controller会增加epoch的值,避免旧的controller复活导致出现两个控制器

    作者回复: 嗯嗯,是的。fencing机制很重要的,应该要提一下的

    2019-08-06
    1
    6
  • Stony.修行僧
    KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum
    了解一下

    作者回复: 嗯,看到这个KIP了,最近很火,有人还翻译出来了。事实上这个KIP只是在讨论阶段,目前还没有被accept

    2019-08-02
    6
  • QQ怪
    我也想知道rocketmq的name server和用zk的区别和优劣势?
    2019-08-01
    4
  • Dovelol
    老师好,想问下rocketmq的name server和用zk的区别和优劣势是什么呢?
    2019-08-01
    2
  • icejoywoo
    基于raft搞一套来替代zookeeper?

    作者回复: 嗯,做一组controller,基于Raft算法组成quorum

    2019-08-09
    1
  • 趙衍
    老师好,关于线程的优化,我能否这样理解:之前是为每一个事件分配一个线程,线程本身的切换以及锁会带来繁重的开销。在后续的版本中,讲请求封装成了一个个的事件,采用异步串行化的方式,放入到队列中,由统一的一个线程来轮询这个队列,从而避免了锁的开销。不知道这样的理解是否准确?

    此外,老师说的多个线程之间共享Broker缓内存区域,可否举个例子,在什么情况下他们需要共享内存区域呢?

    谢谢老师!

    作者回复: Controller有个context,里面缓存了很多数据。以前的设计是多个线程会同时访问这些数据,比如topic删除线程、controller线程等。

    2019-08-01
    1
  • never leave
    老师 我自己在虚拟机中搭建的kafka集群 为什么zookeeper的/controller是空的?

    作者回复: 里面没有子节点,但是该节点本身有内容啊。

    2019-08-01
    1
  • Leon📷
    脑裂问题希望详细说说
    2019-08-01
    1
  • 玉剑冰锋
    如何区分临时znode和永久znode?

    作者回复: znode的ephemeralOwner不为0的就是临时节点

    2019-08-01
    2
    1
  • 玉剑冰锋
    如何在测试环境模拟一个重分区hang住的现象?

    作者回复: 可以试试在reassign的过程中删除topic

    2019-08-01
    1
  • 注定非凡
    1作用:
    控制器组件(Controller),是Apache Kafka的核心组件。它的主要作用是Apache Zookeeper的帮助下管理和协调整个Kafka集群。
    集群中任意一台Broker都能充当控制器的角色,但在运行过程中,只能有一个Broker成为控制器。

    2 特点:控制器是重度依赖Zookeeper。
    3 产生:
    控制器是被选出来的,Broker在启动时,会尝试去Zookeeper中创建/controller节点。Kafka当前选举控制器的规则是:第一个成功创建/controller节点的Broker会被指定为控制器。

    4 功能:
    A :主题管理(创建,删除,增加分区)
    当执行kafka-topics脚本时,大部分的后台工作都是控制器来完成的。
    B :分区重分配
    Kafka-reassign-partitions脚本提供的对已有主题分区进行细粒度的分配功能。
    C :Preferred领导者选举
    Preferred领导者选举主要是Kafka为了避免部分Broker负载过重而提供的一种换Leade的方案。
    D :集群成员管理(新增Broker,Broker主动关闭,Broker宕机)
    控制器组件会利用watch机制检查Zookeeper的/brokers/ids节点下的子节点数量变更。当有新Broker启动后,它会在/brokers下创建专属的znode节点。一旦创建完毕,Zookeeper会通过Watch机制将消息通知推送给控制器,这样,控制器就能自动地感知到这个变化。进而开启后续新增Broker作业。
    侦测Broker存活性则是依赖于刚刚提到的另一个机制:临时节点。每个Broker启动后,会在/brokers/ids下创建一个临时的znode。当Broker宕机或主机关闭后,该Broker与Zookeeper的会话结束,这个znode会被自动删除。同理,Zookeeper的Watch机制将这一变更推送给控制器,这样控制器就能知道有Broker关闭或宕机了,从而进行善后。

    E :数据服务
    控制器上保存了最全的集群元数据信息,其他所有Broker会定期接收控制器发来的元数据更新请求,从而更新其内存中的缓存数据。

    5 控制器保存的数据


    控制器中保存的这些数据在Zookeeper中也保存了一份。每当控制器初始化时,它都会从Zookeeper上读取对应的元数据并填充到自己的缓存中。

    6 控制器故障转移(Failover)
    故障转移是指:当运行中的控制器突然宕机或意外终止时,Kafka能够快速地感知到,并立即启用备用控制器来替代之前失败的控制器。

    7 内部设计原理
    A :控制器的内部设计相当复杂
    控制器是多线程的设计,会在内部创建很多线程。如:
    (1)为每个Broker创建一个对应的Socket连接,然后在创建一个专属的线程,用于向这些Broker发送特定的请求。
    (2)控制连接zookeeper,也会创建单独的线程来处理Watch机制通知回调。
    (3)控制器还会为主题删除创建额外的I/O线程。
    这些线程还会访问共享的控制器缓存数据,为了维护数据安全性,控制在代码中大量使用ReetrantLock同步机制,进一步拖慢了整个控制器的处理速度。

    B :在0.11版对控制器的低沉设计进了重构。

    (1)最大的改进是:把多线程的方案改成了单线程加事件对列的方案。

    a. 单线程+队列的实现方式:社区引入了一个事件处理线程,统一处理各种控制器事件,然后控制器将原来执行的操作全部建模成一个个独立的事件,发送到专属的事件队列中,供此线程消费。
    b. 单线程不代表之前提到的所有线程都被干掉了,控制器只是把缓存状态变更方面的工作委托给了这个线程而已。
    (2)第二个改进:将之前同步操作Zookeeper全部改为异步操作。
    a. Zookeeper本身的API提供了同步写和异步写两种方式。同步操作zk,在有大量主题分区发生变更时,Zookeeper容易成为系统的瓶颈。
    2019-11-10
  • 云师兄
    社区改造单线程加队列的方式,有没有数据或者图标对比下改造前后性能的差异?

    作者回复: 据我所知没有性能方面的报告出来。改进最大的收益来自于可理解性和可维护性方面的提升

    2019-10-24
  • B+Tree
    各个broker之间怎样保证元数据的一致性?controller挂了后重新选举的机制是怎样的?

    作者回复: 异步发送元数据来保持一致性。最权威的数据保存在Zk上。当controller挂掉之后,Zk上的临时节点/controller消失,所有存活broker都会感知到这一变化,于是抢注/controller,谁抢上谁就是新的controller

    2019-10-11
    1
  • 谢特
    多个节点之间内存一般怎么共享

    作者回复: 一般不共享内存,甚至什么都不共享, 这就是所谓的Shard-Nothing架构

    2019-10-10
  • 电光火石
    老师好,想问一下:
    1.如何看出重分区被hang住了,是长时间没有响应就被hang住,还是有一些jmx的参数可以观察?
    2.当我们删除/controller的时候,是否会有数据丢失的可能,比如重分区的请求,是否会先存储在zk,然后controler从中读取请求进行处理,这个时候发生重failover,是否新的controller会重新读到这个请求?
    谢谢了

    作者回复: 1. 执行reassign命令总提示分区在reassign中,或者ZooKeeper中的/admin/reassign_partitions下相应节点未被删除
    2. 不会丢失数据,如果真丢失了,果断开jira,因为这是一个严重的bug:)

    2019-09-07
  • 张庆
    胡夕大拿,您好,zookeeper中保存了一份kafka的元数据信息,控制器中也会保存一份。当控制器初始化的时候会从zookeeper中拉一份数据,那么之后zookeeper和controller中的数据怎么保持一致啊?

    作者回复: 每次变更都会更新zookeeper

    2019-08-30
  • godtrue
    小结一下
    1:kafka控制器是什么?
    kafka控制器是kafka的核心组件,kafka集群中任意一台 Broker 都能充当控制器的角色,但是,在运行过程中,只能有一个 Broker 成为控制器,行使其管理和协调的职责。

    2:kafka控制器有什么用?
    它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群。
    2-1:主题管理——主题及主题下的分区的增删改查
    2-2:分区重分配——提供对已有主题分区进行细粒度的分配功能。
    2-3:preferred领导者选举——防止leader负载过重宕机的备份
    2-4:集群成员管理——broker的增删
    2-5:数据服务——向其他 Broker 提供数据服务。控制器上保存了最全的集群元数据信息,其他所有 Broker 会定期接收控制器发来的元数据更新请求,从而更新其内存中的缓存数据

    3:kafka控制器是如何设计和实现的?
    Kafka 当前选举控制器的规则是:第一个成功创建 /controller 节点的 Broker 会被指定为控制器。
    如果运行中的控制器突然宕机或意外终止,Kafka 能够快速地感知到,并立即启用备用控制器来代替之前失败的控制器。
    控制器的内部设计≈单线程+事件队列+异步+请求分类


    2019-08-18
  • 信信
    修改主题分区的broker_host是随便指定一个吗?最后由zk通知到控制器?
    作者: 其实如果指定的是broker host,后面是不走ZooKeeper的

    追问:
    前面文章提到增加分区是控制器完成的。
    那如果随机在一个broker上执行增加分区的命令,再由这个broker通知控制器去做吗?

    作者回复: 客户端会先去找controller所在节点,然后直接给它发送请求

    2019-08-08
  • dream
    老师,突然想到一个与本节无关的问题:如果一台机器系统彻底坏了,不能恢复了,这时候副本肯定会丢一个,kafka 会直接把其它机器中的 一个 Follower 副本提升为 Leader 副本,对外提供服务,但是kafka会自动为其创建新的副本吗?

    作者回复: 不会的

    2019-08-02
收起评论
30
返回
顶部