【课程笔记】分布式消息通讯之Kafka的实现原理1

preview
需积分: 0 0 下载量 73 浏览量 更新于2022-08-04 收藏 17.45MB PDF 举报
分布式消息通讯之Kafka的实现原理 Kafka是一种高吞吐量、可持久化、可水平扩展、支持多分区的分布式消息队列系统。其核心实现原理可以分为两大部分:副本数据同步原理和副本leader选举原理。 副本数据同步原理: Kafka中每个Topic都可以被分为多个Partition,每个Partition都有一个Leader和多个Follower。Producer在发布消息时,会将消息发送到该Partition的Leader,Leader会将该消息写入其本地Log,然后每个Follower从Leader pull数据,以保持数据顺序的一致性。Follower在收到该消息并写入其Log后,向Leader发送ACK,一旦Leader收到了ISR中的所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW(HighWatermark)并且向Producer发送ACK。 ISR(In-Sync Replica)是Kafka中的一种机制,用于确保已经commit的数据不丢失。在ISR中至少有一个follower时,Kafka可以确保已经commit的数据不丢失,但如果某个Partition的所有Replica都宕机了,就无法保证数据不丢失了。 副本leader选举原理: 在ISR中至少有一个follower时,Kafka可以选择第一个“活”过来的Replica作为Leader,如果ISR中的所有Replica都无法“活”过来了,或者数据都丢失了,这个Partition将永远不可用。选择第一个“活”过来的Replica作为Leader,而这个Replica不是ISR中的Replica,那即使它并不保证已经包含了所有已commit的消息,它也会成为Leader而作为consumer的数据源。 LEO(Log End Offset)和HW(High Watermark)是Kafka中两种重要的概念。LEO记录了该副本底层日志中下一条消息的位移值,HW记录了已经commit的消息的位移值。leader LEO和follower LEO的更新是有区别的,小于等于HW值的所有消息都被认为是“已备份”的(replicated)。 在副本数据同步过程中,follower副本的LEO会不断地追赶到leader副本,以保持数据的一致性。这也会使得被踢出的follower副本重新加入到ISR集合中,并且可以使得这个Partition的HW发生变化。 初始状态下,leader和follower的HW和LEO都是0,leader副本会保存remote LEO,表示所有follower LEO,也会被初始化为0。follower会不断地向leader发送FETCH请求,以获取数据,但如果没有数据,这个请求会被leader寄存,直到指定的时间之后会强制完成请求。 Kafka的分布式消息通讯机制可以确保消息的可靠性和可用性,同时也提供了高吞吐量和可水平扩展的特性。