8

假设我想在小型部署的生产环境中拥有高可用性的 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

如果 1 个代理崩溃并且 1 个副本随之消失,Kafka 会开始制作新的副本吗?

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

4

2 回答 2

12

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

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

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

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

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

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

于 2018-11-08T14:17:04.273 回答
0

好吧,您可以将 replication.factor 与min.insync.replicas. 但可能会有一些挑战。

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

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

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

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

于 2018-11-08T14:10:23.940 回答