当前位置: 首页 > article >正文

Kafka :存储、复制与可靠性

本章目标本章从底层解释 Kafka 为什么吞吐高、为什么能容错以及什么配置会影响丢消息和重复消息。Kafka 日志存储模型Kafka 的 partition 本质是追加日志。每个 partition 在磁盘上对应一个目录目录中有多个日志段文件。典型文件00000000000000000000.log 00000000000000000000.index 00000000000000000000.timeindex 00000000000001000000.log 00000000000001000000.index 00000000000001000000.timeindex文件作用.log保存真实消息内容.indexoffset 到物理位置的稀疏索引.timeindex时间戳到 offset 的索引Kafka 高吞吐的核心原因顺序追加写磁盘避免随机写。充分利用 OS page cache。批量发送和批量落盘。sendfile / zero-copy 降低内核态和用户态拷贝。partition 并行分布在多个 broker。Retention 与 CompactionKafka 删除数据不是因为消费者消费了而是因为保留策略。常见配置retention.ms604800000 retention.bytes107374182400 segment.bytes1073741824 segment.ms604800000含义retention.ms保留多久。retention.bytes最多保留多大。segment.bytes单个日志段大小。segment.ms日志段滚动时间。Delete 策略默认策略超过时间或大小后删除旧日志段。适合行为日志。订单事件流水。操作日志。Compact 策略按 key 保留最新值旧值会被压缩清理。适合用户最新状态。配置变更。数据库 CDC 的最新快照。配置示例kafka-configs --bootstrap-server localhost:9092\--entity-type topics\--entity-name user-profile-snapshot\--alter\--add-configcleanup.policycompact副本复制每个 partition 可以有多个 replica。一个 replica 是 leader其余是 follower。Producer 和 Consumer 默认只与 leader 交互follower 从 leader 拉取数据。关键概念概念说明Leader当前处理读写请求的副本Follower从 leader 复制数据的副本ARAssigned Replicas所有分配副本ISRIn-Sync Replicas与 leader 保持同步的副本OSROut-of-Sync Replicas落后太多的副本LEOLog End Offset日志末尾位置HWHigh Watermark消费者可见的最高已提交位置ISR 与 HWKafka 不会把 leader 刚写入但尚未被足够副本确认的消息立即暴露为“稳定数据”。HW 表示已经被 ISR 副本确认的安全位置消费者只能读到 HW 之前的消息。这解决的问题leader 写入一条消息后立刻宕机。follower 没来得及复制。新 leader 不包含那条消息。如果消费者之前已经读到那条消息就会出现“读到的数据后来消失”。Kafka 通过 HW 避免消费者读到未提交数据。Producer 可靠性配置可靠性从 producer 开始acksall enable.idempotencetrue retries2147483647 max.in.flight.requests.per.connection5 delivery.timeout.ms120000 request.timeout.ms30000acks0Producer 发出去就认为成功不等待 broker。吞吐高但可能丢消息。适合可丢弃日志、埋点采样。acks1Leader 写入成功就返回。leader 宕机且 follower 未同步时可能丢消息。适合一般日志但不适合核心交易。acksallLeader 等 ISR 中副本确认后返回。配合min.insync.replicas可以显著降低丢消息风险。生产建议replication.factor3 min.insync.replicas2 acksall unclean.leader.election.enablefalse含义3 副本中至少 2 个同步副本确认才认为写入成功不同步副本不能被选为 leader。幂等生产者幂等生产者解决“发送成功但响应丢失producer 重试导致重复写入”的问题。开启enable.idempotencetrueKafka 为 producer 分配 PID并为每个 partition 维护 sequence number。broker 发现同一 PID、同一 partition 上重复 sequence会去重。边界幂等只保证单 producer session 内、单 partition 上的写入不重复。producer 重启后 PID 变化业务层仍建议有eventId做幂等。Kafka 事务Kafka 事务解决“多条消息要么一起对消费者可见要么一起不可见”的问题。配置transactional.idorder-tx-producer-1 enable.idempotencetrue事务流程beginTransaction send topic A send topic B sendOffsetsToTransaction commitTransaction消费者如果只想读已提交事务数据isolation.levelread_committed适用场景从一个 topic 消费处理后写入另一个 topic同时提交消费 offset。Kafka Streams exactly-once 处理。不适用场景直接保证数据库和 Kafka 的强一致事务。数据库不参与 Kafka 事务。跨外部 HTTP 服务的全局事务。数据库 Kafka 更常用的是 Outbox 模式业务事务写订单表 outbox_event 表 - 后台任务/CDC 发送 Kafka - 标记已发送Consumer 可靠性Consumer 可靠性重点不是 Kafka 能否保存消息而是 offset 提交时机。错误做法poll - commit offset - 业务处理处理失败后消息不会再被消费。推荐做法poll - 业务处理成功 - commit offset如果业务处理成功但提交 offset 失败消息可能重复消费。因此消费者业务必须支持幂等。端到端语义语义条件说明At most once先提交 offset 后处理可能丢不重复At least once处理成功后提交 offset不易丢可能重复Exactly onceKafka 事务 幂等 read_committed只覆盖 Kafka 内链路在业务系统中最常见、最务实的是Kafka 至少一次投递 消费端业务幂等实操可靠性配置检查查看 topic 配置dockercomposeexeckafka kafka-configs\--bootstrap-server localhost:9092\--entity-type topics\--entity-name order-events\--describe创建 3 副本 topic 的生产命令在单 broker demo 中不可用但生产环境应类似kafka-topics --bootstrap-server kafka-1:9092\--create\--topicorder-events\--partitions12\--replication-factor3\--configmin.insync.replicas2检查 ISRkafka-topics --bootstrap-server kafka-1:9092\--describe\--topicorder-events重点看Leader: 1 Replicas: 1,2,3 Isr: 1,2,3如果 ISR 长期少于副本数说明 follower 落后或 broker 异常需要排查网络、磁盘、GC、负载。04 性能调优、压测与容量规划本章目标Kafka 调优不是记一堆参数而是围绕目标吞吐、延迟、可靠性和成本做取舍。本章给出可落地的调优路线Producer 批量、压缩、并发。Broker 磁盘、网络、线程、页缓存。Consumer 拉取、批处理、并发和背压。Topic 分区和容量规划。压测方法与指标解释。性能问题先分类表现可能原因优先排查Producer 发送慢批次太小、网络慢、broker 写入慢producer metrics、request latencyConsumer 堆积消费逻辑慢、分区太少、下游慢lag、处理耗时、线程池Broker CPU 高压缩消耗、请求太多、TLS/SASLCPU、请求队列、网络线程Broker 磁盘忙顺序写压力大、page cache 不足iostat、log flush、磁盘延迟Rebalance 频繁消费者心跳超时、实例波动consumer group logs某分区热点key 分布不均partition bytes in/outProducer 调优批量发送Producer 不是每条消息都立刻发送一个网络请求而是先进入本地缓冲区按 topic-partition 聚合成批次。关键配置linger.ms10 batch.size65536 buffer.memory67108864 compression.typelz4调优思路延迟敏感linger.ms小一些例如 0-5ms。吞吐优先linger.ms适当增大例如 10-50ms。消息较小提高batch.size更容易合批。网络或磁盘压力大开启lz4或zstd压缩。可靠性与吞吐取舍配置吞吐可靠性说明acks0高低不等确认acks1中高中leader 写入即成功acksall中高等 ISR 确认compression.typenoneCPU 低不直接影响网络和磁盘压力高compression.typelz4常见较优不直接影响综合性能好Broker 调优磁盘Kafka 强依赖磁盘顺序 IO。生产建议使用 SSD 或高性能云盘。日志目录分散到多块盘。保留足够 page cache。不要把 broker 和重 IO 服务混部。监控磁盘使用率、IO wait、读写延迟。关键配置log.dirs/data/kafka-logs-1,/data/kafka-logs-2 log.segment.bytes1073741824 log.retention.hours168 num.recovery.threads.per.data.dir2网络线程和 IO 线程num.network.threads8 num.io.threads16 queued.max.requests500 socket.send.buffer.bytes102400 socket.receive.buffer.bytes102400调优原则请求队列积压说明 broker 处理不过来。网络线程不足时 request queue 会升高。IO 线程不足时磁盘相关处理延迟升高。不要盲目调大线程先看 CPU 是否还有余量。Consumer 调优批处理max.poll.records500 fetch.min.bytes1048576 fetch.max.wait.ms500 max.partition.fetch.bytes1048576如果消费逻辑支持批量写库应该尽量批处理poll 500 条 - 批量校验 - 批量写入数据库 - 提交 offset比每条消息一次数据库写入更稳定。背压当下游数据库或 HTTP 服务变慢时消费者继续高速拉取会导致内存和线程池堆积。策略降低max.poll.records。暂停对应 partitionconsumer.pause(partitions)。下游恢复后再resume。对非核心业务使用限流和降级。对核心业务保留堆积容量和告警阈值。容量规划输入指标容量规划至少需要这些数字指标示例用途峰值 TPS30,000 msg/s估算请求量平均消息大小1 KB估算带宽和磁盘保留时间7 天估算存储副本数3存储乘数压缩比0.5修正存储和网络目标峰值利用率60%保留冗余存储估算公式每日原始数据量 TPS * 消息大小 * 86400 实际存储 每日原始数据量 * 保留天数 * 副本数 * 压缩比 / 磁盘目标利用率示例TPS 30000 消息大小 1KB 保留 7天 副本 3 压缩比 0.5 磁盘目标利用率 0.7 每日原始数据 30000 * 1KB * 86400 2471 GB 实际存储 2471 * 7 * 3 * 0.5 / 0.7 37065 GB大约需要 36 TB 可用磁盘容量。Partition 估算如果单 partition 写入能力按 10 MB/s峰值写入约30000 msg/s * 1KB 30 MB/s写入角度至少 3 个 partition。但消费角度如果需要 24 个消费者并行处理则 topic 至少要 24 个 partition。建议partition max(写入吞吐所需, 消费并行度所需) * 未来增长系数压测工具Kafka 自带压测脚本Producer 压测kafka-producer-perf-test\--topicperf-test\--num-records1000000\--record-size1024\--throughput-1\--producer-propsbootstrap.serverslocalhost:9092acksallcompression.typelz4Consumer 压测kafka-consumer-perf-test\--bootstrap-server localhost:9092\--topicperf-test\--messages1000000\--groupperf-test-group看结果时重点关注records/secMB/secavg latencyp95/p99 latencyproducer error rateconsumer lag热点分区治理热点分区常见原因key 分布不均例如大量消息 key 都是system。某个大客户、热门商品、热门直播间流量过高。分区数量不足。治理方法方法示例代价key 打散userId randomBucket牺牲严格顺序大客户单独 topicvip-order-eventstopic 增多增加 partition12 - 24key 映射变化分业务拆 topic订单、支付、履约分离架构调整如果必须保证单订单顺序可以按orderId分区如果只需要用户级聚合可以按userId分区如果更关注吞吐可以使用更细粒度散列 key。

