Kafka 源码解析:集群协同运行控制器

Kafka 集群由一系列的 broker 节点构成,在这些 broker 节点中会选举一个节点成为所有 broker 节点的 leader(称之为 kafka controller),其余的 broker 节点均为 follower 角色。Kafka Controller 负责管理集群中所有 topic 分区和副本的状态,协调集群中所有 broker 节点的运行,同时也负责 kafka 与 ZK 之间的交互,下文中如果不特殊说明,Kafka Controller 均指代 leader 角色。

阅读全文

Kafka 源码解析:Group 协调管理机制

在 kafka 的设计中,消费者一般都有一个 group 的概念(当然,也存在不属于任何 group 的消费者),将多个消费者组织成一个 group 可以提升消息的消费处理能力,同时又能保证消息消费的顺序性,不重复或遗漏消费。一个 group 名下的消费者包含一个 leader 角色和多个 follower 角色,虽然在消费消息方面这两类角色是等价的,但是 leader 角色相对于 follower 角色还担负着管理整个 group 的职责。当 group 中有新的消费者加入,或者某个消费者因为一些原因退出当前 group 时,亦或是订阅的 topic 分区发生变化时,都需要为 group 名下的消费者重新分配分区,在服务端确定好分区分配策略之后,具体执行分区分配的工作则交由 leader 消费者负责,并在完成分区分配之后将分配结果反馈给服务端。

阅读全文

Kafka 源码解析:分区多副本容错机制

在分布式应用中,通常会引入冗余策略来保证集群中节点在宕机时的服务可用性,Kafka 在设计上也是如此。Kafka 会为每个 topic 分区创建多个副本,并将这些副本分散在多台 broker 节点上,以避免单点问题。一个分区的副本集合包含一个 leader 角色和多个 follower 角色,其中 leader 副本主要负责响应客户端对于指定 topic 分区消息的读写,并管理集合中的其它 follower 副本,而 follower 副本则主要负责与 leader 副本间保持数据同步,保证在 leader 副本失效时能够有新的 follower 选举成为新的 leader,以维持 kafka 服务的正常运行。

阅读全文

Kafka 源码解析:延时任务调度策略

Kafka 一些组件的命名很是有趣,比如炼狱(purgatory)、死神(reaper)等,在日常开发中也建议大家在类和方法命名上能够以一些能够表达类或方法意图的人或事物的名词进行命名,让项目显得更加的生动。今天我们要分析的组件就是以 purgatory 命名的 DelayedOperationPurgatory,DelayedOperationPurgatory 是一个相对独立的组件,我们可以将其抽取出来用于自己的日常项目中,DelayedOperationPurgatory 主要用于管理延时任务,底层依赖于分层时间轮算法实现。 说到延时任务调度,对于 java 开发者来说,日常用到比较多的可能是 JDK 自带的 Timer、ScheduledThreadPoolExecutor 和 DelayQueue 等,但是对于 kafka 这类需要频繁执行复杂延时任务的分布式系统来说,这些组件在性能上还稍显不足,所以 kafka 自定义了分层时间轮算法,提供了 O(1) 时间复杂度的任务读取和移除性能,要优于 JDK 自带的基于堆实现的 O(log(n)) 时间复杂度的延时任务调度策略。

阅读全文

Kafka 源码解析:日志数据存储机制

日志数据(亦称消息数据)的存储机制在 kafka 整个设计与实现中既基础又核心,Kafka 采用本地文件系统对日志数据进行存储,并允许为一个 broker 节点设置多个 log 文件目录,每个 log 目录下存储的数据又按照 topic 分区进行划分,其中包含了一个 topic 分区名下消息数据对应的多组日志和索引文件。 Kafka 定义了 LogSegment 类和 Log 类对日志和索引数据进行管理,并定义了 LogManager 类管理一个 broker 节点下的所有 Log 对象,同时基于 Log 对象提供了对日志数据的加载、创建、删除,以及查询等功能,同时还维护了多个定时任务对日志数据执行清理、删除、刷盘,以及记录 HW 位置等操作,并提供了对 key 重复的消息数据执行压缩的机制。

阅读全文

Kafka 源码解析:网络交互模型

