• 曾轼麟
    2019-08-06
    老师控制器选举是不是漏了一个环节,重新选出的controller会增加epoch的值,避免旧的controller复活导致出现两个控制器

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

     1
     10
  • nightmare
    2019-08-01
    类似rocket mq写一个name server的注册模块出来,代替zookeeper ,从而实现 控制器选举 ,元数据共享,还有broker信息注册等功能
    
     9
  • Stony.修行僧
    2019-08-02
    KIP-500: Replace ZooKeeper with a Self-Managed Metadata Quorum
    了解一下

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

     1
     6
  • QQ怪
    2019-08-01
    我也想知道rocketmq的name server和用zk的区别和优劣势?
    
     4
  • Dovelol
    2019-08-01
    老师好,想问下rocketmq的name server和用zk的区别和优劣势是什么呢?
    
     2
  • 注定非凡
    2019-11-10
    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容易成为系统的瓶颈。
    展开
    
     1
  • icejoywoo
    2019-08-09
    基于raft搞一套来替代zookeeper?

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

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

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

    谢谢老师!
    展开

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

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

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

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

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

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

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

    
     1
  • 小罗希冀
    2020-01-27
    要减少对zookeeper的依赖,可以效仿redis的sentinel模式?
    运行几个特殊状态下的broker,用做检测普通broker集群中,broker主动被动宕机,集群元数据管理等
    
    
  • 云师兄
    2019-10-24
    社区改造单线程加队列的方式,有没有数据或者图标对比下改造前后性能的差异?

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

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

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

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

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

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

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

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

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

    
    
  • godtrue
    2019-08-18
    小结一下
    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-08
    修改主题分区的broker_host是随便指定一个吗?最后由zk通知到控制器?
    作者: 其实如果指定的是broker host,后面是不走ZooKeeper的

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

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

    
    
我们在线,来聊聊吧