相关文章:

Kafka :存储、复制与可靠性

本章目标 本章从底层解释 Kafka 为什么吞吐高、为什么能容错,以及什么配置会影响丢消息和重复消息。 Kafka 日志存储模型 Kafka 的 partition 本质是追加日志。每个 partition 在磁盘上对应一个目录,目录中有多个日志段文件。 典型文件: 0000…...

Kafka 基础:从消息队列到事件流平台

学习目标 能说清 Kafka 是什么、适合什么、不适合什么。能解释 broker、topic、partition、offset、consumer group 的关系。能用命令创建 topic、发送消息、消费消息、查看消费组状态。 Kafka 是什么 Kafka 是一个分布式事件流平台。它表面上像消息队列,但核心模型…...

非线性干涉仪色散效应与量子OCT补偿技术

1. 非线性干涉仪中的色散效应解析在基于非简并光学参量下转换(SPDC)的SU(1,1)量子干涉仪中,色散效应呈现出独特的物理特性。这类干涉仪的核心是一个χ(2)非线性晶体,当泵浦光(ωp)通过晶体时,会…...

Vim插件sideways.vim:高效重构代码列表项的智能工具

1. 项目概述:一个改变你代码编辑习惯的Vim插件如果你和我一样,常年泡在Vim里写代码,肯定遇到过这样的场景:写一个函数调用,参数顺序不对,想把第二个参数和第一个参数对调一下。常规操作是什么?把…...

