【问题标题】:How to achieve strong consistency in Kafka?Kafka如何实现强一致性?
【发布时间】:2021-02-05 04:30:52
【问题描述】:

尝试理解 Kafka 中的一致性维护。请找到场景并帮助理解。

 Number of partition  = 2 
    Replication factor = 3 
    Number of broker in the cluster = 4 

在这种情况下,为了实现强一致性,应该确认多少节点。 ack = allack = 3 或任何其他值。请确认。

【问题讨论】:

    标签: apache-kafka replication-factor


    【解决方案1】:

    您可能有兴趣查看来自 Kafka 峰会的 When it Absolutely, Positively, Has to be There 演讲。

    这是由 Cloudera 的一位工程师提供的,Cloudera has their own documenation on Kafka availability

    总而言之,多于 1 个副本和多于 1 个同步副本是一个好的开始。然后在生产者上,如果您可以牺牲吞吐量来获得数据可用性,这意味着您必须在继续之前写入所有副本,然后acks=all。否则,如果您相信领导代理具有高可用性,但不干净的领导选举是错误的,那么acks=1 在大多数情况下应该没问题。

    acks=3 不是一个有效的配置,顺便说一下。我认为您正在寻找min.insync.replicas=2acks=all,其复制因子为3;来自上面的链接

    如果min.insync.replicas 设置为2acks 设置为all,则每条消息必须成功写入至少两个副本。这保证了消息不会丢失,除非两个主机都崩溃了

    此外,您可以启用事务性生产者,从 Kafka 0.11 开始,可以只进行一次处理

    enable.idempotence=true
    

    【讨论】:

      【解决方案2】:

      在你的环境中,你所拥有的是

      • 4 个经纪人
      • 复制因子 = 3

      这意味着给定分区中的每条消息将被复制到 4 个代理中的 3 个,包括该分区的领导者。

      为了实现强一致性保证,您必须将min.insync.replicas 设置为2 并使用acks=all。这样,您就可以保证每次写入都会发送到持有数据的 3 个代理中的至少 2 个,在此之前它会被确认。

      将 ack 设置为 all 可提供最高的一致性保证,但代价是写入集群的速度较慢。

      如果您使用旧版本的 Kafka,其中不干净的领导者选举默认为 true,您还应该考虑将其显式设置为 false。这样一来,就不同步了。如果领导者崩溃(实际上会影响可用性),代理将不会被选为领导者。

      此外,Kafka 是一个所有读取都通过领导者的系统。这与支持只读副本的其他一些分布式系统(例如 Zookeeper)有点不同。因此,您不会遇到客户端最终直接从陈旧的代理读取的情况。领导者确保将写入排序并复制到指定数量的同步副本,并根据您的 acks 设置进行确认。

      【讨论】:

        【解决方案3】:

        如果您正在寻找 ACID 属性领域的一致性,则需要确认所有副本。由于您有 3 个副本,因此应确认所有这 3 个节点。

        【讨论】:

          猜你喜欢
          • 2013-03-25
          • 1970-01-01
          • 2021-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-05
          • 2015-07-03
          • 1970-01-01
          相关资源
          最近更新 更多