为什么当我创build节点时,Kafka分布式连接器死亡?

我在本地“启动”Docker容器(独立于Kafka节点容器)以分布式模式启动Kafka连接器。 连接器按预期工作,但是当我杀死启动容器时,连接器停止工作。 我预料它会继续工作,因为我相信它是在一个不同的容器中的Kafka节点上的一个工人上注册和运行的。 我的设置更详细如下:

目前我正在通过本地的Docker容器运行所有的东西。 我有:

  1. 一个Zookeeper节点(3.4.9)
  2. 一个Kafka节点(Apache,0.10.1.0)
  3. 一个“发射”节点。

启动节点下载相应的Kafka版本并解压缩它的内容。 然后构build连接器源,设置类path以包含必需的JAR,然后执行连接器:

connect-distributed.sh config/connect-distributed.properties 

分布式属性文件设置组ID,各种主题名称,模式和转换器以及引导服务器(指向上面的Kafka节点(2))。

这个命令似乎正常执行,restful连接http服务被成功启动。 然后,我可以向http:// example:8083 / connectors发出POST请求,为连接器任务提供configuration。 该命令完成而没有错误,连接器已成功启动。 我可以从Kafka节点(2)中的主题中消费,并且看到指示连接器正在工作并通过发送数据的输出。

当我杀死启动节点(3)时,我期望连接器继续运行,因为我注册了Kafka集群,尽pipe它是一个集群。 连接器不会继续运行,似乎与启动节点一起死亡。 连接器是否应该由群集中的工作人员pipe理? 我是否需要更改连接器的启动方式,或者我误解了一些东西?

卡夫卡连接器不执行卡夫卡经纪人。 它们在“Kafka Connect Worker”进程中执行,这就是你的问题叫做“启动”节点。 这些进程接受连接器的REST请求,并在工作进程中运行连接器。 在这个幌子下,这些过程只是通过正常的生产者和消费者与卡夫卡经纪人进行交互。 Kafka Connect在这些客户端之上提供了一个框架,以便于构build可伸缩的连接器,因此连接器开发人员只需要关注如何将数据拖放到连接器所写入的系统。 这意味着只有在至less有一个工作进程仍然存在的情况下,处理才会继续。

有两种types的工作进程。 在独立模式下,连接器configuration不会在任何地方持久化 – 通常通过命令行将其传递。 偏移信息(即你已经复制了哪些数据)保存在本地文件系统上。 因此,在这种模式下,如果您在同一个节点上重新启动进程并访问相同的文件系统,则只能假设您将从此处继续。

在分布式模式下,工作人员协调分配工作,他们共享连接器configuration,偏移量等常见的持久性存储(在Kafka中)。这意味着如果启动一个实例并创build一个连接器,closures该实例将停止所有的工作。 但是,当您再次启动一个实例时,它将从停止的位置恢复,而不重新提交连接器configuration,因为该信息已被保存到Kafka。 如果你启动了多个实例,它们将协调负载平衡它们之间的任务,如果一个实例失败(由于崩溃,弹性缩减正在运行的实例数量,电源故障等),剩下的实例将重新分配自动工作。

您可以在Confluent的Kafka Connect文档中find有关工作人员,不同types以及故障转移在分布式模式下的更多详细信息