Arm CI-700互联架构的时钟与电源管理机制解析

1. Arm CI-700互联架构的时钟管理机制1.1 外部时钟控制器(ExtCC)工作原理ExtCC是CI-700中负责硬件时钟门控(HCG)的核心模块,它通过Q-Channel协议与Power Control Clock Bridge(PCCB)进行交互。这个交互过程实际上是一个精密的硬件状态机,其核心在于管理两…...

ARM Fast Models跟踪组件在Cortex-M85调试中的应用

1. ARM Fast Models 跟踪组件深度解析在嵌入式系统开发领域,处理器跟踪技术是理解系统行为、定位复杂问题的关键工具。ARM Fast Models 提供的跟踪组件为 Cortex-M 系列处理器(特别是 Cortex-M85)提供了全面的执行监控能力。这套工具不仅能捕…...

别再手动备份了!用StableBit DrivePool给Windows做个“云盘级”本地存储池(附详细配置)

告别数据焦虑:用StableBit DrivePool打造智能本地存储池 每次看到桌面上散落的几块硬盘,你是否会感到一阵烦躁?工作文档在D盘,家庭照片在E盘,下载的电影又分散在F盘和G盘——这种碎片化的存储方式不仅管理困难&#xf…...

低轨卫星C语言星载软件功耗优化实战手册(NASA/JAXA/北斗在轨验证版)

