Kafka是一个分布式流处理平台。提供高吞吐量、低延迟的消息发布/订阅服务,支持分布式存储和流处理。适用于日志收集存储、实时数据流处理(用户行为分析、监控系统和推荐系统)、消息队列(解耦生产者和消费者)、事件驱动架构(服务异步通信)、数据集成(通过Kafka Connect,可将Kafka与其它数据存储系统集成)。
架构
客户端-服务端架构
Kafka也是客户端-服务端的CS架构。它的客户端有两种状态:
- 生产者是负责向服务端发送消息的客户端程序。
- 消费者是从服务端读取消息的客户端程序,通常属于一个消费者组,同一组的消费者会协作消费“主题”中的消息。
接下来从大到小介绍Kafka的架构。
集群
Kafka集群由多个Broker(代理) 组成,每一个Broker是一个Kafka实例,负责存储对应分区(Partition) 的数据、处理客户端读写请求。Kafka使用Zookeeper(或者从Kafka2.8开始的KRaft) 进行集群管理,主要负责:
- 存储元数据:分区分配、leader信息等。
- 进行leader选举。
- 监控Broker健康状态。
代理Broker
Broker本质就是运行在机器上的Kafka进程:
- 存储分区数据、数据分布在集群的多个Broker上,从而实现负载均衡。
- 处理客户端读写请求。
- 通过唯一ID标识自己,用于监控、选举等。
主题Topic
Topic是消息的分类单元(比如不同类型的日志消息应该被分类到不同的Topic),生产者将消息发送到特定的Topic,消费者从Topic中读取消息。每一个Topic可以看作一个消息队列。
如果生产者和消费者都只能访问同一个Topic,会出现阻塞和单点故障的问题,因此Topic支持分区,减少阻塞。每一个Topic可以分为多个分区,每个分区可以有多个副本,用于单点故障恢复。
分区Partition
每一个分区可以分布在不同的Broker上,分区允许Kafka进行水平扩展:
- 生产者可以指定发送到哪个分区,也可以只指定Topic,让Kafka根据分区策略自动分配。
- 多个消费者可以并行读取不同分区的数据。
- 每一个分区有一个Leader和Follower,Leader负责处理所有的读写请求,Follower作为备份,用于单点故障恢复。