首页 > 其他分享 >Kafka:架构与核心机制

Kafka:架构与核心机制

时间:2024-09-29 18:54:11浏览次数:12  
标签:副本 架构 分区 ZooKeeper Broker Kafka 机制 Leader

Apache Kafka 是一种高吞吐量的分布式消息队列,广泛应用于实时数据流处理和大数据架构中。本文将详细探讨 Kafka 的架构、Replica 管理、消息读取、分区策略、可靠性保障等核心机制。

1. Kafka 的架构

1.1 组件概述

Kafka 的架构由多个组件构成,主要包括以下部分:

  • Broker:Kafka 集群中的服务器,每个 Broker 存储一部分消息。Kafka 集群通常由多个 Broker 组成,以提高可用性和负载均衡。
  • Producer:负责向 Kafka 发送消息的客户端。Producer 可以选择将消息发送到特定的 Topic 和 Partition。
  • Consumer:从 Kafka 中读取消息的客户端。Consumer 可以组成消费者组,以实现负载均衡和消息的顺序处理。
  • Topic:消息的分类,每个 Topic 可以有多个分区。Topic 是 Kafka 中消息的逻辑概念,所有的消息都被发布到某个 Topic 下。
  • Partition:每个 Topic 下的分区,是消息的基本存储单元。Partition 确保消息的顺序,并允许多个 Producer 和 Consumer 并行处理数据。
  • Zookeeper:用于管理 Kafka 集群的元数据,如 Broker 列表、分区信息等。Zookeeper 负责协调各个 Broker 的状态和配置。

1.2 Kafka 架构示意图

在这里插入图片描述

1.3 Kafka 的工作流程

Kafka 的工作流程可以总结为以下几个步骤:

  1. Producer 发送消息:Producer 将消息发送到 Kafka Broker,指定目标 Topic。
  2. Broker 存储消息:Broker 接收到消息后,将其存储在对应的 Partition 中,并将消息持久化到磁盘。
  3. Consumer 读取消息:Consumer 从 Broker 中读取消息,指定要读取的 Topic 和偏移量。

2. Kafka Replicas 的管理

在 Kafka 中,为了保证数据的高可用性和容错能力,每个分区可以有多个副本(Replica)。Replica 的管理机制如下:

2.1 Replica 的定义

  • Leader:每个分区的一个副本被选为 Leader,负责处理所有的读写请求。
  • Follower:其他副本为 Follower,负责从 Leader 复制数据。

2.2 副本管理流程

  1. 副本创建:当创建 Topic 时,Kafka 会根据配置生成相应数量的副本。
  2. 数据复制:Leader 将数据写入自己的日志文件后,会通知所有的 Follower 进行数据复制。Follower 需要保证数据的一致性。
  3. 副本状态监控:ZooKeeper 监控各个副本的状态,确保数据的正确性和一致性。

2.3 副本管理示意图

在这里插入图片描述

3. 如何确定当前能读到哪一条消息?

Kafka 通过偏移量(offset)来管理消息的读取。每个分区的消息都有唯一的偏移量,消费者在读取消息时根据偏移量确定当前能读到的消息。

3.1 消息的偏移量

  • 定义:偏移量是指某条消息在分区中的位置,每个分区的消息都有一个递增的整数值作为偏移量。
  • 消费模式:消费者可以选择从指定的偏移量开始消费,也可以选择从最新的偏移量开始消费。

3.2 消费者组

Kafka 支持消费者组的概念,确保每个消息只被一个消费者处理。消费者组中的所有消费者共同消费一个 Topic,Kafka 会自动分配分区给各个消费者。

3.3 自动提交与手动提交

消费者在消费消息后需要提交偏移量,以标记已处理的消息。消费者可以选择:

  • 自动提交:自动提交偏移量,适合对消息处理的实时性要求不高的场景。
  • 手动提交:手动提交偏移量,适合对消息处理的准确性要求较高的场景。

3.4 消息读取示意图

在这里插入图片描述

4. 发送消息的分区策略

Kafka 使用分区策略将消息分散到不同的分区,以平衡负载。主要的分区策略包括:

4.1 轮询(Round-Robin)

轮询策略将消息均匀分配到各个分区。这种方式简单有效,适用于对消息顺序没有严格要求的场景。

4.2 按键分区(Key-Based Partitioning)

