Kafka从入门到入门

kafka的出现是为了支持大量消息事件,它的分布式设计、消息抽象设计及存储选择和优化性能手段都高效的支持了它的性能表现,同时面临分布式系统典型的信息同步、中心化设计、负载均衡等问题,对于这些问题kafka也给出了高效和多样化的选择,这也给运维带来一定的复杂性。

架构

消息发送

  1. Broker地址获取:客户端初始化时配置bootstrap.servers,然后获取集群信息并保存到本地缓存,防治过多通信。
  2. 分区选择算法:发送消息时可以指定分区、由key来hash分区选择、或者采用默认策略选择分区(粘性分区策略)。
  3. Broker的确认机制:客户端在消息积累一定数量或者超过指定时间后会发送到BrokerBroker会根据配置的acks参数来决定何时返回写入结果。acks参数配置:
    1. 为0时:收到消息写入到系统I/O缓存后立即返回(刷盘由操作系统完成)
    2. 为1时:收到消息写入主分区的I/O缓存后返回。
    3. 为-1时:收到消息写入I/O缓存,等待ISR全部副本拉取完数据并返回LEOLeader更新HW后返回。
  4. 分区数据同步
    1. ISR(In-Sync Replicas)机制:保持数据同步和一致性
      AR​ 表示分配给某个分区的所有副本集合,包括 Leader 和所有 Follower。
      ISR​ 是 AR 的子集,表示与 Leader 保持同步的副本集合。只有 ISR 中的副本才有资格被选举为新的 Leader。
      OSR​ 是 AR 的子集,表示不能与 Leader 保持同步的副本集合。消息和leader副本相差replica.lag.time.max.ms则会被归入OSR集合中。
      注意:ISR和OSR都是动态调整的,目的是让副本尽量和Leader副本数据保持一致,保持系统的可用性
    2. HWLEO概念
      LEO 表示每个副本当前最后一条消息的偏移量**+1**,即下一条新消息将要写入的位置。每个副本的"写到哪里了"
      HW 表示已提交消息的偏移量。HW 之前的所有消息都已经成功复制到所有 ISR 副本中。消费者能看到的"最高水位"
    3. 副本会定时向Leader副本获取最新数据并更新自己的数据,返回自己的LEO,Leader在收到各个副本的LEO结果后会更新HW,这也对外(消费者可以看到)的消息就不断往前。

消息消费

  1. 获取消费协调者
    消费者组向任意一个Broker发送FindCoordinator请求,该Broker根据元信息找到该消费者组的GroupCoordinator。对应上图中的1-4过程(GroupCoordinatorBroker上的一个组件用于元数据管理、消费者控制,使用__consumer_offset的topic进行持久化,根据groupId进行__consumer_offset分区的选择,上图是简化了。)
  2. 加入消费组
    GroupCoordinator发送JoinGroup请求,GroupCoordinator会选择出消费者Leader进行分区分配,然后同步消费者该信息。消费者根据分配的分区拉取消息,比如上图中Consumer01分配了Partition0Partition2进行拉取消息进行消费。分区计算可以理解为在客户端(本地)进行计算减少了服务器的压力,只需要把结果同步到GroupCoordinator上。
  3. 元信息同步
    消费者组加入消费会触发rebalanceControllerBroker会进行分区分配并同步元信息到各个Broker

持久化和高性能

Topic是逻辑上的队列,在kafka的分布式设计上Topic又被分成多个分区,可以看成物理上的队列,在系统实现中体现为文件夹。分区的设计既保障了系统的可用性(冗余备份)又保证了系统的高并发性。为了性能考虑,分区实现又把文件进一步拆分限制大小(比如1G)和索引机制(快速查找offset)。

顺序写

kafka在转储消息数据时选择磁盘来作为临时存储,大部分场景消息很快就被消费掉,同时持久化仅防止数据丢失 不需要其他常见的分析和查询数据,选择磁盘是合适的。
磁盘存储查询和写入的耗时大家应该都了解在于磁头寻道上,写入读取数据耗时不大,所以顺序读写就显得格外重要,顺序和随机读写性能差异不在一个数量级。

