【问题标题】:How many Kafka controllers are there in a cluster and what is the purpose of a controller?一个集群中有多少个 Kafka 控制器,一个控制器的用途是什么?
【发布时间】:2018-09-06 14:03:47
【问题描述】:

Kafka 集群中的 Kafka 控制器负责管理分区领导者和复制。

如果 Kafka 集群中有 100 个代理,控制器是否只是一个 Kafka 代理?那么在这 100 个 broker 中,controller 是 leader 吗?

您如何知道哪个代理是控制器?

Kafka Controller 的管理对于 Kafka 系统管理是否至关重要?

【问题讨论】:

    标签: apache-kafka kafka-cluster


    【解决方案1】:

    Kafka 控制器是 Kafka 集群的大脑。它监控代理的活跃度并对代理失败采取行动。

    集群中只有一个 Kafka 控制器。控制器是集群中的 Kafka 代理之一,除了通常的代理功能外,还负责在现有代理离开集群或代理加入集群时选举分区领导者。

    在集群中启动的第一个代理将通过在 Zookeeper 中创建一个名为“/controller”的临时节点来成为 Kafka 控制器。当其他 broker 启动时,他们也尝试在 Zookeeper 中创建该节点,但会收到“节点已存在”异常,通过该异常他们知道集群中已经选举了一个 Controller。

    当 Zookeeper 没有收到 Controller 的心跳消息时,Zookeeper 中的临时节点会被删除。然后,它通过 Zookeeper 观察者通知集群中的所有其他代理控制器已离开,该观察者再次开始新控制器的新选举。所有其他 broker 将再次尝试创建一个临时节点“/controller”,第一个成功的将被选为新的 Controller。

    集群中可能有多个 Controller。 考虑一种情况,即当前 Kafka 控制器(“Controller_1”)上发生了长时间的 GC(垃圾收集),这是由于 Zookeeper在配置的时间内没有收到来自控制器的心跳消息。这会导致“/controller”节点从 Zookeeper 中删除,并且集群中的另一个代理被选为新的 Controller(“Controller_2”)。

    在这种情况下,我们在集群中有 2 个控制器“Controller_1”和“Controller_2”。 “Controller_1”GC 已完成,它可能会尝试在 Zookeeper 中写入/更新状态。 “Controller_2”还会尝试在 Zookeeper 中写入/更新状态,这可能导致 Kafka 集群与旧 Controller 和新 Controller 的写入不一致。

    为了避免这种情况,每次进行 Controller 选举时都会生成一个新的“epoch”。 每次选举控制器时,它都会通过 Zookeeper 条件递增操作接收到一个新的更高的 epoch。

    有了这个,当旧控制器(“Controller_1”)尝试更新某些东西时,Zookeeper 将当前纪元与旧控制器在其写入/更新请求中发送的旧纪元进行比较,它只是忽略它。 集群中的所有其他代理也知道当前的控制器纪元,如果它们从旧控制器接收到具有较旧纪元的消息,它们也会忽略它。

    【讨论】:

      【解决方案2】:

      在 Kafka 集群中,单个代理充当活动控制器,负责分区和副本的状态管理。因此,在您的情况下,如果您有一个包含 100 个代理的集群,其中一个将充当控制器。

      更多关于集群控制器职责的细节可以在here找到。

      为了找到哪个broker是集群的控制器,你首先需要通过ZK CLI连接到Zookeeper:

      ./bin/zkCli.sh -server localhost:2181 
      

      然后get控制器

      [zk: localhost:2181(CONNECTED) 0] get /controller
      

      输出应如下所示:

      {"version":1,"brokerid":100,"timestamp":"1506423376977"}
      cZxid = 0x191
      ctime = Tue Sep 26 12:56:16 CEST 2017
      mZxid = 0x191
      mtime = Tue Sep 26 12:56:16 CEST 2017
      pZxid = 0x191
      cversion = 0
      dataVersion = 0
      aclVersion = 0
      ephemeralOwner = 0x15ebdd241840002
      dataLength = 56
      numChildren = 0
      

      Zookeeper 是 Kafka 集群状态的存储。它用于一开始或当前控制器崩溃时的控制器选举。当主题的分区领导代理失败/崩溃时,控制器还负责告诉其他副本成为分区领导。

      【讨论】:

      • 你不应该自己删除 Zookeeper 中的控制器条目!它会触发新的控制器选举,但旧控制器不会后退。这意味着您最终会同时拥有两个控制器和一个不健康的 Kafka 集群。
      【解决方案3】:

      控制器是 Kafka 代理之一,它还负责选举分区领导者的任务(除了通常的代理功能)。

      控制器只是一个代理吗?

      一次只有一个控制器。

      在内部,每个代理都尝试在 zookeeper (/controller) 中创建一个临时节点。第一个成功,成为控制器。其他人只是得到一个适当的异常(“节点已经存在”),并在控制器节点上观察。当控制器死亡时,临时节点被移除,并通知观察代理。再次,其中第一个注册成功的临时节点,成为新的控制器,其他人将再次得到“节点已存在”异常并继续等待。

      你怎么知道谁是 Kafka 的控制器?

      当一个新的控制器被选举出来时,它会被 zookeeper 获得一个“控制器纪元”编号。代理知道当前的控制器纪元,如果他们收到来自具有旧编号的控制器的消息,他们知道忽略它。

      控制器是领导者吗?

      不是真的.. 每个分区都有自己的领导者。当一个 broker 死掉时,控制器会检查所有需要新领导者的分区,确定新领导者应该是谁(只是同步副本列表中的随机副本,即该分区的 ISR)并向所有包含这些分区的新领导者或现有追随者的代理发送请求。

      新领导者现在知道他们需要开始为生产者和 来自客户端的消费者请求,而追随者现在知道他们需要从新的领导者开始复制。

      【讨论】:

      • 是否有指向 KIP 或解释控制器如何为每个分区确定新领导者的文档的链接?也是从什么时候开始实施的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多