kafka架构说明
Kafka架构
Kafka是一个开源的消息中间件,适用于构建实时数据管道、流式数据处理、第三方解耦、流量削峰去谷等场景,具有大规模、高可靠、高并发访问的特点。Kafka的单机QPS能够达到百万级别,Kafka的吞吐量比RabbitMQ要高出1~2个数量级。以下是kakfa的主要组成部分:
- Cluster 是由多个 Broker 组成的集群。
- Broker 节点存储 Topic 的数据。
- Topic 被分成多个 Partition。
- 每个 Partition 包含一系列的 Offset 和 Message。
- Producer 向 Topic 发送消息。
- Consumer Group 由多个 Consumer Instance 组成,它们共同消费 Topic 的数据。
- ZooKeeper 用于维护集群的元数据和协调集群操作。
- Broker 和 ZooKeeper 之间有一条虚线,表示 Broker 节点的状态和元数据存储在 ZooKeeper 中
下图是Kafka中的核心组件和它们之间的关系:
graph TD
Broker(Broker)
Cluster([Cluster])
Topic([Topic])
Partition([Partition 1<br>Partition 2<br>Partition 3])
Offset([Offset])
Message([Message])
Producer([Producer])
ConsumerGroup([Consumer Group])
ConsumerInstance([Consumer Instance])
ZooKeeper([ZooKeeper])
Cluster --> Broker
Broker --> Topic
Topic --> Partition
Partition --> Offset
Partition --> Message
Producer --> Topic
ConsumerGroup --> ConsumerInstance
ConsumerInstance --> Partition
Cluster --> ZooKeeper
Topic --> ConsumerGroup
Broker -.-> ZooKeeper
以下是一个更复杂的关系
graph TD
%% 定义集群级别组件
Cluster{"🎯 Kafka Cluster"}
ZK["💠 ZooKeeper
(集群协调)"]
%% 定义Broker相关
subgraph Brokers["📦 Broker Cluster"]
direction LR
B1["💻 Broker 1"]
B2["💻 Broker 2"]
B3["💻 Broker 3"]
end
%% 定义Topic和Partition
subgraph Topics["📑 Topics by 361way.com"]
T1["📘 Topic 1"]
subgraph Partitions["📂 Partitions"]
P0["🗂️ Partition 0
(Leader)"]
P1["🗂️ Partition 1
(Follower)"]
P2["🗂️ Partition 2
(Follower)"]
end
end
%% 定义生产者和消费者组
Producer["📤 Producer
(生产者)"]
subgraph ConsumerGroup["👥 Consumer Group"]
direction LR
C1["📥 Consumer 1"]
C2["📥 Consumer 2"]
end
%% 定义Offset管理
subgraph Offset["⏱️ Offset Management"]
CO["📊 Consumer Offset"]
LEO["📈 Log End Offset"]
HW["🏁 High Watermark"]
end
%% 建立组件之间的关系
Cluster --> ZK
Cluster --> Brokers
Brokers --> Topics
T1 --> Partitions
Producer -->|消息写入| Partitions
Partitions -->|消息消费| ConsumerGroup
ConsumerGroup -->|提交| CO
P0 -->|更新| LEO
LEO -->|同步| HW
%% 添加说明注释
subgraph Notes["📝 Key Concepts"]
note1["🔄 Replication Factor
(副本因子)"]
note2["⚖️ Partition Balance
(分区平衡)"]
note3["🔐 ACK机制
(消息确认)"]
end
%% 样式定义
classDef cluster fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
classDef broker fill:#2ecc71,stroke:#27ae60,stroke-width:2px,color:#fff
classDef topic fill:#e74c3c,stroke:#c0392b,stroke-width:2px,color:#fff
classDef client fill:#f1c40f,stroke:#f39c12,stroke-width:2px
classDef note fill:#95a5a6,stroke:#7f8c8d,stroke-width:2px
%% 应用样式
class Cluster,ZK cluster
class B1,B2,B3 broker
class T1,P0,P1,P2 topic
class Producer,C1,C2 client
class note1,note2,note3 note
Kafka的核心概念:
-
集群层面概念(🎯):
- Kafka Cluster:整个Kafka集群
- ZooKeeper:负责集群协调和元数据管理
-
Broker层面(📦):
- Broker:消息存储服务器
- 每个Broker都是独立的消息存储节点
- 多个Broker组成集群提供服务
-
主题与分区层面(📑):
- Topic:消息的逻辑分类
- Partition:Topic的物理分区
- Leader:主分区,负责读写
- Follower:从分区,负责备份
- Replication Factor:副本数量
-
消息生产者(📤):
- Producer:消息生产者
- 支持多种分区策略
- ACK机制保证消息可靠性
-
消息消费者(📥):
- Consumer:消息消费者
- Consumer Group:消费者组
- Group内的Consumer平衡消费分区
-
偏移量管理(⏱️):
- Consumer Offset:消费位置记录
- Log End Offset:日志末端位置
- High Watermark:已同步的位置标记
-
关键机制:
- 副本机制:保证数据可靠性
- 分区平衡:实现负载均衡
- ACK机制:保证消息送达
-
性能相关:
- Zero-Copy:高效的数据传输
- 顺序写入:高效的磁盘操作
- 页缓存:利用操作系统特性
重要交互流程:
-
生产流程:
- Producer发送消息到Broker
- Broker将消息写入分区
- 根据ACK策略确认
-
消费流程:
- Consumer从Broker拉取消息
- 按分区顺序消费
- 定期提交消费位移
-
复制流程:
- Leader接收写入请求
- Follower从Leader同步
- 更新High Watermark
Kafka为什么快
Kafka 的高性能和快速消息处理主要得益于以下几个关键因素:
-
顺序写入与零拷贝
- Kafka 将消息顺序写入磁盘,这比传统消息队列的随机写入要快得多。顺序写入对磁盘的 I/O 操作优化极大,因为磁盘在顺序写入时更高效。
- Kafka 使用了 Linux 的零拷贝技术,即消息数据可以从文件直接传输到网络套接字,而不需要在内存中做额外的拷贝。这减少了 CPU 和内存资源的消耗,提高了数据传输速度。
-
分区与并行处理:Kafka 将每个主题分为多个分区(Partition),每个分区是一个有序的日志,这允许 Kafka 在分布式集群中将分区分配到不同的节点上,实现并行处理和负载均衡。消费者也可以并行消费多个分区的数据,从而提升系统的吞吐量。
-
高效的数据存储和读取模型:Kafka 的数据存储设计类似于日志文件,消息一旦写入分区日志,就不会再被更改(只追加,不更新),并通过配置的方式设定保留时间。Kafka 使用了基于时间或大小的分段存储,这样在需要删除旧数据时只需删除整个分段即可,而不需要进行复杂的删除操作,从而保持高效的写入性能。
-
消费者的拉取模式:与其他消息队列的推送模式不同,Kafka 使用拉取模式,即消费者主动拉取数据。这种方式可以更好地控制消费者的处理速度,避免消息堆积或消费者过载。此外,消费者的偏移量可以灵活控制,方便进行故障恢复和数据回放。
-
内存映射文件(Memory-Mapped Files):Kafka 使用内存映射文件(mmap),使得文件数据可以直接映射到内存中。这样 Kafka 可以直接通过内存访问磁盘数据,减少了磁盘 I/O 的负担,提高了读取和写入速度。
-
集群架构和多副本:Kafka 的分布式架构允许将数据副本分布在多个节点上,实现了数据的高可用性和容错性。多副本架构可以确保在节点故障时仍然能读取到数据,从而减少停机时间,并支持水平扩展,提高系统吞吐量。
-
高效的序列化和反序列化:Kafka 支持高效的序列化格式(如 Avro、Protobuf),以及使用压缩(如 GZIP、Snappy)来进一步减少消息体积,这不仅节省了网络带宽,还能提升传输速度。
Kafka 的这些特性让它在大数据、高并发的场景下表现出色,因此被广泛应用于日志聚合、实时数据流处理、事件流管理等领域。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))