尝试理解Kafka中的一致性维护。请找到场景并帮助理解。
Number of partition = 2
Replication factor = 3
Number of broker in the cluster = 4 在这种情况下,为了实现强一致性,多少个节点应该确认。ack = all、ack = 3或任何其他值。请确认这一点。
发布于 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不是有效的配置。我认为您正在寻找复制因子为3的min.insync.replicas=2和acks=all;从上面的链接
如果
min.insync.replicas设置为2,acks设置为all,则每条消息必须成功写入至少两个副本。这可以保证消息不会丢失,除非两台主机都崩溃
此外,从Kafka 0.11开始,您可以使事务生产者只处理一次
enable.idempotence=true发布于 2019-01-12 04:20:00
在您的环境中,您拥有的是
这意味着给定分区中的每个消息将被复制到4个代理中的3个,包括该分区的领导者。
为了实现强大的一致性保证,您必须将min.insync.replicas设置为2并使用acks=all。通过这种方式,您可以确保每次写入都至少发送到持有数据的3个代理中的2个,在此之前数据会得到确认。
将ack设置为all可提供最高的一致性保证,但代价是降低对群集的写入速度。
如果你使用旧版本的Kafka,默认情况下不干净的领导者选举是true,你也应该考虑显式地将其设置为false。这样,就不同步了。在leader崩溃的情况下,broker将不会被选举为leader (有效地影响可用性)。
此外,Kafka是一个所有阅读都通过领导者的系统。这与其他一些分布式系统有点不同,比如zookeeper,它支持读取副本。因此,您不会遇到客户端最终直接从陈旧的代理读取数据的情况。Leader可确保根据您的acks设置对写入进行排序,并将其复制到指定数量的同步副本并进行确认。
发布于 2019-01-12 01:50:17
如果您正在寻找ACID属性领域中的一致性,则需要确认所有副本。由于您有3个副本,因此所有这3个节点都应该得到确认。
https://stackoverflow.com/questions/54151459
复制相似问题