零拷贝

网卡磁盘文件系统DMA控制器内核空间系统调用(内核态)Kafka应用(用户态)网卡磁盘文件系统DMA控制器内核空间系统调用(内核态)Kafka应用(用户态)Kafka零拷贝流程(sendfile系统调用)关键:数据不复制到用户空间第一次DMA传输磁盘→内核缓冲区第二次DMA传输内核缓冲区→网卡总计:1次系统调用 + 2次DMA传输数据始终在内核空间1. sendfile()系统调用2. 进入内核空间3. 定位文件位置4. 读取文件描述符5. 指令:磁盘→内核缓冲区6. 读取数据7. 数据流(DMA传输)8. 直接写入内核缓冲区9. 指令:内核缓冲区→网卡10. 读取内核缓冲区11. 直接发送到网卡12. 返回传输字节数13. 返回结果

批量发送

消息发送时客户端会打包多条消息一次发送到Broker以此来减少网络带来的耗时

分布式系统启示

  1. 分治思想:从设计上确立系统的性能优势。
  2. 冗余设计:保证服务的高可用性,同时需要同步机制辅助保证数据的一致性。
  3. 极致优化:把系统的每一部分实现尽可能的优化到极致,把常用的技术优化手段做到合理则能提升整体服务性能。
  4. 持续迭代:系统设计初期可以优先解决头部问题,然后持续优化痛点则可以保持系统的生命力。

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

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

相关文章

手把手教程:使用Verilog实现简单组合逻辑电路

从零开始设计一个4:1多路选择器:深入理解Verilog组合逻辑建模你有没有遇到过这样的场景?多个信号源争抢同一个数据通路,而系统只能“听”一个。这时候,就需要一个数字世界的开关——多路选择器(MUX)&#x…

手把手教程:RISC-V指令集异常入口设置

手把手教你配置RISC-V异常入口:从原理到实战你有没有遇到过这样的情况?在调试一个裸机程序时,定时器中断就是不触发;或者一执行非法指令,CPU直接“跑飞”,连断点都抓不到?问题很可能出在——异常…

温度传感器热响应时间研究:封装材料对动态性能的影响

温度传感器热响应时间研究:封装材料如何“拖慢”或“加速”你的测温速度? 你有没有遇到过这种情况:电池包温度突然飙升,BMS却迟迟没报警?或者医疗设备加热管路已经开始冷凝,温度反馈还“慢半拍”&#xff1…

推荐Python、JavaScript或Scratch(儿童)。Python语法简洁,应用广泛;JavaScript适合

零基础学编程的核心步骤选择一门适合初学者的编程语言 推荐Python、JavaScript或Scratch(儿童)。Python语法简洁,应用广泛;JavaScript适合网页开发;Scratch通过图形化编程培养逻辑思维。理解编程基础概念 变量、数据类…

buck电路图及其原理:TPS5430补偿网络设计

深入理解Buck电路:从TPS5430看电流模式控制与补偿网络设计 你有没有遇到过这样的问题? 一个看起来“完全照着数据手册接”的电源电路,上电后输出电压却像心电图一样跳动不止——轻则纹波超标,重则直接振荡宕机。 如果你用的是像…

2026-01-12 全国各地响应最快的 BT Tracker 服务器(联通版)

数据来源:https://bt.me88.top 序号Tracker 服务器地域网络响应(毫秒)1http://211.97.119.76:2710/announce福建福州联通52http://123.245.62.83:6969/announce辽宁大连联通143http://60.249.37.20:6969/announce广东肇庆联通294http://211.75.205.189:80/announce…

掌握 requests、BeautifulSoup 等库的网络爬虫基础,或使用 pandas 进行简单数据分析

学习 Python 的基础语法从变量、数据类型、运算符等基础概念开始,逐步掌握条件语句、循环和函数。每天花 1-2 小时练习基础代码,确保理解核心语法规则。变量与数据类型:练习整数、浮点数、字符串和布尔值的操作控制结构:编写 if-e…

图解说明VHDL结构层次:顶层设计入门