由上一篇分析可以知道,在 broker 节点启动过程中会创建一个 SocketServer 类型的对象,并调用其 SocketServer#startup 方法执行组件的启动过程。SocketServer 是 kafka 对外提供网络服务的核心实现类,在 kafka 运行过程中用于接收来自客户端和其它 broker 节点的网络请求。考虑到性能上的需求,SocketServer 采用了 Reactor 模式,并基于 java NIO 实现。 参考如下示意图,Kafka 为 broker 所在宿主机的每一张网卡创建并绑定了一个 Acceptor 组件,用于接收并处理所有的连接请求;每个 Acceptor 组件维护多个 Processor 线程,其中每个 Processor 拥有专属的 Selector,用于从连接中读取请求和写回响应;每个 Acceptor 组件同时维护多个 Handler 线程,用于处理请求并生成响应传递给 Processor,而 Handler 与 Processor 之间通过请求队列进行通信。

阅读全文

Kafka 源码解析:Broker 节点的启动与关闭

从本篇开始我们分析 kafka 的服务端组件实现,Kafka 集群由多个 broker 节点构成,每一个节点上都运行着一个 kafka 实例,这些实例之间基于 ZK 来发现彼此,并由集群控制器 KafkaController 统筹协调运行,彼此之间基于 socket 连接进行通信。本篇我们主要分析单个 broker 节点上 kafka 实例的启动和关闭过程,关于集群整体的协调运行机制将在后面按照组件逐一进行分析。 Kafka 提供了 kafka-server-start.sh 脚本来简化服务的启动操作,脚本中通过调用 kafka.Kafka 类来启动 kafka 服务,这也是 kafka 整个服务端的驱动类。在 kafka 服务启动过程中,首先会解析并封装命令行传递的参数,然后创建负责 kafka 服务启动和关闭操作的 KafkaServerStartable 类对象,并调用 KafkaServerStartable#startup 方法启动服务。

阅读全文

Kafka 源码解析:消费者运行机制

与上一篇介绍的 KafkaProducer 一样,Kafka 消费者 KafkaConsumer 同样是 kafka 与开发者交互的媒介之一,负责从 kafka 集群拉取消息给应用程序消费,并提交已经消费完成的 offset 值。此外,考虑到消费者上下线的场景,以及 topic 分区数目变更的需求,KafkaConsumer 还需要负责与服务端交互执行分区再分配操作,以保证消费者能够更加均衡的消费 topic 分区,从而提升消费的性能。 Kafka 定义了 group 的概念,将多个消费者实例组织成为一个 group,以丰富 kafka 的应用场景。一个 group 名下可以包含任意数量的消费者实例,并从这些消费者中选择一个消费者担任 group 中的 leader 消费者角色,负责管理 group 和其它 follower 角色的消费者的状态。当有消费者加入或离开当前 group 时,Group leader 会依据集群确定的分区分配策略,为 group 名下所有消费者重新分配分区,以保证消息消费的均衡性。

阅读全文

Kafka 源码解析:生产者运行机制

Kafka 生产者 KafkaProducer 是 kafka 与开发者交互的媒介之一,肩负接收用户自定义消息(这里的消息指代往 kafka 发送的各类数据),并投递给目标 topic 分区的职责。在设计上为了提升消息吞吐量,考量降低与服务端交互的压力等,每次发送消息的请求并非是直接与 kafka 集群进行交互,而是一个异步的过程。 当调用 KafkaProducer#send 方法发送消息时,实际上只是将消息缓存到了本地的消息收集器中,Kafka 定义了一个 RecordAccumulator 收集器用于收集用户提交的消息数据,同时又在后台维护了一个 Sender 线程,以异步的方式不断将收集器中缓存的消息定期定量地投递给 kafka 集群。 在本篇文章中,我们首先回忆一下 KafkaProducer 的使用方式,然后重点分析消息的收集、缓存、投递,以及响应的过程。

阅读全文

Kafka 源码解析:架构与核心概念

Kafka 作为分布式消息引擎系统,已经被各大互联网公司广泛引入到生产环境中,主要用于消息的发布订阅、日志数据的采集等,以充当一个公司的数据总线角色。因其具备优良的性能和近乎实时的消息投递能力,并且能够保证消息的顺序性、持久性和完整性(不丢消息),同时引入 topic、partition,以及 group 等精妙的设计理念,所以自开源以来社区一直非常活跃。大厂在引入 kafka 时,一般会结合公司自身的业务特点在具体落地形式上有所区别(包括在 kafka 原有基础上扩展和优化,以及沿用 kafka 的设计思想重新设计实现等),但是在思想上仍然是相通的,所以了解 kafka 的核心设计与实现可以对这些系统举一反三。

阅读全文

Powered by hexo & Theme by hiero   Copyright © 2015-2019 浙ICP备 16010916  号,指 · 间 All Rights Reserved.