尝试了解Kafka中的一致性维护。请找到方案并帮助理解。
Number of partition = 2
Replication factor = 3
Number of broker in the cluster = 4
在那种情况下,为了实现强一致性,应确认多少个节点。 ack = all
或ack = 3
或任何其他值。请确认相同。
答案 0 :(得分:1)
在您的设置中,您拥有的是
这意味着给定分区中的每条消息将被复制到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个节点。