跳转至

kafka架构说明

Kafka架构

Kafka是一个开源的消息中间件,适用于构建实时数据管道、流式数据处理、第三方解耦、流量削峰去谷等场景,具有大规模、高可靠、高并发访问的特点。Kafka的单机QPS能够达到百万级别,Kafka的吞吐量比RabbitMQ要高出1~2个数量级。以下是kakfa的主要组成部分:

  • Cluster 是由多个 Broker 组成的集群。
  • Broker 节点存储 Topic 的数据。
  • Topic 被分成多个 Partition
  • 每个 Partition 包含一系列的 OffsetMessage
  • ProducerTopic 发送消息。
  • Consumer Group 由多个 Consumer Instance 组成,它们共同消费 Topic 的数据。
  • ZooKeeper 用于维护集群的元数据和协调集群操作。
  • BrokerZooKeeper 之间有一条虚线,表示 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的核心概念:

  1. 集群层面概念(🎯):

    • Kafka Cluster:整个Kafka集群
    • ZooKeeper:负责集群协调和元数据管理
  2. Broker层面(📦):

    • Broker:消息存储服务器
    • 每个Broker都是独立的消息存储节点
    • 多个Broker组成集群提供服务
  3. 主题与分区层面(📑):

    • Topic:消息的逻辑分类
    • Partition:Topic的物理分区
      • Leader:主分区,负责读写
      • Follower:从分区,负责备份
      • Replication Factor:副本数量
  4. 消息生产者(📤):

    • Producer:消息生产者
    • 支持多种分区策略
    • ACK机制保证消息可靠性
  5. 消息消费者(📥):

    • Consumer:消息消费者
    • Consumer Group:消费者组
    • Group内的Consumer平衡消费分区
  6. 偏移量管理(⏱️):

    • Consumer Offset:消费位置记录
    • Log End Offset:日志末端位置
    • High Watermark:已同步的位置标记
  7. 关键机制:

    • 副本机制:保证数据可靠性
    • 分区平衡:实现负载均衡
    • ACK机制:保证消息送达
  8. 性能相关:

    • Zero-Copy:高效的数据传输
    • 顺序写入:高效的磁盘操作
    • 页缓存:利用操作系统特性

重要交互流程:

  1. 生产流程:

    • Producer发送消息到Broker
    • Broker将消息写入分区
    • 根据ACK策略确认
  2. 消费流程:

    • Consumer从Broker拉取消息
    • 按分区顺序消费
    • 定期提交消费位移
  3. 复制流程:

    • Leader接收写入请求
    • Follower从Leader同步
    • 更新High Watermark

Kafka为什么快

Kafka 的高性能和快速消息处理主要得益于以下几个关键因素:

  1. 顺序写入与零拷贝

    • Kafka 将消息顺序写入磁盘,这比传统消息队列的随机写入要快得多。顺序写入对磁盘的 I/O 操作优化极大,因为磁盘在顺序写入时更高效。
    • Kafka 使用了 Linux 的零拷贝技术,即消息数据可以从文件直接传输到网络套接字,而不需要在内存中做额外的拷贝。这减少了 CPU 和内存资源的消耗,提高了数据传输速度。
  2. 分区与并行处理:Kafka 将每个主题分为多个分区(Partition),每个分区是一个有序的日志,这允许 Kafka 在分布式集群中将分区分配到不同的节点上,实现并行处理和负载均衡。消费者也可以并行消费多个分区的数据,从而提升系统的吞吐量。

  3. 高效的数据存储和读取模型:Kafka 的数据存储设计类似于日志文件,消息一旦写入分区日志,就不会再被更改(只追加,不更新),并通过配置的方式设定保留时间。Kafka 使用了基于时间或大小的分段存储,这样在需要删除旧数据时只需删除整个分段即可,而不需要进行复杂的删除操作,从而保持高效的写入性能。

  4. 消费者的拉取模式:与其他消息队列的推送模式不同,Kafka 使用拉取模式,即消费者主动拉取数据。这种方式可以更好地控制消费者的处理速度,避免消息堆积或消费者过载。此外,消费者的偏移量可以灵活控制,方便进行故障恢复和数据回放。

  5. 内存映射文件(Memory-Mapped Files):Kafka 使用内存映射文件(mmap),使得文件数据可以直接映射到内存中。这样 Kafka 可以直接通过内存访问磁盘数据,减少了磁盘 I/O 的负担,提高了读取和写入速度。

  6. 集群架构和多副本:Kafka 的分布式架构允许将数据副本分布在多个节点上,实现了数据的高可用性和容错性。多副本架构可以确保在节点故障时仍然能读取到数据,从而减少停机时间,并支持水平扩展,提高系统吞吐量。

  7. 高效的序列化和反序列化:Kafka 支持高效的序列化格式(如 Avro、Protobuf),以及使用压缩(如 GZIP、Snappy)来进一步减少消息体积,这不仅节省了网络带宽,还能提升传输速度。

Kafka 的这些特性让它在大数据、高并发的场景下表现出色,因此被广泛应用于日志聚合、实时数据流处理、事件流管理等领域。

捐赠本站(Donate)

weixin_pay
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))