Kafka - min.insync.replicas 解释

Nag*_*Nag 6 apache-kafka confluent-platform

我正在浏览文档,查看多个地方,这增加了混乱..

关于属性 min.insync.replicas

当生产者将 acks 设置为“全部”(或“-1”)时,此配置指定必须确认写入才能将写入视为成功的最小副本数。如果无法满足此最小值,则生产者将引发异常(NotEnoughReplicas 或 NotEnoughReplicasAfterAppend)。当一起使用时,min.insync.replicas 和 acks 允许您强制执行更大的持久性保证。一个典型的场景是创建一个复制因子为 3 的主题,将 min.insync.replicas 设置为 2,并使用“all”的 acks 进行生产。如果大多数副本没有收到写入,这将确保生产者引发异常。

我提出的问题,

  1. 此属性仅在作为“发送记录”(生产者)的一部分与“确认”一起使用时才有意义,还是作为消费者流的一部分也有任何影响?
  2. 如果 acks=all 和 min.insync.replicas = 1(default value :1 ) --> 与 acks = 1 一样吗?(考虑复制因子 3 ?

更新 #1 我遇到了这个短语

“当生产者指定 ack (-1 / all config) 时,它仍然会等待当时所有同步副本的 ack(独立于最小同步副本的设置)。因此,如果您在 4 个副本同步时发布那么除非所有 4 个副本都提交消息(即使最小同步副本配置为 2),否则您将不会收到确认。”

这句话是如何与今天相关的?这个属性“最小同步副本”是否仍然独立?

Chr*_*tta 18

这里有两个设置会影响生产者:

  • acks - 这是制作人级别的设置
  • min.insync.replicas - 这是一个主题级别的设置

acks属性决定了您希望如何处理对 kafka 的写入:

acks=0 - 我不在乎收到回执 acks=0 插图

acks=1- 当领导分区在内存中收到批处理 时发送确认acks=1 插图

all/ -1-在发送确认之前等待所有副本接收到批次 acks=所有插图

请记住,分区中的收据在内存中,默认情况下 Kafka 不会等待 fsync 到磁盘,因此 acks=1 不是持久写入!

min.insync.replicas当主题出现问题时使用,可能其中一个分区不同步或离线。在这种情况下,集群将在min.insync.replicas满足时发送 ack 。所以3个副本,min.insync.replicas=2仍然可以写: 在此处输入图片说明

ACK的属性对消费者没有影响,只是数据将不会被写入到acksmin.insync.replicas满足。

如果 acks=all 和 min.insync.replicas = 1(default value :1 ) --> 与 acks = 1 一样吗?(考虑复制因子 3 ?

只有当主题有问题时。如果您有 3 个副本并且min.insync.replicas=1其中两个分区已关闭,则这与 acks=1 相同。如果主题健康,生产者将在发送 ack 之前等待所有副本。

  • 因此,总而言之 - acks = all 将在至少“min.insync.replicas”响应时发送确认。要量化“至少”,它取决于主题运行状况。如果所有副本(经纪人)都正常运行正常情况下,只有当所有副本都响应时才会发送 ack。如果没有,至少“min.insync.replicas”应该响应。 (4认同)