kafka基本概念和工作原理
Kafka是一个拥有高吞吐、可持久化、可水平扩展,支持流式数据处理等多种特性的分布式消息流处理中间件,采用分布式消息发布与订阅机制,在日志收集、流式数据传输、在线/离线系统分析、实时监控等领域有广泛的应用。
Kafka核心概念
Kafka的架构围绕着以下核心概念设计:
1. Producer(生产者)
- 定义:Producer是Kafka中的消息发布者,它负责将消息发送到Kafka集群中的特定主题(Topic)或分区(Partition)。
- 工作方式:Producer将消息写入到特定的Kafka主题,每条消息会被追加到相应主题的分区中。生产者可以选择发送到一个具体的分区,或者让Kafka根据某种规则(如消息的键)来决定消息的分区。
- 批量发送:为了提高效率,Producer通常会批量发送消息,减少网络传输次数。
2. Consumer(消费者)
- 定义:Consumer是从Kafka中读取数据的客户端,它订阅一个或多个主题并消费其中的消息。
- 工作方式:消费者通过订阅主题来从Kafka集群中读取消息。Kafka允许消费者同时消费不同分区的数据。消费者可以通过自动或手动的方式提交消费位移(offset),以记录消息读取的位置。
3. Topic(主题)
- 定义:Kafka中的主题(Topic)是消息的逻辑分类,一个主题是由一个或多个生产者发布的消息集合。
- 分区:一个主题可以有多个分区(Partition)。Kafka通过分区将消息分布在不同的Broker上,从而提高系统的并发处理能力。
- 消息顺序:Kafka保证同一分区内的消息有序,但是跨分区的消息顺序不能得到保证。
4. Partition(分区)
- 定义:每个Kafka主题由多个分区组成。分区是Kafka消息存储的基本单元。
- 工作方式:每个分区都是一个日志文件,消息按照顺序追加到该日志中。Kafka的每个分区都可以被多个Broker节点复制,以确保数据的高可用性和容错能力。
- 高并发处理:分区允许Kafka在多个Broker之间分散数据,从而提供水平扩展能力,并允许多个消费者并行处理数据。
5. Broker(代理)
- 定义:Kafka集群由多个Broker节点组成。每个Broker负责存储一部分主题的分区。
- 工作方式:Broker接收来自生产者的消息并将其存储到本地磁盘,同时将消息转发给消费者。Kafka通过将多个Broker组成集群来增加系统的可扩展性和容错性。
6. Consumer Group(消费者组)
- 定义:一个消费者组由多个消费者组成,这些消费者共同消费一个或多个主题的数据。
- 工作方式:消费者组内的每个消费者负责消费一个或多个分区中的消息。Kafka确保每个分区内的消息只会被消费者组中的一个消费者消费。这样,消费者组提供了负载均衡的能力,并可以保证消息不会被重复消费。
7. Zookeeper
- 定义:Zookeeper是一个分布式协调服务,用于管理Kafka集群的元数据,包括Broker注册、消费者组管理、分区领导选举等。
- 工作方式:Kafka使用Zookeeper来协调多个Broker之间的状态变化,例如选举哪个Broker为Leader,哪些Broker负责存储哪些分区等。每个Broker会将自己的元数据注册到Zookeeper中。
8.副本(Replica)
- 消息的备份存储。为了确保消息可靠,Kafka创建Topic时,每个分区会分别从代理中选择1个或多个,对消息进行冗余存储。
- Topic的所有消息分布式存储在各个分区上,分区在每个副本存储一份全量数据,副本之间的消息数据保持同步,任何一个副本不可用,数据都不会丢失。
- 每个分区都随机挑选一个副本作为Leader,该分区所有消息的生产与消费都在Leader副本上完成,消息从Leader副本复制到其他副本(Follower)。
- Kafka的主题和分区属于逻辑概念,副本与代理属于物理概念。下图通过消息的生产与消费流向,解释了Kafka的分区、代理与主题间的关系。
图1 kafka消息流(https://support.huaweicloud.com/productdesc-kafka/glossary-kafka.html)
Kafka工作原理
Kafka的工作原理依赖于高吞吐量、分布式架构和消息的持久化存储。下面是Kafka的工作原理的详细介绍:
1. 消息生产
- 生产者向主题发送消息:生产者将消息发送到Kafka的一个或多个主题,每个主题可以有多个分区。生产者可以根据自定义的分区策略,选择将消息发送到某个具体的分区,或者让Kafka根据消息的键来决定目标分区。
- 消息写入磁盘:Kafka并不直接将消息存储在内存中,而是将它们追加到磁盘中的分区日志文件里。这种方式保证了消息的持久性,并减少了内存压力。
2. 消息分发与存储
- Broker存储消息:Kafka的每个Broker负责管理一个或多个分区的消息。分区的消息按顺序追加到磁盘中,且消息一旦写入磁盘,就不会被修改或删除,直到超过保留时间或达到存储空间限制。
- 消息副本:Kafka通过副本机制提供高可用性。每个分区有一个主副本(Leader)和多个备份副本(Follower)。所有的写操作都发生在Leader副本上,Follower副本从Leader同步数据。Kafka保证数据的一致性和容错性。
3. 消息消费
- 消费者订阅主题:消费者可以订阅一个或多个主题,从中读取消息。Kafka允许多个消费者组成消费者组(Consumer Group),每个消费者组内的消费者会并行消费消息。
- 消费位移(Offset)管理:消费者读取消息时,每个消费者会记录自己已经读取的消息位置(即offset)。Kafka支持两种位移管理方式:一种是Kafka自己管理位移,另一种是由消费者手动提交位移。Kafka允许消费者从任意位置开始消费消息。
4. 消息的持久化与日志管理
- 日志分区:每个Kafka主题下的消息会被分配到不同的分区。每个分区内的消息是按顺序排列的,Kafka通过追加方式保证了高效的磁盘写入性能。
- 日志滚动与存储:Kafka会定期滚动日志文件,生成新的日志段。日志段会根据配置的保留策略(如消息保留时间或磁盘空间限制)被删除或归档。消息在保留期内不可修改,确保消息的完整性和一致性。
5. 容错与高可用性
- 分区副本机制:Kafka通过将每个分区的数据复制到多个Broker节点上,来保证系统的容错性和高可用性。如果某个Broker节点宕机,其他Broker仍然可以提供数据访问。Kafka通过ZooKeeper来进行分区的Leader选举。
- 自动故障恢复:当某个Broker不可用时,Kafka会自动将该Broker上的分区领导(Leader)迁移到其他健康的Broker节点,确保服务的连续性。
6. Kafka的消费模型
- 单个消费者消费:消费者直接从一个或多个分区读取消息。
- 消费者组消费:多个消费者组成一个消费者组,Kafka会为每个消费者分配一个或多个分区,保证每个分区内的消息只被一个消费者处理。多个消费者组可以同时独立消费相同的数据,保证不同应用之间的消息隔离。
Kafka的高效性与可扩展性
- 高吞吐量:Kafka通过顺序写入磁盘,批量处理消息,使用零拷贝技术等手段来优化吞吐量。它可以处理每秒数百万条消息。
- 水平扩展:Kafka的分布式架构允许通过增加Broker来水平扩展,支持更高的并发和数据容量。
- 低延迟:Kafka设计上追求低延迟,尤其在数据流处理和实时分析场景下具有优势。
PS:Kafka简单类比为大型超市,在超市里面有各个购物区(Topic)比如:零食区、水果蔬菜区、日用生活区等,每个购物区下面都有对应的货架,上面放着商品(消息),商品由工厂(Producer)生产,每名顾客(消费者)去对应的购物区的货架上获取所需的商品(消息)。
参考文章:https://support.huaweicloud.com/productdesc-kafka/glossary-kafka.html
Kafka碎碎念 文章被收录于专栏
Kafka的一些碎碎念,哈哈哈哈哈