25 | ReplicaManager(下):副本管理器是如何管理副本的?
分区及副本管理
- 深入了解
- 翻译
- 解释
- 总结
Kafka中的副本管理器是系统中的关键组件,通过ReplicaManager类实现副本的读写操作。它统一管理所有分区对象,并负责确定Leader和Follower副本。副本管理器通过Controller发送请求来实现副本角色的变化,并在收到请求后调用becomeLeaderOrFollower方法处理逻辑。makeLeaders方法的作用是让当前Broker成为给定一组分区的Leader,主要包括停止获取线程、更新分区元数据信息和将指定分区添加到Leader分区集合。makeFollowers方法则实现了将当前Broker成为给定一组分区的Follower的功能。这两个方法在副本管理中扮演着重要角色,确保了Kafka系统中副本角色的正确性和一致性。除了读写副本、管理分区和副本的功能之外,副本管理器还有一个重要的功能,那就是管理ISR。ISR的收缩操作由maybeShrinkIsr方法实现,而maybePropagateIsrChanges方法则定期向集群Broker传播ISR的变更。这些功能的实现围绕着如何处理LeaderAndIsrRequest请求数据展开,对于理解Kafka的副本机制具有重要意义。 在ReplicaManager类中,maybeShrinkIsr方法负责收缩ISR副本集合,移除与Leader差距过大的副本。方法内部通过定时调度和判断副本滞后程度来实现收缩操作。另外,maybePropagateIsrChanges方法则负责定期传播ISR变更通知给集群的其他Broker,以同步ISR操作的结果。这两个方法的实现细节展示了Kafka副本管理器的核心功能和ISR管理机制。 总的来说,本文详细介绍了Kafka中副本管理器的功能和实现细节,包括副本角色的变化、ISR的管理和传播等关键内容。通过对ReplicaManager类的核心功能和方法的梳理,读者可以深入了解Kafka副本管理器的工作原理和重要功能,为进一步学习和应用Kafka系统提供了重要参考。
《Kafka 核心源码解读》,新⼈⾸单¥59
全部留言(5)
- 最新
- 精选
- 胡夕置顶你好,我是胡夕。我来公布上节课的“课后讨论”题答案啦~ 上节课,我们重点学习了副本管理器是如何读写副本的。课后我请你去研究下appendRecords方法中的origin字段的作用以及最终使用origin字段的具体源码位置。我的思考是:origin表示日志写入方的来源。当前有3种来源:Follower副本、Coordinator和普通客户端(Client)。origin在Log.scala和LogValidator.scala中被用到,主要做一些消息格式方面的判断。Kafka要求来自普通客户端的消息必须符合某些规定。origin就是用于判断消息是否来自于Client端。 okay,你同意这个说法吗?或者说你有其他的看法吗?我们可以一起讨论下。2020-06-231
- 伯安知心1,在执行shrinkIsr收缩和expandIsr扩充时候,更新标识符true时候,执行原子操作recordIsrChange, 2,执行maybePropagateIsrChanges定期检查是否要传播ISR时候,条件是:最近五秒钟没有ISR更改,或者自上次ISR传播以来已超过60秒。
作者回复: 嗯嗯,很好的总结。那再找找处理这个ISR事件的源码在哪里吧:)
2020-06-232 - 贝胡夕老师,我有个疑问,有没有可能出现broker1是旧的leader(还没来得及处理leaderandisr请求),broker2上是新的leader。producer此时要是发到broker1,并且append成功的情况。如果有,由于broker2的副本已经是leader,也不会向broker1同步数据了,当broker1变为follower后,这条消息是丢失了还是两个副本数据不一致了呢。
作者回复: 会做截断,把消息删除掉
2020-09-01 - 伯安知心对于shrink,在启动副本管理器的时候,需要运行定时调度线程schedule,replicaLagTimeMaxMs / 2为周期,执行maybeShrinkIsr,首先遍历那些ISR符合删除,然后更新zk和缓存中的数据。 对于expandIsr,在执行updateFollowerFetchState更新副本拉取状态的时候,判断副本id是否在IRS列表中,如果不在就执行maybeExpandIsr。
作者回复: 很棒的总结👍
2020-06-24 - 梁聪明maybeShrinkIsr的shrinkIsr(newInSyncReplicaIds)方法2020-09-05