kafka原理介绍

本文介绍了Apache Kafka消息系统的起源、特点及其工作原理。Kafka是一个分布式发布-订阅消息系统,支持高吞吐量、容错性和可扩展性。文章详细解释了Kafka中的基本概念,如Topic、Partition和Replica等,并提供了Kafka的工作流程和架构说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kafka简介


Apache Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成为Apache的主要项目之一。Kafka使用Scala和Java进行编写。Apache Kafka是一个快速、可扩展的、高吞吐、可容错的分布式发布订阅消息系统。Kafka具有高吞吐量、内置分区、支持数据副本和容错的特性,适合在大规模消息处理场景中使用。

接下来先介绍下消息系统的基本理念,然后再介绍Kafka。

消息系统介绍

一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅模式。

点对点消息系统

在点对点消息系统中,消息持久化到一个队列中。此时,将有一个或多个消费者消费队列中的数据。但是一条消息只能被消费一次。当一个消费者消费了队列中的某条数据之后,该条数据则从消息队列中删除。该模式即使有多个消费者同时消费数据,也能保证数据处理的顺序。这种架构描述示意图如下:

p2pMsgQueue

发布-订阅消息系统

在发布-订阅消息系统中,消息被持久化到一个topic中。与点对点消息系统不同的是,消费者可以订阅一个或多个topic,消费者可以消费该topic中所有的数据,同一条数据可以被多个消费者消费,数据被消费后不会立马删除。在发布-订阅消息系统中,消息的生产者称为发布者,消费者称为订阅者。该模式的示例图如下:

pub-subMsgQueue

Kafka概述

Apache Kafka是一个分布式的发布-订阅消息系统,能够支撑海量数据的数据传递。在离线和实时的消息处理业务系统中,Kafka都有广泛的应用。Kafka将消息持久化到磁盘中,并对消息创建了备份保证了数据的安全。Kafka在保证了较高的处理速度的同时,又能保证数据处理的低延迟和数据的零丢失。

Kafka的优势在于:

  • 可靠性:Kafka是一个具有分区机制、副本机制和容错机制的分布式消息系统
  • 可扩展性:Kafka消息系统支持集群规模的热扩展
  • 高性能:Kafka在数据发布和订阅过程中都能保证数据的高吞吐量。即便在TB级数据存储的情况下,仍然能保证稳定的性能。

Kafka术语

在深入理解Kafka之前,先介绍一下Kafka中的术语。下图展示了Kafka的相关术语以及之间的关系:

KafkaTerminologies

上图中一个topic配置了3个partition。Partition1有两个offset:0和1。Partition2有4个offset。Partition3有1个offset。副本的id和副本所在的机器的id恰好相同。

如果一个topic的副本数为3,那么Kafka将在集群中为每个partition创建3个相同的副本。集群中的每个broker存储一个或多个partition。多个producer和consumer可同时生产和消费数据。

各个术语的详细介绍如下:

  • Topic:在Kafka中,使用一个类别属性来划分数据的所属类,划分数据的这个类称为topic。如果把Kafka看做为一个数据库,topic可以理解为数据库中的一张表,topic的名字即为表名。
  • Partition:topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
  • Partition offset:每条消息都有一个当前Partition下唯一的64字节的offset,它指明了这条消息的起始位置。
  • Replicas of partition:副本是一个分区的备份。副本不会被消费者消费,副本只用于防止数据丢失,即消费者不从为follower的partition中消费数据,而是从为leader的partition中读取数据。
  • Broker:
    • Kafka 集群包含一个或多个服务器,服务器节点称为broker。
    • broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
    • 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
    • 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
  • Producer:生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。
  • Consumer:消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。
  • Leader:每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。
  • Follower:Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。

Kafka架构

Kafka的架构示意图如下:

