Apache Kafka 放在 PACELC-Theorem 中的什么位置

Where is Apache Kafka placed in the PACELC-Theorem

我开始学习 Apache Kafka。这篇 https://engineering.linkedin.com/kafka/intra-cluster-replication-apache-kafka 文章指出 Kafka 是 CAP-Theorem 内部的 CA 系统。所以它侧重于副本之间的一致性以及整体可用性。

我最近听说了 CAP 定理的扩展,称为 PACELC (https://en.wikipedia.org/wiki/PACELC_theorem)。 这个定理可以这样形象化:

我的问题是如何在 PACELC 中描述 Apache Kafka。我认为 Kafka 在发生分区时关注一致性,但是如果没有分区发生怎么办?重点是低延迟还是强一致性?

谢谢!

这取决于您的配置。

Kafka 由 CP ZooKeeper 支持,用于需要强一致性的操作,例如控制器选举(决定分区领导者)、代理注册、动态配置、acl-s 等。
至于您发送到 kafka 的数据 - 保证 可以在生产者级别、每个主题的基础上进行配置 or/and 更改代理默认值

开箱即用的默认配置(min.insync.replicas=1default.replication.factor=1)您将获得 AP 系统(最多一次)。

如果你想实现 CP,你可以设置 min.insync.replicas=2 和主题复制因子为 3 - 然后使用 acks=all 生成消息将保证 CP 设置(至少一次),但是(如预期的那样)将在没有足够的副本(<2)可用于特定 topic/partition 对的情况下阻塞。 (参见 design_ha, producer config docs

Kafka 管道可以在 exactly-once 方向进一步调整..

CAP 和 PACELC
就 PACELC 而言,一些延迟改进决策已经成为默认设置。例如,默认情况下,kafka 不会 fsync 将每条消息写入磁盘 - 它会写入页面缓存并让 OS 处理刷新。默认值更喜欢使用复制来实现持久性。它也是可配置的 - 请参阅 flush.messagesflush.ms broker/topic 配置。

由于它接收的消息的通用性质(它只是一个字节流)- 它不能进行任何 post 分区合并,或使用 CRDT 技巧来保证分区期间的可用性,并最终恢复一致性。

我不知道 see/know 在 kafka-s 通用字节流案例 normal operation 期间如何 give up 延迟的一致性。您可能会放弃强一致性(线性化)并尝试具有“更多一致性”(涵盖更多的故障场景,或减少数据丢失的大小),但这实际上是在调整 AP 系统为了获得更高的一致性,而不是调整 CP 以获得更低的延迟。

您可能会看到 AP/CP 权衡和配置呈现为至少一次、最多一次和恰好一次。

测试
为了了解这些参数如何影响延迟 - 我认为最好的方法是 test 使用不同的参数设置您的设置。以下命令将生成 1Gb 的数据:

kafka-producer-perf-test --topic test --num-records 1000000 --record-size 100 --throughput 10000000 --producer-props bootstrap.servers=kafka:9092 acks=all`

然后尝试使用不同的生产者参数:

acks=1  
acks=all  
acks=1 batch.size=1000000 linger.ms=1000  
acks=all batch.size=1000000 linger.ms=1000  

启动集群和 start/stop/kill 节点来测试一些故障场景很容易,例如compose

链接和参考
您可能会检查(不幸的是已经过时,但仍然与主题相关)jepsen test and follow-up,只是为了添加一些关于它是如何随着时间演变的背景信息。

我强烈建议查看一些论文,这将提供更多视角:
A Critique of the CAP Theorem. Martin Kleppmann
CAP Twelve years later: How the "Rules" have Changed. Eric Brewer