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

Why is the Kafka distributed connector dying when the node I created it on is killed?

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

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

  1. 一个 Zookeeper 节点 (3.4.9)
  2. 一个 Kafka 节点(Apache,0.10.1.0)
  3. 一个'launch'节点。

启动节点下载相应的 Kafka 版本并解压缩其内容。然后构建连接器源代码,设置类路径以包含必要的 JAR,然后这样执行连接器:

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

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

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

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

Kafka 连接器不在 Kafka 代理上执行。它们在 "Kafka Connect Worker" 个进程中执行,这就是你的问题所调用的 "a 'launch' node"。这些进程接受连接器的 REST 请求和 运行 工作进程 中的连接器 。在幕后,这些进程只是通过普通的生产者和消费者与 Kafka 代理进行交互。 Kafka Connect 在这些客户端之上提供了一个框架,可以轻松构建可扩展的连接器,因此连接器开发人员只需关注如何将数据拉取或推送到连接器所针对的系统。这意味着只有至少一个工作进程仍然存在时,处理才会继续。

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

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

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