在大数据和分布式系统飞速发展的今天,消息队列作为高效的通信工具,在系统解耦、异步通信、流量削峰等方面作用显著。

而 Kafka 这款高性能、高吞吐量的分布式消息队列,在日志收集、数据传输、实时计算等场景中应用广泛。

接下来,我就带大家深入了解 Kafka 的概念、架构设计和底层原理。

一、Kafka 的核心概念

Kafka 是 Apache 软件基金会开发的开源流处理平台,本质上是个分布式、分区化、多副本的日志提交服务。简单说,它就像个大消息容器,能接收多个生产者的消息,再分发给多个消费者。

下面这几个核心概念得搞清楚:

  • 生产者(Producer):负责把消息发送到 Kafka 集群,还能按策略将消息发到指定分区,实现负载均衡或按业务分类存储。

  • 消费者(Consumer):从 Kafka 集群读取消息,可组成消费者组一起消费某个主题的消息,提高处理效率。

  • 主题(Topic):消息的分类标识,生产者往特定主题发消息,消费者从特定主题读消息,相当于消息的集合。

  • 分区(Partition):为提升吞吐量和并行处理能力,一个主题可分成多个分区。每个分区是有序且不可变的消息序列,消息按发送顺序存储。

  • 副本(Replica):为保证数据可靠,每个分区可有多个副本。一个是领导者(Leader),处理生产者和消费者的请求;其他是追随者(Follower),通过复制领导者数据保持同步,领导者故障后,追随者会被选为新领导者。

  • Broker:Kafka 集群的服务器节点,每个 Broker 存储部分主题的分区和副本,它们相互通信协调,维持集群稳定运行。

二、Kafka 的架构设计

Kafka 采用分布式架构,由生产者、消费者、主题、分区、副本和 Broker 等组件构成,各组件协同工作,实现高效消息传递。

(一)整体架构

Kafka 集群由多个 Broker 组成,每个都有唯一标识。主题分成多个分区,分布在不同 Broker 上,每个分区有多个副本,一个是领导者,其余是追随者。生产者把消息发到指定主题的分区领导者,追随者复制领导者数据保持一致。消费者从分区领导者读消息,还能组成消费者组,组内消费者分别消费不同分区消息,实现并行处理。ZooKeeper 和各个 Broker 通信,管理集群元数据。
在这里插入图片描述

(二)ZooKeeper 在传统架构中的作用

早期 Kafka 架构里,ZooKeeper 作用关键:

  1. 元数据存储:存着集群的各类元数据,像 Topic 的分区数量、副本分布,Broker 的 IP、端口等。不过从 Kafka 0.9.0.0 版本起,消费者组的偏移量就存在 Kafka 内部的__consumer_offsets 主题,不再存在 ZooKeeper 了。这些元数据很重要,生产者、消费者和 Broker 都要经常读,来决定消息发往哪个分区、从哪开始消费等。

  2. 控制器选举:集群的 Controller 负责分区创建、删除、副本分配迁移等操作。它的选举靠 ZooKeeper 的临时节点和 Watcher 机制。所有 Broker 都尝试在 ZooKeeper 创建特定临时节点,第一个成功的就是 Controller。其他 Broker 监听这个节点,一旦当前 Controller 所在 Broker 故障,节点消失,其他 Broker 就重新竞争,选出新 Controller。

  3. 服务发现与集群拓扑管理:新加入的 Broker 能通过 ZooKeeper 快速找到其他节点并注册。ZooKeeper 还监控 Broker 状态,上线或下线时及时更新信息,通过 Watcher 机制通知其他组件,让它们调整状态。比如某个 Broker 下线,ZooKeeper 告诉 Controller,Controller 就重新分配该 Broker 上的分区副本。

