Kafka:架构与核心机制

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 的工作原理及其背后的设计理念。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/434826.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ps:打开与置入

在 Adobe Photoshop 中,理解不同的“打开”和“置入”命令及其用途,可以根据不同的需求选择最佳方式来管理和编辑图像文件。 ◆ ◆ ◆ 打开 1、Ps菜单:文件/打开 File/Open 快捷键:Ctrl O 用于直接打开现有的图像文件。 打开的…

音视频入门基础:FLV专题(3)——FLV header简介

一、引言 本文对FLV格式的FLV header进行简介,FLV文件的开头就是FLV header。 进行简介之前,请各位先从《音视频入门基础:FLV专题(1)——FLV官方文档下载》下载FLV的官方文档《video_file_format_spec_v10_1.pdf》和…

【Python】FeinCMS:轻量级且可扩展的Django内容管理系统

在互联网飞速发展的今天,内容管理系统(CMS)成为了网站开发中的核心工具,尤其对于需要频繁更新内容的企业和个人站点而言,CMS 提供了极大的便利。市场上有许多不同的 CMS 工具可供选择,其中基于 Django 框架…

从Web2到Web3:探索下一代互联网的无限可能性

互联网经历了从Web1到Web2的重大变革,现在正迈向Web3。Web2通过社交媒体、电子商务和内容平台改变了我们的数字生活,但同时也伴随着中心化平台的垄断和用户数据被广泛控制的问题。而Web3的出现,则试图通过去中心化技术解决这些挑战&#xff0…

预售限制加强:Shopee越南调整优选卖家标准

自北京时间2024年10月14日起,Shopee将对越南跨境店铺的优选卖家标准进行重要更新。此次调整主要针对预售商品占比指标,旨在提升买家购物体验及平台整体服务质量。根据更新内容,如果卖家店铺在过去30天内预售商品的比例超过10%,该店…

Unreal Engine 5 C++: 插件编写03 | MessageDialog

在虚幻引擎编辑器中编写Warning弹窗 准备工作 FMessageDialog These functions open a message dialog and display the specified informations there. EAppReturnType::Type 是 Unreal Engine 中用于表示应用程序对话框(如消息对话框)返回结果的枚举…

tauri开发配置文件和文件夹访问路径问题

文件夹没权限:Unhandled Promise Rejection: path not allowed on the configured scope: /Users/song/Library/Application Support/com.pakeplus.app/assets/default.png 没有文件夹,需要先创建:Unhandled Promise Rejection: path: /Users…

宝塔环境下MinDoc的安装教程

安装 本教程只适用于CentOS 7,其它系统教程参考:Github地址。 1、下载MinDoc并解压 访问https://github.com/mindoc-org/mindoc/releases下载最新版本并解压 #创建一个目录 mkdir mindoc && cd mindoc#一般宝塔带wget和unzip,如果…

大语言模型知识点分享

1 目前主流的开源模型体系有哪些? Prefix Decoder 系列模型 核心点: 输入采用双向注意力机制,输出为单向注意力。双向注意力意味着输入的每个部分都可以关注到输入的所有其他部分,这在理解上下文时具有很强的优势。 代表模型&a…

CICD 持续集成与持续交付

一 、CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集…

在公司网络环境下,无法访问公共网络时,可在插件端配置网络代理后使用通义灵码

在公司网络环境下,无法访问公共网络时,可在插件端配置网络代理后使用通义灵码。 通义灵码插件下载:通义灵码_智能编码助手_AI编程-阿里云 配置网络代理 公司网络通常使用 HTTP 代理服务器在网络流量发送到目标位置之前进行拦截,以…

LeetCode[中等] 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路 回溯法 log:当前结果数组;level&#xff1a…

vue-cli,element-plus,axios,proxy

一、vue-cli vue-cli俗称vue脚手架,是vue官方提供的快速生成vue 工程化项目的工具。 1.官网:https://cn.vuejs.org/ 中文官网: https://cli.vuejs.org/zh/ 特点:基于webpack,功能丰富且易于扩展,支持创建vue2和vu…

【学习笔记】手写 Tomcat 四

目录 一、Read 方法返回 -1 的问题 二、JDBC 优化 1. 创建配置文件 2. 创建工具类 3. 简化 JDBC 的步骤 三、修改密码 优化返回数据 创建修改密码的页面 注意 测试 四、优化响应动态资源 1. 创建 LoginServlet 类 2. 把登录功能的代码放到 LoginServlet 类 3. 创…

springcloud 面试题

什么是微服务? 本文导图:SpringCloud 梳理-ProcessOn 分布式架构CAP理论 CAP定理是分布式系统中最基础的原则,所以理解和掌握了CAP对系统架构的设计至关重要。分布式架构下所有系统不可能同时满足以下三点:Consisteny&#xff08…

一起发现CMake太美-02-CMake是什么CMake的运行原理

本系列课程的主要内容包括: 点击本课程的 链接 可以进入视频课程的学习。 下面介绍本系列课程的第二课的主要内容,本节课从CMake是什么,能做什么,以及CMake的远亲近邻入手,让大家对CMake有一个大致的了解。 1. CMak…

解释器模式原理剖析和Spring中的应用

解释器模式原理剖析和Spring中的应用 解释器模式 是一种行为型设计模式,它定义了一种语言的文法表示,并提供了一个解释器来处理该文法的表达式。解释器模式可以用于构建语法解释器,例如计算器、简单编程语言的解释器等。 核心思想&#xff1a…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个…

OpenCV系列教程三:形态学、图像轮廓、直方图

文章目录 一、形态学1.1 阈值处理1.1.1 全局阈值处理1.1.2 全局阈值处理之Otsus 阈值法1.1.3 自适应阈值处理 1.2 腐蚀与膨胀1.2.1 腐蚀操作1.2.2 创建形态学卷积核1.2.3 膨胀操作 1.3 开运算和闭运算1.4 形态学梯度1.5 顶帽操作(tophat)1.6 黑帽操作(Black Hat&…

SpringBoot集成Matlab软件实战

在项目中处理矩阵等复杂数据结构的时候,可以用Matlab程序来运行,其优点是很多的。 专用工具箱和强大的矩阵运算能力:MATLAB 拥有强大的数学工具箱和优化工具箱,适合处理大规模矩阵运算以及水文模型的率定。MATLAB 的 Optimization…