kfkArchi

  • Broker:Kafka的broker是无状态的,broker使用Zookeeper维护集群的状态。Leader的选举也由Zookeeper负责。
  • Zookeeper:Zookeeper负责维护和协调broker。当Kafka系统中新增了broker或者某个broker发生故障失效时,由ZooKeeper通知生产者和消费者。生产者和消费者依据Zookeeper的broker状态信息与broker协调数据的发布和订阅任务。
  • Producer:生产者将数据推送到broker上,当集群中出现新的broker时,所有的生产者将会搜寻到这个新的broker,并自动将数据发送到这个broker上。
  • Consumer:因为Kafka的broker是无状态的,所以consumer必须使用partition offset来记录消费了多少数据。如果一个consumer指定了一个topic的offset,意味着该consumer已经消费了该offset之前的所有数据。consumer可以通过指定offset,从topic的指定位置开始消费数据。consumer的offset存储在Zookeeper中。

Kafka工作流程

Kafka将某topic的数据存储到一个或多个partition中。一个partition内数据是有序的,每条数据都有一个唯一的index,这个index叫做offset。新来的数据追加到partition的尾部。每条数据可以在不同的broker上做备份,从而保证了Kafka使用的可靠性。

生产者将消息发送到topic中,消费者可以选择多种消费方式消费Kafka中的数据。下面介绍两种消费方式的流程。

一个消费者订阅数据:

  • 生产者将数据发送到指定topic中
  • Kafka将数据以partition的方式存储到broker上。Kafka支持数据均衡,例如生产者生成了两条消息,topic有两个partition,那么Kafka将在两个partition上分别存储一条消息
  • 消费者订阅指定topic的数据
  • 当消费者订阅topic中消息时,Kafka将当前的offset发给消费者,同时将offset存储到Zookeeper中
  • 消费者以特定的间隔(如100ms)向Kafka请求数据
  • 当Kafka接收到生产者发送的数据时,Kafka将这些数据推送给消费者
  • 消费者受到Kafka推送的数据,并进行处理
  • 当消费者处理完该条消息后,消费者向Kafka broker发送一个该消息已被消费的反馈
  • 当Kafka接到消费者的反馈后,Kafka更新offset包括Zookeeper中的offset。
  • 以上过程一直重复,直到消费者停止请求数据
  • 消费者可以重置offset,从而可以灵活消费存储在Kafka上的数据

消费者组数据消费流程

Kafka支持消费者组内的多个消费者同时消费一个topic,一个消费者组由具有同一个Group ID的多个消费者组成。具体流程如下:

  • 生产者发送数据到指定的topic
  • Kafka将数据存储到broker上的partition中
  • 假设现在有一个消费者订阅了一个topic,topic名字为“test”,消费者的Group ID为“Group1”
  • 此时Kafka的处理方式与只有一个消费者的情况一样
  • 当Kafka接收到一个同样Group ID为“Group1”、消费的topic同样为“test"的消费者的请求时,Kafka把数据操作模式切换为分享模式,此时数据将在两个消费者上共享。
  • 当消费者的数目超过topic的partition数目时,后来的消费者将消费不到Kafka中的数据。因为在Kafka给每一个消费者消费者至少分配一个partition,一旦partition都被指派给消费者了,新来的消费者将不会再分配partition。即一个partition只能分配给一个消费者,一个消费者可以消费多个partition。

Kafka自带工具

Kafka tool包在org.apache.Kafka.tools.*下,分为系统工具和复制工具两类,重点介绍几个系统工具:

  • Kafka Migration Tool:该工具用于将broker的版本从一个版本更新或还原为另一版本。
  • Mirror Maker:该工具用于将源Kafka集群的数据镜像到目的集群。
  • Consumer Offset Checker:该工具用于显示指定topic和消费者组的信息,信息包括:消费者组名、topic名、partition、offset、logSize、owner等。