(三)核心组件的作用

  1. 生产者:按分区策略把消息发到对应分区领导者,策略可以是哈希、轮询或自定义的。还能配置消息确认机制,确保消息可靠发送。

  2. 消费者与消费者组:消费者订阅主题获取消息,组内每个消费者消费一个或多个分区,且每个分区只被组内一个消费者消费,避免重复消费。消费者通过提交偏移量记录消费位置,重启或重新加入组时,能从上次位置继续消费。

  3. 主题与分区:主题是消息的逻辑分类,分区是物理存储单元。有了分区,Kafka 能并行读写,提高吞吐量。每个分区的消息都有唯一偏移量,标识其位置。

  4. 副本机制:这是保证数据可靠的关键。分区副本分布在不同 Broker,领导者故障后,从追随者中选新领导者。追随者定期复制领导者消息,保持数据一致。

  5. Broker:负责存储分区和副本,处理生产者和消费者的请求。传统模式下,Broker 之间靠 ZooKeeper 协调,ZooKeeper 管理着主题分区、副本分布等元数据。

(四)Kafka 对 ZooKeeper 的依赖移除与 KRaft 模式

随着 Kafka 的广泛应用,ZooKeeper 的问题逐渐显现。运维 ZooKeeper 集群复杂,要额外投入资源,而且它和 Kafka 运维方式不同,对运维人员要求高。大规模集群中,ZooKeeper 处理大量元数据操作可能出现性能瓶颈,影响整个集群。

为解决这些问题,从 Kafka 2.8.0 版本开始,引入了 KRaft(Kafka Raft)模式,逐步移除对 ZooKeeper 的依赖,实现自管理元数据共识。KRaft 用新的仲裁控制器服务取代依赖 ZooKeeper 的控制器,采用基于事件的 Raft 共识协议变体达成元数据一致。

  1. 架构变化:KRaft 模式下,集群不依赖外部 ZooKeeper,引入专门的 Controller 节点(通过process.roles配置角色)。这些节点靠 Raft 协议组成仲裁集合,管理元数据。元数据存在 Kafka 内部的__cluster_metadata主题,通过 Raft 协议在 Controller 节点间复制,保证一致性和高可用性。

  2. Controller 选举机制:传统模式靠 ZooKeeper 的临时节点和竞争创建机制选举 Controller。KRaft 模式下,配置为controller角色的节点参与 Raft 选举。候选节点等随机时间后发起选举,获超过半数投票的成为主 Controller,处理元数据写入和同步,其他节点作为追随者同步日志。这种方式更直接高效,减少了外部依赖带来的复杂和故障点。

  3. 对集群的影响:用了 KRaft 模式,不用单独部署管理 ZooKeeper 集群,简化运维,降低成本。元数据管理集成在 Kafka 内部,避免了和 ZooKeeper 频繁交互的性能瓶颈,处理大规模元数据操作时性能提升,分区创建、删除等操作响应更快,集群扩展性也更好。到 Kafka 4.0 版本,KRaft 模式成为默认设置,标志着 Kafka 在摆脱 ZooKeeper 依赖上迈出重要一步。

三、Kafka 的底层原理

(一)消息存储原理

Kafka 的消息以日志文件存在 Broker 磁盘上。每个分区对应一个目录,里面有多个日志段(Log Segment)文件,由数据文件(.log)和索引文件(.index)组成,分别用于存储消息和快速定位消息。

生产者发消息到分区,会追加到当前活跃的日志段文件末尾。当文件达到一定大小,就创建新的日志段文件。这种分段存储方便消息查找和过期消息删除。

(二)消息传递机制

Kafka 用推拉结合的方式传递消息。生产者主动把消息推到分区领导者,消费者主动从分区领导者拉取消息。这样能根据消费者处理能力调整拉取速度,避免消息积压。

传递过程中,还用了批量发送和压缩技术提高效率。生产者把多个消息打包发送,减少网络传输次数;压缩消息能减小大小,降低带宽消耗。

(三)副本同步机制

Kafka 的副本同步用 ISR(In-Sync Replicas)机制,ISR 是和领导者保持同步的追随者集合。判断追随者是否在 ISR 中,主要看是否在规定时间(replica.lag.time.max.ms)内和领导者通信,以及消息偏移量差距是否在规定范围(新版本更多看时间)。不符合就会被移出 ISR,只有 ISR 中的副本能被选为新领导者,保证数据最新。

