Kafka代理在IaaS上改变主机



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

我有一个负载均衡器,它在代理之间轮询引导。

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

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

如何解决这个问题?我是否更改advertised.listeners的代理配置以向每个代理添加固定负载平衡器host:port ?我是否会因为每个代理都为这个配置设置了相同的host:port而遇到问题?

您可以尝试降低元数据的最大年龄,以频繁刷新元数据。通过DNS解析的新可用代理应该给出活动代理列表。

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

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

同时,检查:

metadata.max.idle.ms

控制生产者为主题缓存元数据的时间闲置。如果自上次生成主题以来经过的时间超过元数据空闲持续时间长,那么该主题的元数据就被遗忘了下次访问它将强制一个元数据获取请求。

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

另外,你还评论说:

代理大约每周会被重新安置到一个新的主机上。当一个代理被重新定位后,将从其他代理中恢复其分区数据经纪人。如果所有的broker都死了,我就丢失了所有的数据。

理想情况下,尽管你可以出于任何原因重新定位代理进程,但不建议频繁地重新定位数据,相反,你可以将Kafka数据存储在一些分布式存储中,这些存储可以在代理重新定位中幸存下来(前提是它符合数据本地化要求)。

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

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

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

最新更新