### Kafka 工作原理及架构解析 Kafka 是一个分布式流处理平台,其设计目标是提供高吞吐量、低延迟的消息传递系统[^1]。以下是 Kafka 的核心架构和工作原理的详细解析。 #### 1. 核心组件 Kafka 的架构由多个核心组件构成,每个组件在系统中扮演特定的角色: - **Producer(生产者)**:负责将消息发布到 Kafka 集群中的特定主题(Topic)。生产者可以选择分区策略以确保消息的有序性[^3]。 - **Consumer(消费者)**:从 Kafka 集群订阅消息并进行处理。消费者可以通过组(Consumer Group)的方式实现负载均衡和故障恢复[^3]。 - **Broker**:Kafka 集群中的服务器实例,负责接收、存储和转发消息。每个 Broker 可以管理多个 Topic 和 Partition[^2]。 - **Topic(主题)**:逻辑上的消息别或提要名称。每个 Topic 可以分为多个 Partition,Partition 是 Kafka 中消息存储的基本单位。 - **Partition(分区)**:Topic 的物理分组,每个 Partition 是一个有序的日志文件。Partition 提供了 Kafka 的水平扩展能力。 - **ZooKeeper**:用于管理 Kafka 集群的元数据和协调服务。从 Kafka 2.8 开始,支持无 ZooKeeper 模式。 #### 2. 消息持久化与可靠性 Kafka 使用分布式持久化机制将消息写入磁盘,并通过多副本机制保证数据的可靠性[^3]。以下是关键点: - **多副本机制**:每个 Partition 可以配置多个副本(Replica),其中一个为主副本(Leader),其余为从副本(Follower)。只有 Leader 负责读写操作,Follower 同步 Leader 的数据[^2]。 - **ISR(In-Sync Replica)**:Kafka 维护了一个 ISR 列表,记录与 Leader 同步的所有副本。如果某个副本长时间未同步,将被移出 ISR 列表。 - **消息确认机制**:生产者发送消息时可以设置不同的 ACK 策略: - `acks=0`:不等待确认,可能丢失消息。 - `acks=1`:等待 Leader 确认,默认选项。 - `acks=all`:等待所有 ISR 副本确认,提供最高可靠性。 #### 3. 分区与负载均衡 Kafka 的分区机制是其实现水平扩展的核心。以下是分区的主要功能: - **分区选择策略**: - 指定分区:直接将消息发送到指定的 Partition。 - Key 哈希:根据消息的 Key 计算哈希值,确保相同 Key 的消息进入同一 Partition。 - 轮询:均匀分布到各 Partition,适用于无序消息。 - **负载均衡**:通过分区,Kafka 可以将消息均匀分布到多个 Broker 上,从而提高系统的吞吐量和可用性。 #### 4. 消费模式 Kafka 支持多种消费模式,满足不同场景的需求: - **At-Least-Once(至少一次)**:确保每条消息至少被消费一次,可能会出现重复消费的情况。 - **At-Most-Once(至多一次)**:确保每条消息最多被消费一次,但可能会丢失消息。 - **Exactly-Once(恰好一次)**:通过事务机制和幂等性支持,确保每条消息被消费且仅消费一次[^3]。 #### 5. 数据清理策略 为了防止无限增长的存储空间,Kafka 提供了两种主要的数据清理策略: - **基于时间的清理**:保留消息一定时间后删除。 - **基于大小的清理**:当 Partition 的日志大小超过设定阈值时,删除最早的日志段[^2]。 ### 示例代码 以下是一个简单的 Kafka 生产者和消费者的代码示例: ```python # Kafka生产者示例 from kafka import KafkaProducer producer = KafkaProducer(bootstrap_servers='localhost:9092') producer.send('my-topic', b'Hello, Kafka!') producer.close() # Kafka消费者示例 from kafka import KafkaConsumer consumer = KafkaConsumer('my-topic', bootstrap_servers='localhost:9092') for message in consumer: print(f"Received message: {message.value.decode('utf-8')}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值