kafka原理介绍

本文详细介绍了Kafka的基本架构,包括broker、topic、producer和consumer的角色,以及partition和replica的工作原理。此外,还阐述了Kafka的高吞吐量、低延迟特性、可扩展性和容错性。讨论了producer如何push消息到broker,以及broker如何存储和管理消息。最后,提到了topic的创建与删除流程。

kafka原理介绍

一、基本架构

broker:中间的kafka cluster,存储消息,是由多个server组成的集群。

topic:kafka给消息提供的分类方式。broker用来存储不同topic的消息数据。

producer:往broker中某个topic里面生产数据。

consumer:从broker中某个topic获取数据。

partition:partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。

consumer:从 kafka 集群中消费消息的终端或服务。

replica:partition 的副本,保障 partition 的高可用。

leader:replica 中的一个角色, producer 和 consumer 只跟 leader 交互。

follower:replica 中的一个角色,从 leader 中复制数据。

controller:kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。

二、基本原理

​ 消息的发布(publish)称作 producer,将消息的订阅(subscribe)表述为 consumer,将中间的存储阵列称作 broker(代理),这样就可以大致描绘出这样一个场面:

kafka基本原理

生产者将数据生产出来,交给broker进行存储,消费者需要消费数据了,就从broker中去拿出数据来,然后完成一系列对数据的处理操作。

producer 采用 push 模式将消息发布到 broker,每条消息都被 append 到 patition 中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障 kafka 吞吐率)。

producer 到 broker 的过程是 push,也就是有数据就推送到 broker,而 consumer 到 broker 的过程是 pull,是通过 consumer 主动去拉数据的,而不是 broker 把数据主懂发送到 consumer 端的。

consumer 采用 pull 模式从 broker 中读取数据。

push 模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成 consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以根据 consumer 的消费能力以适当的速率消费消息。

三、Kafka的特性

(1) 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作;

(2)可扩展性:kafka集群支持热扩展;

(3)持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失;

(4)容错性:允许集群中节点失败(若副本数为n,则允许n-1个节点失败);

(5)高并发:支持数千个客户端同时读写;

(6)支持实时在线处理和离线处理:可以使用storm这种实时流处理系统对消息进行实时处理。

四、producer发布消息

1、写入方式

producer采用push模式将消息发布到broker,每条消息都被append到patition中,属于顺序写磁盘。

2、消息路由

producer 发送消息到 broker 时,会根据分区算法选择将其存储到哪一个 partition。其路由机制为:

1. 指定了 patition,则直接使用;
2. 未指定 patition 但指定 key,通过对 key 的 value 进行hash 选出一个 patition
3. patition 和 key 都未指定,使用轮询选出一个 patition。

3、写入流程

1. producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader
2. producer 将消息发送给该 leader
3. leader 将消息写入本地 log
4. followers 从 leader pull 消息,写入本地 log 后 leader 发送 ACK
5. leader 收到所有 ISR 中的 replica 的 ACK 后,增加 HW(high watermark,最后 commit 的 offset) 并向 producer 发送 ACK

4、 producer delivery guarantee

1. At most once 消息可能会丢,但绝不会重复传输
2. At least one 消息绝不会丢,但可能会重复传输
3. Exactly once 每条消息肯定会被传输一次且仅传输一次

五、broker 保存消息

1、存储方式

把 topic 分成一个或多个 patition(对应 server.properties 中的 num.partitions=3 配置),每个 patition 物理上对应一个文件夹(该文件夹存储该 patition 的所有消息和索引文件)。

2、存储策略

无论消息是否被消费,kafka 都会保留所有消息。有两种策略可以删除旧数据:

1. 基于时间:log.retention.hours=168
2. 基于大小:log.retention.bytes=1073741824

3、topic创建与删除

(1)创建topic

1. controller 在 ZooKeeper 的 /brokers/topics 节点上注册 watcher,当 topic 被创建,则 controller 会通过 watch 得到该 topic 的 partition/replica 分配。
2. controller从 /brokers/ids 读取当前所有可用的 broker 列表,对于 set_p 中的每一个 partition:
	2.1 从分配给该 partition 的所有 replica(称为AR)中任选一个可用的 broker 作为新的 leader,并将AR设置为新的 ISR
	2.2 将新的 leader 和 ISR 写入 /brokers/topics/[topic]/partitions/[partition]/state
3. controller 通过 RPC 向相关的 broker 发送 LeaderAndISRRequest。

(2)删除topic

1. controller 在 zooKeeper 的 /brokers/topics 节点上注册 watcher,当 topic 被删除,则 controller 会通过 watch 得到该 topic 的 partition/replica 分配。
2. 若 delete.topic.enable=false,结束;否则 controller 注册在 /admin/delete_topics 上的 watch 被 fire,controller 通过回调向对应的 broker 发送 StopReplicaRequest
### 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')}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值