4

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

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

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

启动节点下载适当的 Kafka 版本并解压缩其内容。然后它构建连接器源,设置类路径以包含必要的 JAR,然后执行连接器,如下所示:

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

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

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

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

4

1 回答 1

6

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

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

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

您可以在 Confluent 的 Kafka Connect 文档中找到有关工作程序、不同类型以及故障转移如何在分布式模式下工作的更多详细信息

于 2016-12-11T00:51:44.190 回答