我开始了解Apache·Kafka。这个https://engineering.linkedin.com/kafka/intra-cluster-replication-apache-kafka 文章指出Kafka是cap定理中的ca系统。因此,它侧重于副本之间的一致性以及总体可用性。
我最近听说了cap定理的一个扩展,叫做pacelc(https://en.wikipedia.org/wiki/pacelc_theorem). 这个定理可以这样形象化:
我的问题是如何在pacelc中描述apachekafka。我认为kafka关注的是分区发生时的一致性,但如果没有分区发生呢?重点是低厕所或强烈的一致性?
谢谢!
1条答案
按热度按时间5f0d552i1#
这取决于您的配置。
对于需要强一致性的操作,如控制器选举(决定分区领导者)、代理注册、动态配置、acl-s等,kafka由cp zookeeper提供支持。
至于您发送给kafka的数据,可以在生产者级别、每个主题或/或更改代理默认值上配置担保。
带默认配置的开箱即用(
min.insync.replicas=1
,default.replication.factor=1
)您正在获取ap系统(最多一次)。如果你想达到cp,你可以设置
min.insync.replicas=2
主题复制因子为3-然后生成一条消息acks=all
将保证cp设置(至少一次),但(如预期)在没有足够的副本(<2)可用于特定主题/分区对的情况下将被阻止(见设计(ha,生产商配置文件)Kafka管道可以进一步精确地调整一次方向。。
cap和pacelc
在pacelc方面,一些改善延迟的决定已经变成了默认。例如,Kafka在默认情况下不会
fsync
每一条消息都会写入到磁盘,并让操作系统处理刷新。默认情况下,为了持久性,首选使用复制。它也是可配置的-请看flush.messages
,flush.ms
代理/主题配置。由于它接收的消息的一般性(它只是一个bytestream),它不能进行任何分区后合并,也不能使用crdts技巧来保证分区期间的可用性,并最终恢复一致性。
我不知道你怎么做
give up
期间延迟的一致性normal operation
在kafka-s泛型bytestream中。您可能会放弃强一致性(线性化)并尝试获得“更高的一致性”(覆盖更多的故障场景,或减少数据丢失的大小),但这实际上是调整ap系统以获得更高的一致性,而不是调整cp以获得更低的延迟。您可能会看到ap/cp权衡和配置以至少一次、最多一次和恰好一次的形式呈现。
测试
为了理解这些参数如何影响延迟,我认为最好的方法是用不同的参数测试你的设置。以下命令将生成1gb的数据:
然后尝试使用不同的producer参数:
它很容易启动集群和启动/停止/杀死节点来测试一些失败场景,例如使用compose
链接和引用
您可能会检查(不幸的是过时了,但仍然与主题相关)jepsen测试和后续工作,只是为了添加一些关于这是如何随时间发展的上下文。
我强烈建议查看一些论文,这将提供更多的视角:
对cap定理的批判。马丁·克莱普曼
12年后:规则是如何改变的。埃里克·布鲁尔