Kafka 引入了 rack-id 以在整个机架出现故障时提供冗余功能。有一个最小同步副本设置来指定在生产者收到确认之前需要同步的最小副本数(-1 / 所有配置)。有一个不干净的leader选举设置来指定一个leader在不同步时是否可以被选举。
因此,鉴于以下场景:
旨在至少进行一次消息传递、节点冗余和对机架故障的容忍。
是否有可能在某个时刻两个同步副本都来自机架 1,因此生产者收到 ack 并且此时机架 1 崩溃(在机架 2 的任何副本同步之前)?这意味着机架 2 将只包含不干净的副本,并且没有生产者能够将消息添加到分区,基本上是停止。副本将是不干净的,因此在任何情况下都无法选出新的领导者。
我的分析是否正确,或者是否有什么东西可以确保形成最小同步副本的副本必须来自不同的机架?
由于同一机架上的副本具有较低的延迟,因此上述情况似乎是合理的。
该场景如下图所示:
为了在技术上正确,你应该修正一些问题的措辞。不可能有不同步的副本“可用”。此外,最小同步副本设置指定了需要同步以使分区保持可用于写入的最小副本数。当生产者指定 ack (-1 / all config) 时,它仍然会等待来自所有同步副本的 ack 在那一刻(独立于最小同步副本的设置)。因此,如果您在 4 个副本同步时发布,则除非所有 4 个副本都提交消息(即使最小同步副本配置为 2),否则您将不会收到确认。仍然可以构建一个类似于您的问题的场景,通过首先使机架 2 中的 2 个分区不同步,然后在机架 1 中只有 2 个 ISR 时发布,从而突出显示相同的权衡问题,然后取下机架 1。在这种情况下,这些分区将无法读取或写入。因此,解决此问题的最简单方法是将最小同步副本增加到 3。另一个容错性较低的解决方法是将复制因子减少到 3。