【发布时间】:2018-12-24 18:57:42
【问题描述】:
Kafka 的主要开发者说 Kafka 是 CA 但 P in CAP theorem。但是我很困惑,卡夫卡不是分区容忍的吗?我认为确实如此,当一个复制失败时,另一个将成为领导者并继续工作!
另外,我想知道如果 Kafka 使用 P 会怎样? P会伤害C还是A?
【问题讨论】:
标签: apache-kafka
Kafka 的主要开发者说 Kafka 是 CA 但 P in CAP theorem。但是我很困惑,卡夫卡不是分区容忍的吗?我认为确实如此,当一个复制失败时,另一个将成为领导者并继续工作!
另外,我想知道如果 Kafka 使用 P 会怎样? P会伤害C还是A?
【问题讨论】:
标签: apache-kafka
CAP 是一个经过证明的定理,因此没有分布式系统可以在故障期间同时具有特征 C、A 和 P。如果 Kafka 使用 P,即当集群分裂成两个或多个独立的部分时它可以继续运行,则应该牺牲 C 或 A 之一。
也许如果我们将Kafka和Zookeeper节点视为一个整体集群,因为Kafka需要zookeeper节点,我们不能认为它在与zookeeper节点失去连接的情况下具有分区容错性。
【讨论】:
CAP 定理指出,任何分布式系统最多只能提供三个保证中的两个:一致性、可用性和分区容错性。
根据Engineers at LinkedIn(Kafka 最初成立的地方),Kafka 是一个 CA 系统:
所有分布式系统都必须在保证 一致性、可用性和分区容错性(CAP 定理)。我们的 目标是支持单个 Kafka 集群中的复制 数据中心,网络分区很少见,所以我们的设计重点 关于维护高可用和强一致的副本。 强一致性意味着所有副本都是逐字节相同的, 这简化了应用程序开发人员的工作。
但是,我想说这取决于您的配置,更准确地说取决于变量 acks、min.insync.replicas 和 replication.factor。根据docs,
如果一个主题只配置了两个副本并且一个失败(即, 仅保留一个同步副本),然后写入指定 acks=all 将会成功。但是,如果剩余的写入可能会丢失 副本也失败了。虽然这确保了最大的可用性 分区,这种行为对于一些喜欢的用户来说可能是不受欢迎的 耐用性高于可用性。因此,我们提供了两个主题级别 可用于优先考虑消息持久性的配置 可用性:
禁用不干净的领导者选举 - 如果所有副本都不可用,则分区将保持不可用,直到最 最近的领导者再次可用。这实际上更喜欢 对消息丢失的风险不可用。见上一节 关于不洁领袖选举的澄清。
指定最小 ISR 大小 - 如果 ISR 的大小高于某个最小值,分区将只接受写入,以防止 仅写入单个副本的消息丢失,这 随后变得不可用。此设置仅在以下情况下生效 生产者使用 acks=all 并保证消息将 至少得到这么多同步副本的确认。这个设置 提供一致性和可用性之间的权衡。更高的 设置最小 ISR 大小可确保更好的一致性,因为 保证消息被写入更多的副本,从而减少 丢失的概率。但是,它会降低可用性 因为分区将无法写入,如果数量 同步副本数降至最低阈值以下。
【讨论】:
如果你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 = 2和replication.factor = 3,当网络分区发生时,所有3个副本都是同步的,并且它最多分裂1个ISR(单节点故障,或单DC故障或单交叉-DC 链路故障)。
要为任意分区保留 C,您必须设置 min.insync.replicas = replication.factor。这样,无论选出哪个ISR,都保证有最新的数据。但与此同时,在分区愈合(丢失 A)之前,它将无法处理写入请求。
【讨论】: