首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Kafka中实现强一致性?

如何在Kafka中实现强一致性?
EN

Stack Overflow用户
提问于 2019-01-12 01:35:02
回答 3查看 3.4K关注 0票数 7

尝试理解Kafka中的一致性维护。请找到场景并帮助理解。

代码语言:javascript
复制
 Number of partition  = 2 
    Replication factor = 3 
    Number of broker in the cluster = 4 

在这种情况下,为了实现强一致性,多少个节点应该确认。ack = allack = 3或任何其他值。请确认这一点。

EN

回答 3

Stack Overflow用户

发布于 2019-01-12 05:06:46

你可能会对卡夫卡峰会上的When it Absolutely, Positively, Has to be There演讲感兴趣。

这是由Cloudera的一位工程师提供的,Cloudera has their own documenation on Kafka availability

总而言之,多个副本和高于1个同步副本是一个很好的开始。然后在生产者上,如果您同意为了数据可用性而牺牲吞吐量,这意味着您必须在继续之前写入所有副本,然后使用acks=all。否则,如果您相信leader broker是高度可用的,而不干净的leader选举是错误的,那么在大多数情况下,acks=1应该是可以的。

顺便说一句,acks=3不是有效的配置。我认为您正在寻找复制因子为3min.insync.replicas=2acks=all;从上面的链接

如果min.insync.replicas设置为2acks设置为all,则每条消息必须成功写入至少两个副本。这可以保证消息不会丢失,除非两台主机都崩溃

此外,从Kafka 0.11开始,您可以使事务生产者只处理一次

代码语言:javascript
复制
enable.idempotence=true
票数 4
EN

Stack Overflow用户

发布于 2019-01-12 04:20:00

在您的环境中,您拥有的是

  • 4 brokers
  • Replication系数= 3

这意味着给定分区中的每个消息将被复制到4个代理中的3个,包括该分区的领导者。

为了实现强大的一致性保证,您必须将min.insync.replicas设置为2并使用acks=all。通过这种方式,您可以确保每次写入都至少发送到持有数据的3个代理中的2个,在此之前数据会得到确认。

将ack设置为all可提供最高的一致性保证,但代价是降低对群集的写入速度。

如果你使用旧版本的Kafka,默认情况下不干净的领导者选举是true,你也应该考虑显式地将其设置为false。这样,就不同步了。在leader崩溃的情况下,broker将不会被选举为leader (有效地影响可用性)。

此外,Kafka是一个所有阅读都通过领导者的系统。这与其他一些分布式系统有点不同,比如zookeeper,它支持读取副本。因此,您不会遇到客户端最终直接从陈旧的代理读取数据的情况。Leader可确保根据您的acks设置对写入进行排序,并将其复制到指定数量的同步副本并进行确认。

票数 2
EN

Stack Overflow用户

发布于 2019-01-12 01:50:17

如果您正在寻找ACID属性领域中的一致性,则需要确认所有副本。由于您有3个副本,因此所有这3个节点都应该得到确认。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54151459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档