从零构建数字系统:VHDL顶层设计的模块化思维实战你有没有遇到过这样的情况——写了一个几百行的VHDL代码,逻辑一改,整个功能就“炸”了?信号名混乱、端口连接错位、仿真结果莫名其妙……别急,这并不是你不够细心&#…

一文说清树莓派换源原理与常见问题解决方案

树莓派换源:不只是改个地址,更是理解 Linux 软件生态的第一课你有没有遇到过这样的场景?刚给树莓派通上电,满心欢喜地打开终端准备安装第一个软件——结果sudo apt update卡了十分钟,最后报出一串红字:Err:…

vivado2023.2下载安装超详细版:支持Win/Linux双平台

Vivado 2023.2 安装实战指南:从零搭建 FPGA 开发环境(Windows Linux 双平台) 你是不是也曾在深夜对着“Failed to extract files”这种错误提示束手无策? 是不是下载了几十GB的安装包,结果卡在85%整整一小时&#x…

安全继电器模块PCB原理图设计新手教程

从零开始设计一个安全继电器模块:原理图实战入门指南你有没有遇到过这样的情况?在做一个自动化控制项目时,明明程序写得没问题,继电器也“咔哒”响了,结果设备却在不该运行的时候突然启动——或者更糟,紧急…

科技是把双刃剑ai到底是不是双刃剑

科技双刃剑属性概述定义科技双刃剑的核心特征(利弊并存)历史案例(如核能、互联网的正面与负面影响)引出AI作为典型双刃剑技术的争议性AI的积极应用场景效率提升:自动化生产、数据分析加速决策医疗突破:疾病…

vivado除法器ip核与自定义逻辑对比:核心要点解析

FPGA除法运算的两条路:IP核与手搓逻辑,谁更适合你的项目? 在FPGA开发中,加法、乘法早已习以为常,但一碰到 除法 ,不少工程师还是会心头一紧。不像ASIC可以依赖强大的算术单元,FPGA上的除法没…

RabbitMQ 消息消费模式深度解析

本文深入探讨 RabbitMQ 中 Exchange、Queue、Routing Key 的协作机制,以及不同场景下的消息消费策略。一、核心概念回顾RabbitMQ 消息流转的核心链路:1.1 Exchange 类型类型特点使用场景direct精确匹配 routing key点对点消息,精确路由topic通…

基于Web的模拟混频电路在线仿真操作指南

用浏览器就能玩转射频电路:在线仿真混频器的实战教学 你有没有过这样的经历?想验证一个简单的模拟混频电路,却要花半天时间安装LTspice、配置模型路径、翻找元件库;或者在课堂上讲调幅信号生成时,学生一脸茫然&#x…

SiFive平台移植RISC-V裸机程序从零实现指南

从零开始在 SiFive 平台运行 RISC-V 裸机程序:不只是“点灯”,而是真正理解底层启动机制你有没有试过,在一块全新的开发板上连一个 LED 都点不亮?不是代码写错了,也不是接线问题——而是程序根本没跑起来。这种情况在裸…

S8050三极管驱动LED灯时饱和状态判定:核心要点解析

S8050驱动LED为何总发热?一文讲透三极管饱和导通的设计精髓你有没有遇到过这种情况:用S8050三极管控制一个LED,结果灯不亮、亮度低,或者三极管发烫得厉害?明明电路看起来没问题——电源接了,电阻也加了&…

超详细版:Multisim搭建单级放大电路全过程

从零开始:用Multisim搭建一个真正能“放大”的单级共射极电路 你有没有试过在仿真软件里搭了一个放大电路,输入信号也加了,电源也接了——可示波器上出来的波形要么是条直线,要么就是削顶的正弦波?别急,这几…

方达炬〖发明信用种品〗:应用数据贷款

方达炬〖发明信用种品〗: 应用数据贷款

无源蜂鸣器驱动电路设计核心要点解析

无源蜂鸣器驱动电路设计:从原理到实战的完整指南在嵌入式系统开发中,声音提示早已不是“锦上添花”,而是人机交互的关键一环。无论是洗衣机完成洗涤时的一声“嘀”,还是智能门锁识别失败的连续警示音,背后都离不开一个…