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=1
、default.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.messages
、flush.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
我开始学习 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=1
、default.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.messages
、flush.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