通过消息的键(Key)将消息定向到特定的分区。所有具有相同键的消息会被发送到同一个分区,从而保证消息的顺序性。

4.3 自定义分区器

Kafka 允许用户实现自定义的分区器,以满足特定业务需求。自定义分区器可以根据业务逻辑将消息发送到不同的分区。

4.4 分区策略示意图

在这里插入图片描述

5. Kafka 的可靠性保障

Kafka 的可靠性主要通过以下机制实现:

5.1 副本机制

通过 Replica 保证数据的持久性和高可用性。即使某个 Broker 出现故障,其他副本仍然可以保证数据的完整性。

5.2 ack 策略

Producer 可以设置 ack 的策略,例如:

  • acks=0:不需要等待任何确认,最低延迟。
  • acks=1:只需等待 Leader 确认,适合对性能要求高的场景。
  • acks=all:需要所有副本都确认,保证数据的可靠性。

5.3 数据持久化

Kafka 将数据持久化到磁盘,避免因 Broker 故障导致数据丢失。数据以日志文件的形式存储,确保高效读取。

5.4 可靠性保障示意图

在这里插入图片描述

6. 分区再分配的作用

分区再分配是 Kafka 中一个重要的特性,用于以下目的:

6.1 负载均衡

当新 Broker 加入或现有 Broker 下线时,分区再分配可以将负载均匀分配到各个 Broker,防止某个 Broker 过载。

6.2 故障恢复

确保每个分区都有可用的 Leader,从而提高集群的可用性。分区再分配可以自动选择新的 Leader,减少人为干预。

6.3 分区再分配示意图

在这里插入图片描述

7. Kafka Partition 副本 Leader 的选举

在 Kafka 中,每个分区有一个 Leader 副本和多个 Follower 副本。Leader 负责处理所有的读写请求,而 Follower 则从 Leader 复制数据。为了确保高可用性,Kafka 需要动态选举 Leader,尤其是在出现故障时。以下是关于 Kafka Partition 副本 Leader 选举的详细解析。

7.1 Leader 选举的必要性

Leader 的选举至关重要,主要体现在以下几个方面:

  • 高可用性:在 Broker 故障或网络分区的情况下,Leader 选举能够确保至少一个副本能够继续服务,从而保证数据的可用性。
  • 数据一致性:选举过程确保了只有一个有效的 Leader 处理请求,避免了数据的不一致性问题。

7.2 选举过程

Leader 选举的过程主要依赖于 ZooKeeper 作为协调者,具体步骤如下:

  1. Broker 启动:每个 Broker 启动时会向 ZooKeeper 注册自己的状态,包括可用的分区副本。

    Broker1 -> ZooKeeper : register(brokerId, partitionInfo)
    
  2. 监控状态:ZooKeeper 持续监控每个 Broker 的状态,包括心跳机制。如果某个 Broker 未能按时发送心跳,则 ZooKeeper 会认为该 Broker 已故障。

  3. Leader 选举

    • 当 Leader 副本失效时,ZooKeeper 会触发新的 Leader 选举。
    • ZooKeeper 会选择一个当前状态为 “ISR” (In-Sync Replica,即与 Leader 保持同步的副本)中的 Follower 作为新的 Leader。
    • 选举过程采用 ZAB(Zookeeper Atomic Broadcast)协议,确保选举过程的原子性和一致性。
    ZooKeeper -> Follower1 : check ISR status
    ZooKeeper -> Follower2 : check ISR status
    ZooKeeper -> Follower1 : elect as new Leader
    
  4. 更新元数据:选举完成后,ZooKeeper 会更新分区的元数据,新的 Leader 将开始接受客户端的读写请求,而其他 Follower 则继续从 Leader 复制数据。

7.3 Leader 选举的示意图

在这里插入图片描述

7.4 Leader 选举的影响因素

  • ISR 列表:只有在 ISR 列表中的副本才有资格成为新的 Leader。ISR 列表中的副本是指那些与 Leader 保持同步的副本。
  • Broker 负载:在选举过程中,ZooKeeper 会考虑 Broker 的负载情况,避免将 Leader 分配给负载过重的 Broker。
  • 网络状态:网络分区可能导致某些 Broker 与 ZooKeeper 失去连接,这样的 Broker 将无法参与选举。

7.5 故障恢复后的 Leader 选举

