Apache Kafka在PACELC-Theorem中的位置

问题描述 投票:8回答:1

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

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

enter image description here

我的问题是如何在PACELC中描述Apache Kafka。我认为Kafka会关注分区发生时的一致性,但如果没有分区则会出现什么情况呢?重点是低熟度还是强一致性?

谢谢!

apache-kafka bigdata cap-theorem
1个回答
10
投票

这取决于您的配置。

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

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

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

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

CAP和PACELC 就PACELC而言,一些延迟改进决策已经被定为违约。例如kafka默认情况下没有fsync每个消息到光盘 - 它写入pagecache并让操作系统处理刷新。默认值更喜欢使用复制来保持持久性。它的可配置性 - 请参阅flush.messagesflush.ms经纪人/主题配置。

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

在kafka-s通用字节流情况下,我没有看到/知道如何在give up期间normal operation延迟一致性。您可能会放弃强一致性(线性化)并尝试“更多一致性”(涵盖更多的故障情况,或减少数据丢失的大小),但这有效地调整AP系统以获得更高的一致性,而不是调整CP以降低延迟。

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

测试 为了理解这些参数如何影响延迟 - 我认为最好的方法是使用不同的参数测试您的设置。以下命令将生成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  

它易于启动集群并启动/停止/终止节点以测试某些故障情况,例如与compose

链接和参考 您可能会检查(不幸的是过时,但仍然与主题相关)jepsen testfollow-up,只是为了增加一些关于这是如何随着时间的推移而发展的背景。

我强烈鼓励检查一些论文,这将提供更多的观点: A Critique of the CAP Theorem. Martin Kleppmann CAP Twelve years later: How the "Rules" have Changed. Eric Brewer

© www.soinside.com 2019 - 2024. All rights reserved.