Kafka:高可用最少需要多少个broker?

Ale*_*kin 7 high-availability apache-kafka kafka-cluster

假设我想在小型部署的生产环境中拥有高度可用的 Kafka。我必须使用以下配置

min.insync.replicas=2 // Don't want to lose messages in case of 1 broker crash    
default.replication.factor=3 // Will let producer write in case of 1 replica disappear with broker crash
Run Code Online (Sandbox Code Playgroud)

如果 1 个 broker 崩溃并且 1 个副本消失,Kafka 会开始制作新副本吗?

在任何情况下,我们是否必须至少有default.replication.factor数量的经纪人才能继续工作?

Gio*_*ous 9

为了在 Kafka 中实现高可用性,您需要考虑以下因素:

1. 复制因子:默认情况下,复制因子设置为1。推荐replication-factor用于生产环境,3这意味着需要3 个代理

2. 首选Leader选举:当一个broker被关闭时,其中一个副本成为一个分区的新leader。一旦失败的broker重新启动并运行,它就没有leader分区,Kafka恢复它在宕机时丢失的信息,它再次成为分区leader。默认情况下启用首选领导者选举。为了将切换回首选领导者时丢失消息的风险降至最低,您需要将生产者属性设置acksall(显然这是以性能为代价的)。

3. Unclean Leader Election:您可以启用不干净的leader选举,以允许不同步的副本成为leader并保持分区的高可用性。对于不干净的领导者选举,未同步到新领导者的消息将丢失。一致性和高可用性之间存在权衡,这意味着在禁用不干净的领导者选举的情况下,如果包含分区领导副本的代理变得不可用,并且不存在同步副本来替换它,则该分区将变得不可用,直到领导者出现副本或另一个同步副本重新联机。

4.确认:确认是指在使用acks属性确认消息之前提交新消息的副本数。当 acks 设置为0消息时,立即确认消息,而无需等待其他代理提交。当设置为 时1,一旦领导者提交消息,消息就会被确认。配置acksall提供最高的一致性保证,但对集群的写入速度较慢。

5. 最小同步副本数min.insync.replicas定义生产者必须可用的最小同步副本数才能成功地将消息发送到分区。min.insync.replicas如果设置为2并且acks设置为all,则必须成功写入每条消息到至少两个副本。这意味着消息不会丢失,除非两个代理都失败(不太可能)。如果其中一个代理失败,则该分区将不再可用于写入。同样,这是一致性和可用性之间的权衡。


Nis*_*yal 0

好吧,你可以让replication.factor 与 相同min.insync.replicas。但可能会遇到一些挑战。

\n\n

我们知道,在代理中断期间,该代理上存在的所有分区副本都会变得不可用。受影响分区的时间可用性取决于其其他副本的存在和状态。

\n\n

如果分区没有额外的副本,则该分区将完全不可用。但是,如果分区具有其他同步副本,则这些同步副本之一将成为临时分区领导者。如果分区有其他副本但没有一个是同步的,我们可以选择:要么选择等待分区领导者重新上线\xe2\x80\x93牺牲可用性\xe2\x80\x8a\xe2\x80 \x94\xe2\x80\x8a 或允许不同步副本成为临时分区领导者\xe2\x80\x93,从而牺牲一致性。

\n\n

因此,在这种情况下,任何分区都会有一个额外的同步副本,以便在分区领导者丢失时幸存下来。\n这意味着 min.insync.replicas 应至少设置为 2。

\n\n

为了使 ISR 大小最小为 2,复制因子也必须至少为 2。\n但是,如果只有 2 个副本且 1 个代理不可用,则 ISR 大小将减小到最小值以下 1。因此,复制因子最好大于最小 ISR 大小(至少 3)。

\n