Kafka引入了rack-id,以便在整个机架出现故障时提供冗余功能。 有一个最小同步副本设置,用于指定在生产者收到ack(-1 / all config)之前需要同步的最小副本数。 有一个不洁的领导者选举设置,用于指定领导者在不同步时是否可以当选。
因此,鉴于以下情况:
旨在至少进行一次消息传递,节点冗余并容忍机架故障。
是否有可能两个同步副本都来自机架1,因此生产者收到一个ack,此时机架1崩溃(在机架2的任何副本同步之前)? 这意味着机架2将只包含不洁净的副本,并且没有生产者能够将消息添加到分区,基本上停止了。复制品将是不洁净的,因此无论如何都不能选出新的领导者。
我的分析是否正确,或是否有一些内容可以确保形成最小同步复制品的复制品必须来自不同的机架?
由于同一机架上的副本具有较低的延迟,因此上述情况似乎是合理可能的。
方案如下图所示:
答案 0 :(得分:3)
为了在技术上正确,你应该解决一些问题的措辞。不可能有不同步的副本"可用"。此同步最小同步副本设置指定了分区保持可用于写入时需要同步的最小副本数。当生产者指定ack(-1 / all config)时,它仍将等待来自所有同步副本的ack(与min in-sync副本的设置无关)。因此,如果您在4个副本同步时发布,那么除非所有4个副本都提交消息,否则您将无法获得确认(即使最小同步副本配置为2)。仍然有可能构建类似于您的问题的场景,通过让机架2中的2个分区首先不同步来突出相同的权衡问题,然后在机架1中仅有2个ISR时发布,然后取出机架1下。在这种情况下,这些分区将无法读取或写入。因此,解决此问题的最简单方法是将最小同步内副本增加到3.另一个容错的容错修复方法是将复制因子减少到3个。
答案 1 :(得分:0)
是的,我认为这是可能的。因为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中剩余的副本。 如果失败的关注者返回,它首先将其日志截断到最后一个检查点HW。然后它开始在领导者的HW之后赶上所有消息。当追随者完全赶上时,领导者会将其添加回当前的ISR。
您提到的最小同步副本只是一个限制数,ISR大小不依赖于它。这个设置意味着生产者的确认是"所有"并且ISR大小小于min,然后kafka将拒绝写这条消息。
因此,在第一次,ISR是{1,2,3,4},如果经纪人3或4跌倒,它将从ISR被踢出。你提到的情况就会发生。 当机架1的经纪人失败时,这将是一个不干净的领导人选举。