生产者发消息到领导者后,领导者写入本地日志,等待 ISR 中的追随者复制成功。达到一定数量(通过 acks 参数配置,比如 acks=all 要求所有 ISR 中的追随者都复制成功)后,领导者才向生产者确认消息发送成功。这种机制在保证可靠性的同时,也提高了效率。

(四)消费者组重平衡机制

当消费者组的消费者数量变化,或者主题分区数量变化时,Kafka 会触发重平衡(Rebalance),重新分配消费者和分区的对应关系,确保每个分区都有消费者消费。

重平衡时,消费者组会暂停消费,直到完成。为减少影响,Kafka 引入消费者组协调器(Coordinator)管理这个过程,还优化算法缩短时间。协调器收集组内消费者信息,按范围分配、轮询分配等策略把分区分给消费者。

总的来说,Kafka 凭借合理的架构设计和底层原理,实现了高性能、高吞吐量、高可靠性的消息传递。深入理解这些,对用好和优化 Kafka 很有帮助。

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

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

相关文章

Kafka-exporter采集参数调整方案

#作者:张桐瑞 文章目录1 问题概述2 修改方案2.1修改参数2.2配置示例3 消费者组均分脚本3.1使用说明3.2脚本内容3.3实现原理说明4 KAFKA-EXPORTER流程代码4.1KAFKA-EXPORTER拉取数据流程1 问题概述 由于kafka-exporter获取kafka指标时间过长,无法通过cur…

AT32的freertos下modbus TCP移植

1.准备模板 打开雅特力官网,也就是带有LwIP的示例。 下载官方源码:modbus 2.移植 我这里是在这里新建两个文件夹,分别是modbus与port,这个任意,只需要将必要的文件加入项目即可。 将源码中的modbus这些都移植过来&a…

Redis面试精讲 Day 16:Redis性能监控与分析工具

【Redis面试精讲 Day 16】Redis性能监控与分析工具 开篇 欢迎来到"Redis面试精讲"系列第16天,今天我们将深入探讨Redis性能监控与分析工具。在大型分布式系统中,Redis作为关键的数据存储和缓存组件,其性能指标直接影响整个系统的…

vue3+vue-flow制作简单可拖拽可增删改流程图

实现效果实现代码 准备工作 安装依赖 npm install vue-flow/core npm install vue-flow/minimap //小地图 npm install vue-flow/controls //自带的缩放、居中、加锁功能我这里只用到上述三个,还有其余的可根据实际情况配合官方文档使用。 npm install vue-flow/bac…

itextPdf获取pdf文件宽高不准确

正常情况下我们通过下面方式获取宽高PdfReader reader new PdfReader(file.getPath()); float width reader.getPageSize(1).getWidth(); float height reader.getPageSize(1).getHeight();但是这样获取的宽高是不准确的,永远都是 宽 > 高,也就是横…

NodeJs学习日志(2):windows安装使用node.js 安装express,suquelize,mysql,nodemon

windows安装使用node.js 安装express,suquelize,mysql,nodemon 系统是win10,默认已经安装好nodejs与npm包名作用expressWeb应用框架suquelize数据库ORMmysql数据库nodemon代码热重载安装express 添加express生成器 npm add expres…

VueCropper 图片裁剪组件在Vue项目中的实践应用

VueCropper 图片裁剪组件在Vue项目中的实践应用 1. 组件介绍 VueCropper 是一个基于 Vue.js 的图片裁剪组件,它提供了丰富的图片裁剪功能,包括: 图片缩放、旋转、移动固定比例裁剪高质量图片输出多种裁剪模式选择 2. 安装与引入 首先需要安装…

给同一个wordpress网站绑定多个域名的实现方法

