【问题标题】:Why Kafka is not P in CAP theorem为什么Kafka在CAP定理中不是P
【发布时间】:2018-12-24 18:57:42
【问题描述】:

Kafka 的主要开发者说 Kafka 是 CA 但 P in CAP theorem。但是我很困惑,卡夫卡不是分区容忍的吗?我认为确实如此,当一个复制失败时,另一个将成为领导者并继续工作!

另外,我想知道如果 Kafka 使用 P 会怎样? P会伤害C还是A?

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    CAP 是一个经过证明的定理,因此没有分布式系统可以在故障期间同时具有特征 C、A 和 P。如果 Kafka 使用 P,即当集群分裂成两个或多个独立的部分时它可以继续运行,则应该牺牲 C 或 A 之一。

    也许如果我们将Kafka和Zookeeper节点视为一个整体集群,因为Kafka需要zookeeper节点,我们不能认为它在与zookeeper节点失去连接的情况下具有分区容错性。

    【讨论】:

    • 你能给我举个例子吗,比如它P比A或C怎么输的。
    【解决方案2】:

    CAP 定理指出,任何分布式系统最多只能提供三个保证中的两个:一致性、可用性和分区容错性。

    根据Engineers at LinkedIn(Kafka 最初成立的地方),Kafka 是一个 CA 系统:

    所有分布式系统都必须在保证 一致性、可用性和分区容错性(CAP 定理)。我们的 目标是支持单个 Kafka 集群中的复制 数据中心,网络分区很少见,所以我们的设计重点 关于维护高可用和强一致的副本。 强一致性意味着所有副本都是逐字节相同的, 这简化了应用程序开发人员的工作。

    但是,我想说这取决于您的配置,更准确地说取决于变量 acksmin.insync.replicasreplication.factor。根据docs

    如果一个主题只配置了两个副本并且一个失败(即, 仅保留一个同步副本),然后写入指定 acks=all 将会成功。但是,如果剩余的写入可能会丢失 副本也失败了。虽然这确保了最大的可用性 分区,这种行为对于一些喜欢的用户来说可能是不受欢迎的 耐用性高于可用性。因此,我们提供了两个主题级别 可用于优先考虑消息持久性的配置 可用性:

    1. 禁用不干净的领导者选举 - 如果所有副本都不可用,则分区将保持不可用,直到最 最近的领导者再次可用。这实际上更喜欢 对消息丢失的风险不可用。见上一节 关于不洁领袖选举的澄清。

    2. 指定最小 ISR 大小 - 如果 ISR 的大小高于某个最小值,分区将只接受写入,以防止 仅写入单个副本的消息丢失,这 随后变得不可用。此设置仅在以下情况下生效 生产者使用 acks=all 并保证消息将 至少得到这么多同步副本的确认。这个设置 提供一致性和可用性之间的权衡。更高的 设置最小 ISR 大小可确保更好的一致性,因为 保证消息被写入更多的副本,从而减少 丢失的概率。但是,它会降低可用性 因为分区将无法写入,如果数量 同步副本数降至最低阈值以下。

    【讨论】:

    • 谢谢你,你解释了C和A,但我还是不明白为什么不分区容限,分区容限和一个数据中心或多个数据中心有什么关系?
    • 阅读这篇文章 - aphyr.com/posts/293-jepsen-kafka。它出色地解释了 Partition Tolerance!
    • @Jack 分区容错在跨越多个数据中心的系统中更需要,因为网络分区更有可能发生在多个数据中心。 Kafka 是 CA,假设位于单个数据中心(由设计人员),因此可以解决所有问题。
    【解决方案3】:

    如果你read CAP 是如何定义 C、A 和 P 的,“CA 但不是 P”只是意味着当任意网络分区发生时,每个 Kafka 主题分区要么停止服务请求(丢失 A),要么丢失一些数据(丢失 C),或两者兼而有之,具体取决于其设置和分区的具体情况。

    如果网络分区从 Zookeeper 中拆分出所有 ISR,默认配置为unclean.leader.election.enable = false,则无法选举任何副本作为领导者(输掉 A)。

    如果至少有一个 ISR 可以连接,它将被选举,因此它仍然可以服务请求(保留 A)。但是使用默认的min.insync.replicas = 1,ISR 可以落后于领导者大约replica.lag.time.max.ms = 10000。因此,通过选择它,Kafka 可能会丢弃前领导者向生产者确认的写入(输 C)。

    Kafka 可以为一些有限的分区同时保留 A 和 C。例如。你有min.insync.replicas = 2replication.factor = 3,当网络分区发生时,所有3个副本都是同步的,并且它最多分裂1个ISR(单节点故障,或单DC故障或单交叉-DC 链路故障)。

    要为任意分区保留 C,您必须设置 min.insync.replicas = replication.factor。这样,无论选出哪个ISR,都保证有最新的数据。但与此同时,在分区愈合(丢失 A)之前,它将无法处理写入请求。

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2015-10-08
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多