在某个 Broker 恢复后,它会重新加入集群并重新注册。ZooKeeper 会检查其状态并将其添加回 ISR 列表。

  1. Broker 恢复:故障的 Broker 在恢复后会重新向 ZooKeeper 注册。

    Broker2 -> ZooKeeper : register(brokerId, partitionInfo)
    
  2. 更新 ISR:ZooKeeper 会将恢复的 Broker 添加到 ISR 列表中。

  3. 角色调整:如果当前 Leader 仍然可用,恢复的 Broker 作为 Follower 继续从 Leader 复制数据。如果当前 Leader 已经失效,ZooKeeper 可能会重新进行 Leader 选举。

8. 分区数越多越好吗?吞吐量就会越高吗?

在 Kafka 中,分区数的设置对系统的性能和吞吐量有着直接的影响。然而,增加分区数并不是一种无限制的优化策略。下面我们将详细分析分区数的影响及其与吞吐量的关系。

8.1 分区数的基本概念

在 Kafka 中,每个主题可以分为多个分区。每个分区是一个有序、不可变的消息序列,Kafka 通过分区来实现并行处理。分区的数目决定了数据的分散程度和并行度。

8.2 分区数的优势

  1. 并行处理能力

    • 分区数越多,Kafka 能够同时处理更多的读写请求。这意味着在高并发场景下,多个消费者可以并行消费不同的分区,从而提高整体吞吐量。
      在这里插入图片描述
  2. 负载均衡

    • 增加分区数可以有效分散数据负载,避免某一个分区成为性能瓶颈。每个分区都有独立的 I/O 操作,可以利用多核 CPU 的并行处理能力。
  3. 提高容错性

    • 多个分区允许在 Broker 故障的情况下,通过副本机制保证数据的可用性。副本分布在不同的 Broker 上,增强了系统的可靠性。

8.3 分区数的劣势

  1. 管理开销
    • 分区数过多会增加 Kafka 的管理开销,包括元数据的管理、状态监控等。每个分区都有其对应的元数据,需要 ZooKeeper 来维护,这会增加 ZooKeeper 的负担。
  2. 资源占用
    • 每个分区都会占用系统资源,例如内存和文件描述符。过多的分区可能导致系统资源的耗尽,从而影响整体性能。
  3. 消费者协调复杂性
    • 如果分区数过多,消费者组的协调和管理会变得复杂。消费者之间的负载均衡和分区分配可能变得不那么高效。

8.4 吞吐量与分区数的关系

虽然分区数可以提高吞吐量,但并不是简单的“分区越多,吞吐量越高”的关系。以下几个因素需要考虑:

  1. 网络带宽
    • 分区数增加虽然可以提升并发处理能力,但网络带宽也是限制吞吐量的重要因素。如果网络带宽不足,增加分区数不会显著提高整体吞吐量。
  2. 磁盘 I/O 性能
    • Kafka 的吞吐量还受到磁盘读写性能的影响。分区数过多可能导致过高的磁盘 I/O 请求,从而引发性能瓶颈。
  3. 配置优化
    • 在高负载环境中,合理配置生产者和消费者的参数,例如批量大小(batch.size)和发送延迟(linger.ms),能够更有效地利用分区,提高吞吐量。

8.5 实际案例分析

假设我们有一个电商系统,处理用户订单数据,原本设置了 3 个分区。随着业务增长,我们决定将分区数增加到 6 个,以提升吞吐量。经过性能测试,我们发现:

  • 在正常负载下,吞吐量明显提升,多个消费者并行消费分区,响应时间缩短。
  • 在极高负载下,虽然吞吐量有所提高,但网络和磁盘的 I/O 成为新的瓶颈,导致性能提升幅度减小。

9. Kafka 为什么这么快?

Kafka 之所以能提供高性能,主要归功于以下几点:

9.1 高效的存储机制

Kafka 使用顺序写入的方式,将数据批量写入磁盘,极大提升了 I/O 性能。这种机制减少了磁盘寻址的时间,提升了数据写入的速度。

9.2 内存与磁盘的合理使用

Kafka 将数据缓存在内存中,使用内存映射文件(mmap)技术,加速读写操作。同时,Kafka 采用页缓存机制,优化了磁盘 I/O。

9.3 并行处理

通过分区和多线程,Kafka 能够并行处理多个消息流,从而提高整体吞吐量。在高并发场景下,Kafka 能够有效分散负载,确保快速响应。