在WordPress网站上绑定多个域名,可以通过以下几种方法实现: 1. 修改wp-config.php文件 在wp-config.php文件中,找到define(‘WP_DEBUG’, false);,在其下方添加以下代码: define(WP_SITEURL, http:// . $_SERVER[HT…

HarmonyOS分布式开发实战:打造跨设备协同应用

📖 文章目录 第一章:HarmonyOS分布式架构揭秘第二章:跨设备协同的核心技术第三章:开发环境搭建与配置第四章:实战项目:智能家居控制系统第五章:数据同步与状态管理第六章:性能优化与…

用 Enigma Virtual Box 把 Qt 程序压成单文件 EXE——从编译、收集依赖到一键封包

关键词:Qt、windeployqt、Enigma Virtual Box、单文件、绿色软件 为什么要打成单文件? 传统做法:用 windeployqt 把依赖拷进 release 目录,发给用户一个文件夹,文件又多又乱。理想做法:把整个目录压成一个…

unity中实现选中人物脚下显示圆形标识且完美贴合复杂地形(如弹坑) 的效果

要实现人物脚下圆形 完美贴合复杂地形(如弹坑) 的效果,核心思路是 「动态生成贴合地面的 Mesh」 —— 即根据地面的高度场实时计算环形顶点的 Y 坐标,让每个顶点都 “贴” 在地面上。核心逻辑:确定环形范围&#xff1a…

引领GameFi 2.0新范式:D.Plan携手顶级财经媒体启动“龙珠创意秀”

在GameFi赛道寻求新突破的今天,一个名为Dragonverse Plan(D.Plan)的项目正以其独特的经济模型和宏大愿景,吸引着整个Web3社区的目光。据悉,D.Plan即将联合中文区顶级加密媒体金色财经与非小号(Feixiaohao&a…

通信算法之307:fpga之时序图绘制

时序图绘制软件 一. 序言 在FPGA设计过程中,经常需要编写设计文档,其中,不可缺少的就是波形图的绘制,可以直接截取Vivado或者Modelsim平台实际仿真波形,但是往往由于信号杂乱无法凸显重点。因此,通过相应软…

计网学习笔记第3章 数据链路层(灰灰题库)

题目 11 单选题 下列说法正确的是______。 A. 路由器具有路由选择功能,交换机没有路由选择功能 B. 三层交换机具有路由选择功能,二层交换机没有路由选择功能 C. 三层交换机适合异构网络,二层交换机不适合异构网络 D. 路由器适合异构网络&…

SQL的LEFT JOIN优化

原sql,一个base表a,LEFT JOIN三个表抽数 SELECT ccu.*, ctr.*, om.*, of.* FROM ods.a ccu LEFT JOIN ods.b ctr ON ccu.coupon_code ctr.coupon_code AND ctr.is_deleted 0 LEFT JOIN ods.c om ON ctr.bill_code om.order_id AND om.deleted 0 LEFT JOIN ods.…

Redis 核心概念、命令详解与应用实践:从基础到分布式集成

目录 1. 认识 Redis 2. Redis 特性 2.1 操作内存 2.2 速度快 2.3 丰富的功能 2.4 简单稳定 2.5 客户端语言多 2.6 持久化 2.7 主从复制 2.8 高可用 和 分布式 2.9 单线程架构 2.9.1 引出单线程模型 2.9.2 单线程快的原因 2.10 Redis 和 MySQL 的特性对比 2.11 R…

【Day 18】Linux-DNS解析

目录 一、DNS概念 1、概念和作用 2、域名解析类型 3、 软件与服务 4、DNS核心概念 区域 记录 5、查询类型 6、分层结构 二、DNS操作 配置本机为DNS内网解析服务器 (1)修改主配置文件 (2)添加区域 正向解析区域: …

Python 中 OpenCV (cv2) 安装与使用介绍

Python 中 OpenCV (cv2) 安装与使用详细指南 OpenCV (Open Source Computer Vision Library) 是计算机视觉领域最流行的库之一。Python 通过 cv2 模块提供 OpenCV 的接口。 一、安装 OpenCV 方法 1:基础安装(推荐) # 安装核心包&#xff0…

微软WSUS替代方案

微软WSUS事件回顾2025年7月10日,微软最新确认Windows Server Update Services(WSUS)出现了问题,导致IT管理员无法正常同步和部署Windows更新。WSUS是允许管理员根据策略配置,将更新推送到特定计算机,并优化…

Minio 分布式集群安装配置

目录创建 mkdir -p /opt/minio/run && mkdir -p /etc/minio && mkdir -p /indata/disk_0/minio/datarun:启动脚本及二进制文件目录/etc/minio:配置文件目录data:数据存储目录下载 minio wget https://dl.min.io/server/minio…