1 整体架构
1.1 Zookeeper
Zookeeper 是一个分布式协调服务,用于管理 Kafka 的元数据。它负责维护 Kafka 集群的配置信息、Broker 列表和分区的 Leader 信息。
Zookeeper 确保了 Kafka 集群的高可用性和可靠性。
但 Zookeeper 已经成为 Kafka 性能瓶颈,Kafka 正在逐渐去 Zookeeper 化。
1.2 Broker
每个kafka server称为一个Broker,多个borker组成kafka cluster。
1.3 Topic
Topic 是 Kafka 中用于组织数据的逻辑单元,类似于数据库中的表。
一个Broker上可以创建一个或者多个Topic。同一个topic可以在同一集群下的多个Broker中分布
1.4 Partition
Partition 是 Topic 的子单元,用于实现数据的分布式存储和并行处理。每个 Partition 是一个有序的、不可变的消息队列,新的消息追加到队列末尾。
Kafka 会为每个 Topic 维护了多个 Partition。
每个 Partition 有一个 Leader 和多个 Follower 副本。Leader 负责处理所有读写请求,Follower 副本被动地从 Leader 同步数据。如果 Leader 发生故障,Zookeeper 会选举一个新的 Leader 以保证高可用性。比如图中,Broker 1 是 Topic 1 的 Partition 1 的 Leader,是 Partition 2、3 的 Follower。
2 生产者与消费者
2.1 生产者
生产者是向 Kafka 发送数据的客户端应用程序。生产者将消息发送到特定的 Topic 和 Partition 中。
向 Partition 发送数据的过程:
- 生产者根据分区策略(如轮询、哈希分区键)选择目标 Partition。
- 生产者将消息发送到选定的 Partition,Leader 接收到消息后将其追加到日志中。
- 生产者可以选择等待 Leader 确认消息已写入并复制到一定数量的 Follower 后再继续发送下一个消息,以确保数据可靠性。
2.2 消费者
消费者是从 Kafka 中读取数据的客户端应用程序。消费者订阅一个或多个 Topic,并从中消费消息。
消费者组:
- 消费者组是 Kafka 的一项功能,允许多个消费者共同消费一个 Topic 的消息。
- 每个消费者组中的消费者都会从一个或多个 Partition 中读取消息,但同一 Partition 的消息只会被一个组内的消费者读取,以实现负载均衡。
- 如果一个消费者挂掉,组内的其他消费者会自动接管它的分区,以确保消息不会丢失。
消费数据的过程:
- 消费者启动时连接到Kafka集群并订阅一个或多个主题。
- 通过poll方法,消费者从分配的分区中拉取消息并进行处理。
- 处理完成后,消费者会提交偏移量以标识已处理的位置。
- Kafka会在消费者数量变化时触发分区再均衡,确保每个分区都有消费者进行消费,避免数据丢失或重复消费。