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

时间:2019-01-11 17:35:02

标签: apache-kafka replication-factor

尝试了解Kafka中的一致性维护。请找到方案并帮助理解。

 Number of partition  = 2 
    Replication factor = 3 
    Number of broker in the cluster = 4 

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

3 个答案:

答案 0 :(得分:1)

在您的设置中,您拥有的是

  • 4个经纪人
  • 复制因子= 3

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

为了获得强大的一致性保证,必须将min.insync.replicas设置为2并使用acks=all。这样,您可以确保每次写入至少要保存数据的3个代理中的2个在接受数据之前被确认。

将acks设置为all可以提供最高的一致性保证,但会降低写入群集的速度。

如果您使用的Kafka的旧版本默认情况下,不干净的领导者选举为true,则还应考虑将其明确设置为false。这样,就不同步了。领导者崩溃(有效地损害可用性)的情况下,经纪人将不会被选为领导者。

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

答案 1 :(得分:1)

您可能有兴趣看Kafka Summit的When it Absolutely, Positively, Has to be There演讲。

这是由Cloudera的工程师和Cloudera has their own documenation on Kafka availability

提供的

总而言之,一个以上的副本和高于1个的同步副本是一个好的开始。然后在生产者上,如果在继续操作之前必须已写入所有副本,则acks=all。否则,如果您相信领导经纪人在不洁的领导者选举中具有很高的可用性,那就是错误的,那么在大多数情况下,acks=1应该可以。

顺便说一句,

acks=3不是有效的配置。我认为您正在寻找复制因子为min.insync.replicas=2的{​​{1}}和acks=all;从上方链接

  

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

答案 2 :(得分:0)

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