【问题标题】:If the partition a Kafka producer try to send messages to went offline, can the producer try to send to a different partition?如果Kafka生产者尝试发送消息的分区离线,生产者可以尝试发送到不同的分区吗?
【发布时间】:2020-12-29 13:16:05
【问题描述】:

我的 Kafka 集群有 5 个代理,主题的复制因子为 3。有时,某些分区会脱机,但最终它们会重新联机。我的问题是:

  1. 考虑到存在脱机分区这一事实,这表明有多少代理已关闭?我认为考虑到上面的集群设置,我可以承受同时失去 2 个代理。但是,如果有 2 个 broker 宕机,对于某些分区,它们不再具有仲裁;在这种情况下,这些分区会下线吗?
  2. 如果存在离线分区,并且 Kafka 生产者尝试向它们发送消息但失败了,生产者会尝试另一个可能在线的分区吗?消息中没有密钥。

【问题讨论】:

    标签: apache-kafka kafka-producer-api


    【解决方案1】:

    不确定我是否完全正确理解了您的问题,但我的印象是您混淆了分区和复制。或者至少,您的问题不能孤立地放在制片人身上。一旦一个代理关闭,集群就会发生一些事情。

    每个 TopicPartition 都有一个分区领导者,您的客户(例如生产者和消费者)只与这个领导者通信,与复制数量无关。

    在五分之二的代理不可用的情况下,Kafka 会将分区领导者和副本移动到健康的代理。因此,在这种情况下,您应该不会遇到麻烦,尽管可能需要一些时间和重试才能选择新的领导者并在健康的代理上创建新的复制。当您将复制因子设置为 3 时,可以快速选择领导者,因此即使两个代理出现故障,一个代理仍然应该拥有完整的数据(假设所有分区都处于同步状态)。但是,创建两个新副本可能需要一些时间,具体取决于数据量。对于这种情况,您需要查看主题级别配置 min.insync.replicas 和 KafkaProducer 确认 acks(见下文)。

    我认为以下是您的 KafkaProducer 处理这种情况最重要的配置:

    bootstrap.servers:如果您预计您的代理会经常出现连接问题,您应该确保列出所有五个。尽管只提及一个地址就足够了(因为一个代理随后将与集群中的所有其他代理进行通信),但如果一个甚至两个代理不可用,则将它们全部列出是安全的。

    acks:默认为1,并定义了生产者要求分区领导者在认为请求成功之前收到的确认数量。可能的值为01all

    重试次数:此值默认为2147483647,并会导致客户端重新发送任何发送失败并可能出现暂时性错误的记录,直到达到delivery.timeout.ms 的时间

    delivery.timeout.ms:调用 send() 返回后报告成功或失败的时间上限。这限制了记录在发送之前将被延迟的总时间、等待代理确认的时间(如果需要)以及可重试发送失败所允许的时间。如果遇到不可恢复的错误,重试已用尽,或者记录被添加到到达较早交付到期期限的批次中,生产者可能会报告未能在此配置之前发送记录。此配置的值应大于或等于 request.timeout.ms 和 linger.ms 的总和。

    您将在Producer configs 上找到有关文档的更多详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-10
      • 1970-01-01
      • 2019-10-03
      • 2018-08-07
      • 1970-01-01
      • 2020-08-24
      • 2013-03-10
      • 2019-03-31
      相关资源
      最近更新 更多