当前位置: 首页 > 知识库问答 >
问题:

一个集群中有多少个 Kafka 控制器,控制器的用途是什么?

竺辉
2023-03-14

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

如果一个Kafka集群中有100个经纪商,控制器是否只是一个Kafka经纪商?那么在100个经纪商中,控制器是领导者吗?

你怎么知道哪个经纪人是控制人?

Kafka控制器的管理对Kafka系统管理至关重要吗?

共有3个答案

吕树
2023-03-14

Kafka控制器是Kafka集群的大脑。它监视代理的活动性,并对代理故障采取行动。

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

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

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

一个群集中可能有多个控制器。考虑一个案例,当前 Kafka 控制器上发生了长 GC(垃圾回收)(“Controller_1”),因此 Zookeeper 在配置的时间内没有收到来自控制器的检测信号消息。这会导致“/控制器”节点从 Zookeeper 中删除,并且集群中的另一个代理被选为新的控制器(“Controller_2”)。

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

为了避免它,每次发生控制器选举时都会生成一个新的“纪元”。每次选择控制器时,它都会通过动物园管理员条件增量操作接收一个新的更高的纪元。

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

乌杰
2023-03-14

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

有关集群控制器职责的更多详细信息,请参见此处。

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

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

然后获取控制器

[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

动物园管理员是Kafka集群状态的存储。它用于在最开始或当前控制器崩溃时进行控制器选择。控制器还负责在主题的分区领导代理失败/崩溃时告诉其他副本成为分区领导者。

郜杰
2023-03-14

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

控制器只是一个经纪人吗?

一次只有一个控制器。

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

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

当一个新的控制器被选中时,它会被动物园管理员获得一个“控制器纪元”编号。经纪人知道当前的控制器纪元,如果他们收到来自具有旧号码的控制器的消息,他们知道忽略它。

管制员是领导吗?

没有。。每个分区都有自己的前导符。当代理死亡时,控制器会遍历所有需要新领导者的分区,确定新的领导者应该是谁(只是该分区的同步副本列表中的随机副本,也称为 ISR),并向包含这些分区的新领导者或现有追随者的所有代理发送请求。

新的领导者现在知道他们需要开始服务于客户的生产者和消费者请求,而追随者现在知道他们必须开始从新的领导者那里复制。

 类似资料:
  • 我有两个控制器和。我正在读一本书的内容。来自的txt文件,我希望将该文本放置在的文本区域中。代码在中运行并读取良好,但当打开中的窗口时,从中读取的内容。文本内容在文本区域中不可见。我的显示String mine包含内容,但它不显示在的文本区域中。请帮助任何人。非常感谢。 FXMLDocumentController代码 在中,有一个我删除了和,这样代码就可以工作了。

  • 第一个控制器 The Controllers layer is responsible for handling incoming HTTP requests. In Nest, Controller is a simple class with @Controller() decorator. 控制层负责处理传入的HTTP请求。在Nest中,控制器是一个带有@Controller()装饰器的类。

  • 问题内容: 我有一个由一个控制器控制的fxml文件。我想将控制器分成多个部分,就像放置在一个控制器中会产生很长的代码一样。不幸的是,fx:controller只能放在根目录中。我对如何分离控制器有什么建议吗? 问题答案: 我建议创建自定义控件-使用几个较小的FXML文件,而不是一个大FXML文件。 这是本教程: http://docs.oracle.com/javafx/2/fxml_get_st

  • 问题内容: 我想从另一个控制器的函数中加载一个控制器,因为我集成到项目中的库我不想将其加载到控制器中,因为我想保持它的清洁和相关性。 我有默认的控制器,所以我可以加载,这样我怎么能从main函数访问控制器,所以我不必将控制器放在url中。 如果我可以从主控制器功能中加载控制器功能,我仍然愿意使用HMVC。 问题答案: 您无法从CI中的控制器加载控制器-除非您使用HMVC或其他工具。 您应该考虑一下

  • 问题内容: 我是Angular的新手,正在尝试弄清楚该怎么做… 使用AngularJS,如何注入要在另一个控制器中使用的控制器? 我有以下片段: 执行此操作时,出现错误: 我是否应该尝试在另一个控制器内部使用一个控制器,还是应该将此服务用作服务? 问题答案: 如果您打算掌握已经实例化的另一个组件的控制器,并且如果您遵循的是基于组件/指令的方法,则始终可以遵循某个层次结构的另一个组件中的控制器(一个

  • 需要你的帮助!这可能是更多的设计角度,但我在我的应用程序中使用这个模式,所以想得到一个想法。 我的问题是直接或间接地从一个控制器访问另一个控制器。是否有任何优雅的设计方法来做到这一点,而不是在另一个控制器中保留一个控制器的引用。 提前致谢