假设我想通过小规模部署在生产中使用高可用的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个副本随其消失,卡夫卡会开始制作新副本吗?
在任何条件下,我们是否必须至少具有 default.replication.factor 个经纪人数量才能保持正常工作?
答案 0 :(得分:0)
好吧,您可以具有与min.insync.replicas
相同的Replication.factor。但是可能会有一些挑战。
我们知道,在代理中断期间,该代理上存在的所有分区副本都不可用。受影响分区的时间可用性取决于其其他副本的存在和状态。
如果分区没有其他副本,则该分区将完全不可用。但是,如果分区中有其他同步副本,则这些同步副本之一将成为临时分区的负责人。如果该分区具有其他副本,但没有其他副本处于同步状态,则我们可以选择:要么选择等待分区负责人恢复在线状态(从而提高可用性),要么允许不同步的副本成为临时副本。分区负责人–牺牲一致性。
因此,在这种情况下,任何分区都将拥有一个额外的同步副本,以应对丢失分区领导者的情况。 这意味着,min.insync.replicas应该设置为至少2。
为使ISR的最小大小为2,复制因子也必须至少为2。 但是,如果只有2个副本且一个代理不可用,则ISR大小将减小到最小值以下的1。因此,最好使复制因子大于最小ISR大小(至少3)。
答案 1 :(得分:0)
要在Kafka中启用高可用性,您需要考虑以下因素:
1。复制因子:默认情况下,复制因子设置为1
。对于生产环境,推荐的replication-factor
是3
,这意味着需要3个经纪人。
2。首选领导者选举:取消代理后,其中一个副本将成为分区的新领导者。一旦发生故障的代理重新启动并运行,它将没有领导者分区,Kafka将恢复其在宕机时丢失的信息,并再次成为分区领导者。默认情况下,首选领导者选举已启用。为了最小化切换回首选领导者时丢失消息的风险,您需要将生产者属性acks
设置为all
。
3。不洁的领导人选举: 您可以启用不干净的领导者选择,以使不同步的副本成为领导者并保持分区的高可用性。领导者选举不干净时,未同步到新领导者的消息将丢失。在一致性和高可用性之间需要权衡取舍,这意味着在禁用不干净的领导者选择的情况下,如果包含分区的领导者副本的代理不可用,并且不存在任何同步副本来替换它,则直到领导者之前该分区都将不可用副本或另一个同步副本已恢复在线。
4。致谢:
确认是指在使用acks
属性确认消息之前提交新消息的副本数。将acks设置为0
时,将立即确认该消息,而无需等待其他代理提交。设置为1
时,领导者确认消息后,消息即被确认。将acks
设置为all
可提供最高的一致性保证,但写入群集的速度较慢。
5。最小同步副本数:min.insync.replicas
定义了生产者成功将消息发送到分区所必须具有的最小同步副本数。如果设置了min.insync.replicas
如果2
设置为acks
,并且all
设置为this.route.parent.routeConfig.children
,则每个消息必须成功写入至少两个副本。这意味着除非两个代理都失败(不太可能),否则消息不会丢失。如果其中一个代理发生故障,则该分区将不再可用于写入。同样,这是一致性和可用性之间的权衡。