Kafka的主要开发人员表示Kafka是CA而CAP是CAP定理.但我很困惑,卡夫卡不是分区容忍的吗?我认为确实如此,当一个复制失败时,另一个将成为领导者并继续工作!
另外,我想知道如果Kafka使用P怎么办?P会伤害C还是A?
Ale*_*mov 14
如果你读过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)之前,它将无法处理写入请求。
Gio*_*ous 12
CAP定理指出,任何分布式系统最多可以提供三种保证中的两种:一致性,可用性和分区容差.
根据LinkedIn的工程师(Kafka最初成立的地方),Kafka是一个CA系统:
所有分布式系统必须在保证一致性,可用性和分区容差(CAP定理)之间进行权衡.我们的目标是支持在单个数据中心内的Kafka群集中进行复制,其中网络分区很少,因此我们的设计侧重于维护高可用性和高度一致性的副本.强一致性意味着所有副本都是字节到字节相同的,这简化了应用程序开发人员的工作.
但是,我会说这取决于您的配置,更准确地说取决于变量acks,min.insync.replicas以及replication.factor.根据文件,
如果主题仅配置了两个副本且一个失败(即,同步副本中只有一个仍然存在),则指定acks = all的写入将成功.但是,如果剩余的副本也失败,则这些写入可能会丢失.虽然这确保了分区的最大可用性,但对于喜欢耐用性而非可用性的一些用户来说,这种行为可能是不合需 因此,我们提供了两种主题级配置,可用于优先考虑消息的持久性和可用性:
禁用不洁的领导者选举 - 如果所有副本都不可用,则分区将保持不可用,直到最近的领导者再次可用.这有效地优先于消息丢失风险的不可用性.请参阅上一节关于不洁领导人选举的部分以获得澄清.
指定最小ISR大小 - 如果ISR的大小高于某个最小值,则分区将仅接受写入,以防止丢失仅写入单个副本的消息,该副本随后变为不可用.此设置仅在生产者使用acks = all时生效,并保证至少通过此许多同步副本确认消息.此设置提供了一致性和可用性之间的权衡.最小ISR大小的更高设置保证了更好的一致性,因为保证将消息写入更多副本,这降低了它将丢失的可能性.但是,它会降低可用性,因为如果同步副本的数量低于最小阈值,则分区将无法进行写入.
Soh*_*ani -1
CAP 是一个经过验证的定理,因此没有一个分布式系统可以在故障期间同时具有特征 C、A 和 P。如果 Kafka 使用 P,即当集群分裂成两个或多个隔离部分时它可以继续运行,则应牺牲 C 或 A 之一。
也许如果我们将 Kafka 和 Zookeeper 节点视为一个整体集群,因为 Kafka 需要 Zookeeper 节点,我们不能认为它在与 Zookeeper 节点失去连接的情况下具有分区容忍性。
| 归档时间: |
|
| 查看次数: |
2911 次 |
| 最近记录: |