9.4 高性能示意图

在这里插入图片描述

结论

通过对 Kafka 的架构、Replica 管理、消息读取、分区策略、可靠性保障等方面的深入探讨,我们可以看到 Kafka 是一个功能强大的消息队列系统,适用于需要高吞吐量和可靠性的应用场景。希望本文能够帮助读者更好地理解 Kafka 的工作原理及其背后的设计理念。

标签:副本,架构,分区,ZooKeeper,Broker,Kafka,机制,Leader
From: https://blog.csdn.net/weixin_39996520/article/details/142619514

相关文章

  • k8s架构,从clusterIP到光电半导体,再从clusterIP到企业管理
    clusterIP作为k8s中的服务,也是其他三个服务的基础~]$kubectlcreateserviceclusteripexternalnameloadbalancernodeport客户端的流量到serviceservice分发给pod,pod由控制器自动部署,自动维护那么问题是service的可用性如何保证?这里以clusterip这个服务举例......
  • 阿里云 SAE Web:百毫秒高弹性的实时事件中心的架构和挑战
    作者:胡志广(独鳌)背景Serverless应用引擎SAE事件中心主要面向早期的SAE控制台只有针对于应用维度的事件,这个事件是K8s原生的事件,其实绝大多数的用户并不会关心,同时也可能看不懂。而事件中心,是希望能够成为一个更高维度入口,可以总览全局的事件(着重于异常事件),并且配置相关......
  • ClickHouse、Doris、 Impala等MPP架构详解
    我们常用的大数据计算引擎有很多都是MPP架构的,像我们熟悉的Impala、ClickHouse、Druid、Doris等都是MPP架构。采用MPP架构的很多OLAP引擎号称:亿级秒开。本文分为三部分讲解,第一部分详解MPP架构,第二部分剖析MPP架构与批处理架构的异同点,第三部分是采用MPP架构的OLAP引擎介绍。......
  • Go语言项目组织架构
    目录Go目录/cmd/internal/pkg/vendor服务应用程序目录/apiWeb应用程序目录/web通用应用目录/configs/init/scripts/build/deployments/test其他目录/docs/tools/examples/third_party/githooks/assets/websitehttps://github.com/golang-standards/project-layoutGo目录/cmd......
  • YOLOv8改进 - 注意力篇 - 引入(A2-Nets)Double Attention Networks注意力机制
    一、本文介绍作为入门性篇章,这里介绍了A2-Nets网络注意力在YOLOv8中的使用。包含A2-Nets原理分析,A2-Nets的代码、A2-Nets的使用方法、以及添加以后的yaml文件及运行记录。二、A2-Nets原理分析A2-Nets官方论文地址:A2-Nets文章A2-Nets注意力机制(双重注意力机制):它从输入图......
  • .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
    .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票) 思维导航前言三层架构MVC架构DDD分层架构整洁架构CQRS架构最后总结参考文章DotNetGuide技术社区前言项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以......
  • Spring Boot 进阶-Spring Boot的全局异常处理机制详解
      我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了trycatchfinally语句。  大量的......
  • Android页面跳转与返回机制详解
    在Android开发中,页面跳转是实现应用功能交互的重要手段之一。本文将从Activity之间的跳转、Activity与Fragment之间的跳转、Fragment之间的跳转以及页面返回的问题四个方面进行详细解析。一、Activity之间的跳转Activity是Android应用的基本构建块,代表了一个用户界面的单一屏幕......
  • 单片机中断机制:提升系统效率与响应能力的关键技术
    单片机中断机制:提升系统效率与响应能力的关键技术在当今快速发展的嵌入式系统领域,单片机(MicrocontrollerUnit,MCU)作为核心控制单元,其性能与功能直接影响到整个系统的运行效率与可靠性。在众多关键技术中,中断机制(InterruptMechanism)作为单片机实现高效多任务处理的重要手段,......
  • 精通Java并发锁机制:24种锁技巧+业务锁匹配方案(第三部分)
    在Java并发编程中,锁是确保线程安全、协调多线程访问共享资源的关键机制。从基本的synchronized同步关键字到高级的ReentrantLock、读写锁ReadWriteLock、无锁设计如AtomicInteger,再到复杂的同步辅助工具如CountDownLatch、CyclicBarrier和Semaphore,每种锁都针对特定的......