Kafka机架id和最小同步副本

avwztpqn  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(645)

kafka引入了rack id,以在整个机架出现故障时提供冗余功能。有一个min in sync replica设置,用于指定在生产者接收ack之前需要同步的最小副本数(-1/all config)。有一个不干净的领导人选举设置来指定一个领导人在不同步时是否可以被选举。
因此,考虑到以下情况:
两个机架。机架1,2。
复制计数为4。
最小同步副本数=2
生产者确认=-1(全部)。
不干净的领导人选举=错误
旨在实现至少一次消息传递、节点冗余和对机架故障的容忍。
有没有可能两个同步副本都来自机架1,因此生产商收到一个ack,此时机架1崩溃(在机架2的任何副本同步之前)?这意味着rack2将只包含不干净的复制品,并且没有生产者能够将消息添加到分区中,这基本上是停止的。复制品是不干净的,因此无论如何都不能选出新的领导人。
我的分析是正确的,还是有什么秘密可以确保形成最小同步副本的副本必须来自不同的机架?
由于同一机架上的复制副本延迟较低,因此上述情况似乎是合理的。
场景如下图所示:

vm0i2vca

vm0i2vca1#

是的,我认为这是可能的。因为Kafka只能根据运行时的实际情况来维护isr,而不能依靠它的精神。
来自https://engineering.linkedin.com/kafka/intra-cluster-replication-apache-kafka
对于主题的每个分区,我们维护一个同步副本集(isr)。这是一组活动的副本,它们完全赶上了领导者(请注意,领导者总是在isr中)。最初创建分区时,每个复制副本都在isr中。发布新消息时,领导者会等待消息到达isr中的所有副本,然后再提交消息。如果一个跟随者副本失败,它将从isr中退出,然后领导者继续提交isr中副本较少的新消息。请注意,现在,系统正在复制模式下运行。
来自https://cwiki.apache.org/confluence/display/kafka/kafka+replication
在配置的超时时间段之后,引导程序将从其isr中删除失败的跟随程序,并在isr中的其余副本上继续写入。如果失败的follower返回,它首先将其日志截断到最后一个检查点hw。然后,它开始在它的hw之后从leader获取所有消息。当跟随者完全赶上时,领导者会将其添加回当前isr。
您提到的最小同步副本数只是一个限制数,isr大小与此无关。此设置意味着,如果制作者的ack为“all”,且isr大小小于min,则kafka将拒绝写入此消息。
因此,在第一次,isr是{1,2,3,4},如果代理3或4失败,它将被踢出isr。你提到的案子会发生的。当一号机架的经纪人失败时,这将是一次不干净的领导人选举。

jk9hmnmh

jk9hmnmh2#

为了在技术上正确,你应该修正一些问题。不可能有不同步的副本“可用”。另外,min-in-sync replica设置指定分区保持可写状态所需的最少同步副本数。当生产商指定ack(-1/all config)时,它仍将在此时等待来自所有同步副本的ack(与min in sync replicas的设置无关)。因此,如果在4个副本同步时发布,则除非所有4个副本都提交消息,否则将不会获得ack(即使min-in-sync replicas配置为2)。仍然可以构建一个与您的问题类似的场景,突出显示相同的折衷问题:首先让机架2中的2个分区不同步,然后在机架1中只有2个ISR时发布,然后关闭机架1。在这种情况下,这些分区将不可用于读或写。因此,解决这个问题最简单的方法是将min-in-sync复制副本增加到3个。另一个容错性较差的修复方法是将复制因子减少到3。

相关问题