在 Kafka 中,Broker 是 Kafka 集群的核心组件之一,负责存储和管理消息。每个 Kafka 集群可以由一个或多个 Broker 组成,通常情况下,Kafka 集群会包含多个 Broker 来提高系统的容错性和扩展性。
1. Broker 的基本功能
Kafka Broker 主要负责以下几个方面的任务:
1.1 消息存储
- 存储消息:Kafka Broker 是消息的存储系统,负责接收和存储从生产者写入的消息(即 Producer 发出的数据)。每个 Kafka Broker 存储一个或多个 Topic 的消息。
- 分区管理:Kafka 中的每个 Topic 会被分成多个 Partition,这些分区数据会分布在集群中的多个 Broker 上。因此,Broker 负责管理各自存储的分区数据,确保消息的高效存储和读取。
1.2 消息分发
- 接收生产者消息:Kafka 的生产者将消息写入集群中的一个或多个 Broker,具体写入哪个 Broker 由 Kafka 的分区机制(基于哈希算法)决定。每个 Broker 处理自己负责的 Topic 分区的数据。
- 将数据推送到消费者:Kafka Broker 接收来自消费者的 Fetch 请求,并将相应的消息数据传递给消费者。消费者根据分配给它们的分区来消费消息。
- Leader 和 Follower:每个分区都会有一个 Leader 副本,其他副本称为 Follower。所有的读写请求都通过 Leader 来处理,Follower 副本从 Leader 中同步数据,确保数据的高可用性。
1.3 数据副本和容错
- 副本机制:每个分区都有一个 Leader 副本和多个 Follower 副本。Kafka 使用副本来保证数据的高可用性,确保即使某个 Broker 故障,数据也不会丢失。
- 数据同步:每个 Broker 会通过定期与 Leader 副本进行数据同步来保持数据一致性。Leader 副本负责处理所有的写请求,Follower 副本则通过从 Leader 拉取数据来保持与 Leader 副本同步。
1.4 负载均衡与分区分配
- 分区分配:Kafka Broker 负责对 Kafka 集群中的分区进行分配。分区通常会根据数据的负载均衡规则分布在多个 Broker 上,这样可以提高系统的吞吐量和扩展性。
- 分区迁移:在 Broker 故障、集群扩展或负载均衡时,Kafka 会进行 分区迁移,将一些分区从一个 Broker 移动到另一个 Broker 上,以确保负载的均衡和集群的高可用性。
1.5 协调集群的元数据
- 集群元数据:Kafka Broker 存储和维护 Kafka 集群的元数据,包括 Topic、Partition、Leader 副本 等信息。当新的生产者或消费者加入集群时,Broker 会向其提供最新的元数据。
- Zookeeper 协调:Kafka 集群通过 Zookeeper 来管理 Broker 的元数据。每个 Broker 启动时,会从 Zookeeper 获取集群的元数据信息,如哪些 Broker 存在哪些分区的副本、每个分区的 Leader、副本的同步状态等。虽然从 Kafka 2.8 开始,Kafka 提供了 KRaft 模式(去掉了 Zookeeper 的依赖),但在早期版本中,Zookeeper 是 Kafka 集群协调和元数据管理的核心组件。
1.6 处理消费者请求
- 消费者请求处理:Kafka Broker 通过 Fetch 请求 接收消费者的消息消费请求。当消费者从特定分区读取消息时,Kafka Broker 会将该分区的消息发送给消费者。
- 消费者分配:在 Kafka 中,消费者被组织成 消费者组(Consumer Group),Kafka Broker 会根据消费者组的情况将每个分区分配给消费者组中的一个消费者进行消费。Broker 根据消费者的 offset(位移)来决定从哪里开始返回数据。
1.7 维护日志
- 持久化消息:Kafka 是一个基于 日志 的消息系统。所有消息在 Kafka 中都是按顺序写入的,并且会持久化在磁盘上。每个消息都有一个唯一的 offset,消费者通过 offset 来定位消息的位置。
- 日志清理:Kafka 提供了 日志过期和清理 功能,允许根据消息的时间或者存储大小来清理老旧消息。Broker 会定期检查日志文件并删除过期的消息,以释放磁盘空间。
2. Kafka Broker 的分布式架构
Kafka 是一个分布式系统,因此 Kafka Broker 之间需要协同工作。一个 Kafka 集群通常由多个 Broker 组成,每个 Broker 存储一部分分区的数据。具体来说:
- Partition 分布:每个 Topic 被分成多个分区(Partition),每个分区会被分布在多个 Broker 上。通过这种分布,Kafka 可以实现高吞吐量和扩展性。
- 副本机制:每个分区有一个 Leader 和多个 Follower 副本,Leader 负责处理所有的读写请求,Follower 副本从 Leader 同步数据,确保高可用性。如果一个 Broker 崩溃,另一个 Follower 副本会被提升为 Leader,保证系统的容错能力。
3. Kafka Broker 与其他组件的关系
- 与生产者(Producer):生产者将消息发送到 Kafka Broker 中的特定分区。生产者会根据 Kafka 分区的分配规则(通常是根据消息的键进行哈希计算)选择将消息发送到哪个 Broker。
- 与消费者(Consumer):消费者向 Kafka Broker 请求消息。消费者根据自己的消费进度(offset)从 Kafka 中的分区读取数据。
- 与 ZooKeeper(早期版本):在早期的 Kafka 版本中,Kafka Broker 通过 ZooKeeper 来协调集群状态,管理元数据和进行 Leader 选举。在 Kafka 2.8 及以后版本,Kafka 提供了 KRaft 模式(Kafka Raft Protocol),实现了不依赖 ZooKeeper 的功能。
4. Kafka Broker 的关键配置
一些常见的与 Broker 相关的配置项:
log.dirs
:指定 Kafka 存储消息日志的目录位置。
log.retention.hours
:控制 Kafka 存储日志的时间。
log.retention.bytes
:控制 Kafka 存储日志的最大字节数。
num.partitions
:Kafka 启动时默认创建的分区数。
replication.factor
:控制每个分区的副本数。
zookeeper.connect
:指定 ZooKeeper 集群的地址,用于集群协调。
5. Kafka Broker 的高可用性与容错
Kafka 使用 副本机制 确保数据的高可用性和容错性。每个分区会有多个副本,副本分布在不同的 Broker 上。如果某个 Broker 故障,Kafka 会自动将该 Broker 上的分区 Leader 切换到另一个可用的 Follower 副本,从而保证数据不丢失,并且 Kafka 服务继续可用。