【问题标题】:Kafka brokers on IaaS with changing hostIaaS 上的 Kafka 代理,主机不断变化
【发布时间】:2021-09-29 16:14:15
【问题描述】:

我的 Kafka 代理在专有云 IaaS 平台上运行。经纪人将每周左右搬迁到新的主机。当一个代理被重定位时,它会从其他代理恢复它的分区数据。如果所有经纪人都死了,我会丢失所有数据。

我有一个负载均衡器,用于在代理之间进行循环以进行引导。

当客户端连接(通过负载均衡器)时,Kafka 客户端将获取代理列表并将其存储以连接。

如果在客户端应用程序仍在运行时重新定位所有代理,则客户端应用程序将无法重新连接到集群。它不使用引导服务器重新查询新的代理列表,它会继续尝试连接到应用程序首次启动时它拥有的代理列表。

我怎样才能解决这个问题?我是否要更改 advertised.listeners 的代理配置以将固定负载均衡器主机:端口添加到每个代理?我会因为每个代理都为此配置设置相同的主机:端口而遇到问题吗?

【问题讨论】:

  • 程序运行了多长时间,在您断定它不会尝试重新查询新的代理列表之前?
  • @JavaTechnical - 可以复制执行以下操作: 1. 启动客户端应用程序。 2.同时停止所有经纪人。 3. 经纪人将在其他服务器上启动。 4. 客户端应用无法重新连接集群
  • 元数据刷新发生时应该获取新的代理详细信息,前提是负载平衡器 IP 与您在引导服务器中提供的 IP 相同。

标签: apache-kafka


【解决方案1】:

您可以尝试降低元数据的最大使用期限以频繁刷新元数据。通过 DNS 解析的新可用代理应提供活动代理列表。

metadata.max.age.ms - 默认值为 5 分钟(Confluent 平台)

我们强制刷新的时间段(以毫秒为单位) 元数据,即使我们没有看到任何分区领导更改 主动发现任何新的代理或分区

另外,请检查:

metadata.max.idle.ms

控制生产者缓存主题元数据的时间 闲。如果自上次生成主题以来经过的时间超过 元数据空闲时间,然后主题的元数据被遗忘, 对它的下一次访问将强制执行元数据获取请求。

参考:https://docs.confluent.io/platform/current/installation/configuration/producer-configs.html

另外,你评论说:

经纪人将每周左右搬迁到新的主机。当一个 代理被重定位,它从其他的恢复它的分区数据 经纪人。如果所有经纪人都死了,我会丢失所有数据。

理想情况下,尽管您可以出于任何原因重新定位代理进程,但不建议频繁地重新定位数据,而是可以将 Kafka 数据存储在可以在代理重新定位后幸存的分布式存储中(前提是它在数据本地要求)。

即使您没有使用分布式存储的规定,您也必须至少尝试重新定位数据或使用mirror-maker/confluent replicator 进行复制。

我不确定当所有代理都死了时您将如何丢失数据,因为数据总是永久存储在磁盘上。除非您使用了一些易失性存储(或)保存数据的磁盘崩溃,否则您的数据大部分应该保持原样,并且应该可以在代理重新启动时恢复。

如果您使用的是 docker/kubernetes 环境,请确保您已配置持久卷。

【讨论】:

  • 我没有可用的持久存储,因此请至少依赖一个可用的代理来防止数据丢失。这在大多数情况下都会有所帮助。可能发生的一件事是所有代理同时脱机 - 这无法防止......我希望客户端应用程序此时自动重新连接/恢复。
  • 如果您在引导服务器中给出的列表指向可用的负载均衡器,那么它应该在一段时间后使用它来获取元数据。如果负载均衡器 IP 发生变化,那么几乎没有什么可做的,afaik。
  • 我刚刚做了一个测试。启动应用程序。重新启动经纪人。等待 > 5 分钟以说明元数据刷新。仍然无法连接。如果我重新启动应用程序,它就可以正常连接。根据日志,它不断尝试连接到以前的代理 ip/port
  • 你能启用 kafka 调试日志看看发生了什么吗?
  • 它看起来像是试图从旧代理(被杀死的代理)请求元数据。引导服务器设置为负载平衡 URL。
猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2019-05-17
  • 2021-06-29
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多