更多请点击: https://intelliparadigm.com 第一章:低轨卫星星载软件功耗约束与在轨验证体系 低轨卫星受限于能源供给(如小型太阳能帆板与有限容量锂硫电池),星载软件必须在功能完备性与实时性前提下,严格满…...

C#网络编程避坑指南:从Socket到TcpClient,我踩过的那些异步和资源释放的坑

C#网络编程避坑指南:从Socket到TcpClient的异步与资源管理实战 在构建高可靠性网络应用时,C#开发者常陷入看似简单却暗藏玄机的技术陷阱。记得去年参与金融数据传输项目时,系统在连续运行72小时后突然崩溃,日志里满是"Object…...

实时性生死线:医疗传感器数据采集为何总超时?揭秘ISO 80601-2-61合规下C语言中断响应≤100μs的5层优化链

更多请点击: https://intelliparadigm.com 第一章:实时性生死线:医疗传感器数据采集为何总超时? 在重症监护、远程手术和可穿戴健康监测等场景中,毫秒级的数据延迟可能直接导致临床误判。医疗传感器(如ECG…...

从实验室原型到北斗三号量子加密车载终端:C语言跨平台调试的4层抽象泄漏与3次重构血泪教训

更多请点击: https://intelliparadigm.com 第一章:从实验室原型到北斗三号量子加密车载终端:C语言跨平台调试的4层抽象泄漏与3次重构血泪教训 抽象泄漏的典型现场 在将基于 STM32H7 的北斗三号量子密钥分发(QKD)协议…...

超越自动化:2030年的工业智能体与具身智能展望

系列终篇:2026工业AI实战与全景解析(5/5) 标签: 具身智能 | 工业智能体 | 大模型 | 边缘AI | 未来趋势 一、开篇:我们正在见证历史的转折点 2026年的工业AI,还处于"工具时代"——AI是人类的辅助,执行特定的、预设的任务。 但站在当下眺望2030年,一个更激进…...

SD-PPP技术架构深度解析:Photoshop与AI工作流集成方案

SD-PPP技术架构深度解析:Photoshop与AI工作流集成方案 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp SD-PPP作为一个开源的Photoshop AI插件,通过创新的双向通信架构实现了传统设计工具与A…...

2026年5月阿里云Hermes Agent/OpenClaw安装指南+百炼token Plan全解析攻略教程

2026年5月阿里云Hermes Agent/OpenClaw安装指南百炼token Plan全解析攻略教程。OpenClaw和Hermes Agent是什么?OpenClaw和Hermes Agent怎么部署?如何部署OpenClaw/Hermes Agent?2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑吗&…...

BetterLoggerMCP:iOS开发者的结构化日志分析与AI调试利器

1. 项目概述:一个为现代iOS开发者打造的日志分析利器如果你是一名iOS开发者,每天都要和Xcode控制台里那些杂乱无章、飞速滚动的日志信息打交道,那你一定体会过在成百上千行输出里寻找一个特定网络请求或UI渲染问题的痛苦。传统的控制台日志查…...

现代Qt开发教程(新手篇)1.11——定时器

