为什么Kafka分布式连接器在我创建的节点被杀死时会死亡?

时间:2016-12-06 21:00:35

标签: docker apache-kafka apache-kafka-connect

我在本地推出的分布式模式下推出了Kafka连接器' Docker容器(与Kafka节点容器分开)。连接器按预期工作,但是当我杀死启动容器时,连接器停止工作。我希望它继续工作,因为我相信它是在另一个容器中的Kafka节点上的一个工作者上注册和运行的。我的设置更详细如下:

目前,我在本地通过Docker容器运行所有内容。我有:

  1. Zookeeper节点(3.4.9)
  2. Kafka节点(Apache,0.10.1.0)
  3. A'发布'节点。
  4. 启动节点下载相应的Kafka版本并解压缩其内容。然后构建连接器源,设置类路径以包含必要的JAR,然后执行连接器:

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

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

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

    当我杀死启动节点(3)时,我希望连接器继续运行,因为我在Kafka集群中注册了它,尽管它是一个集群。连接器不会继续运行,并且似乎与启动节点一起死亡。现在集群中的工作人员应该管理连接器吗?我是否需要更改我启动连接器的方式,还是我误解了某些内容?

1 个答案:

答案 0 :(得分:5)

Kafka Connectors不会在Kafka经纪商上执行。它们在“Kafka Connect Worker”进程中执行,这就是你的问题所谓的“启动'节点”。这些进程接受对连接器的REST请求,并在工作进程中运行连接器。在幕后,这些流程只是通过普通的生产者和消费者与Kafka经纪人进行交互。 Kafka Connect在这些客户端之上提供了一个框架,可以轻松构建可扩展的连接器,因此连接器开发人员只需关注如何将数据拉或推送到连接器所针对的系统。这意味着只有在至少一个工作进程仍处于活动状态时才会继续处理。

有两种类型的工作进程。在独立模式下,连接器配置不会在任何地方保留 - 您通常通过命令行传递它。在本地文件系统上维护偏移信息(即您已经复制的数据)。因此,在此模式下,如果您在同一节点上重新启动可访问同一文件系统的进程,则只能假设您将从中断处继续。

在分布式模式下,工作人员协调分配工作,他们共享连接器配置,偏移等的公共持久存储(在Kafka中)。这意味着如果启动一个实例并创建连接器,请关闭实例将停止所有工作。但是,当您再次启动实例时,它将从中断处继续,而不重新提交连接器配置,因为该信息已持久保存到Kafka。如果启动多个实例,它们将协调以平衡它们之间的任务,如果一个实例失败(由于崩溃,弹性缩小正在运行的实例数,电源故障等),其余实例将重新分配自动工作。

您可以在分布式模式下找到有关工作人员,不同类型以及故障转移工作方式的更多详细信息in Confluent's Kafka Connect documentation