现代Qt开发教程(新手篇)1.11——定时器 相关仓库仍然已经开源,正在积极火热的建设之中,欢迎各位大佬提Issue和PR! 链接地址:https://github.com/Awesome-Embedded-Learning-Studio/Tutorial_AwesomeQt 1. 前…...

2026年5月阿里云上Hermes Agent/OpenClaw怎么部署?百炼token Plan配置详解

2026年5月阿里云上Hermes Agent/OpenClaw怎么部署?百炼token Plan配置详解。OpenClaw和Hermes Agent是什么?OpenClaw和Hermes Agent怎么部署?如何部署OpenClaw/Hermes Agent?2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑…...

CAN与CANopen技术:工业控制与汽车电子的核心通信方案

1. CAN与CANopen技术概述在嵌入式系统领域,控制器局域网(Controller Area Network,简称CAN)已经成为工业控制、汽车电子和物联网应用中不可或缺的通信技术。作为一名从事嵌入式开发十余年的工程师,我见证了CAN总线从汽…...

Windows系统xactengine2_7.dll文件丢失找不到无法启动程序解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

Windows系统xactengine2_8.dll文件丢失无法启动程序解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

xactengine2_10.dll文件丢失找不到无法启动程序解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

别只盯着dev环境!用Nacos配置中心为SpringBoot项目管理多环境(dev/test/pro)的完整实践

Nacos多环境配置管理:从开发到生产的SpringBoot实战指南 在微服务架构中,配置管理往往成为团队协作的痛点。想象这样一个场景:开发环境使用内存数据库,测试环境连接内网MySQL,而生产环境需要配置高可用集群。传统做法是…...

量子退火原理、应用与混合优化架构解析

1. 量子退火的核心原理与工作机制量子退火是一种受量子力学启发的优化算法,其核心思想是通过模拟量子系统的演化过程来寻找复杂优化问题的最优解。与传统模拟退火相比,量子退火引入了量子隧穿效应这一独特机制,使其能够突破经典优化算法面临的…...

通过Taotoken管理控制台精细化管控API Key的访问权限

通过Taotoken管理控制台精细化管控API Key的访问权限 1. 准备工作与登录控制台 在开始配置前,请确保您已拥有Taotoken平台的企业管理员或项目负责人账号权限。访问Taotoken官网,点击右上角登录按钮进入控制台。首次使用需完成企业邮箱验证和双因素认证…...

终极指南:使用TegraRcmGUI图形化工具实现Windows平台Switch破解注入

终极指南:使用TegraRcmGUI图形化工具实现Windows平台Switch破解注入 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Windo…...

Nemotron-Cascade:强化学习驱动的模型级联推理框架

1. 项目概述:当推理模型遇上级联强化学习去年在优化一个多模态问答系统时,我遇到了一个典型困境:单一模型在简单问题上表现优异,但面对复杂推理任务时,准确率会断崖式下跌。这让我开始关注模型级联技术——而Nemotron-…...

从‘互相抄作业’到‘互相教’:Co-teaching如何让两个神经网络在噪声中共同成长

当神经网络学会"互批作业":Co-teaching对抗标签噪声的协同进化之道 在机器学习的世界里,数据质量往往决定着模型性能的上限。想象一下,如果课堂上40%的习题答案被故意写错,学生要如何避免被误导?这正是现实世…...

异步训练管道在机器人策略学习中的优化实践

1. 异步训练管道的核心价值在机器人策略学习领域,数据采集效率与训练速度一直是制约算法迭代的瓶颈。传统同步训练模式中,机器人需要在环境中完成完整回合(episode)后才能将数据传回中央服务器,这种"收集-训练-部…...

基于Tauri+React的跨平台桌面应用开发:架构设计与打包实战

1. 项目概述:WhereClaw 是什么? WhereClaw 是一个基于 Tauri 框架构建的跨平台桌面应用程序。简单来说,它提供了一个现代化的图形用户界面(GUI),而其核心功能则由一个名为 whereclaw-engine 的运行时引擎…...

MR-Search框架:元强化学习与自反思的智能优化

1. 项目概述:当强化学习遇上元学习与自反思 在强化学习领域,算法性能高度依赖于超参数的选择和策略架构的设计。传统方法往往需要大量试错或依赖专家经验,而MR-Search框架的创新之处在于将元强化学习(Meta-RL)与自反思…...