news 2026/9/2 21:27:08

Apache Doris 4.0.8 写入排障(第 6 篇):从第一批小文件到 -235,正常写入怎样拖死 Tablet

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache Doris 4.0.8 写入排障(第 6 篇):从第一批小文件到 -235,正常写入怎样拖死 Tablet

每次 Stream Load 都成功,每批只有几十 KB,CPU 和磁盘也没有立刻打满。几小时后导入突然报-235,业务以为遇到了随机故障。

它不是突然发生的。每个成功小批都在给同一批 Tablet 增加版本,Compaction 还债速度长期低于造债速度,拒写只是最后一道保护。

Doris 最怕的不是写得多,而是把每一小撮数据都当成一笔独立事务。

一分钟一万行和一秒一次并不是同一种负载

固定每分钟写入 60 万行:

写法每分钟事务数主要成本典型结果
每秒 100 次,每次 100 行6000FE 事务、Rowset、版本、发布Version 快速累积
每秒 1 次,每次 1 万行60批次延迟与客户端缓存存储路径明显更健康
Group Commit 合并小写入由服务端窗口决定等待窗口、WAL 或同步可见客户端保持小写,服务端减少事务

总行数相同,版本生产速度可以相差两个数量级。扩容磁盘不能消除事务固定成本。

复现实验固定表结构、数据量和持续时间,只改变每批行数、每秒事务数以及是否启用 Group Commit,持续记录热点 Tablet 的 VersionCount 与 Compaction Score。

-235 前面的完整因果链

高频小批 → 每批独立事务 → 每个受影响 Tablet 产生新 Rowset 与 Version → 查询需要合并更多读取路径 → Compaction 选择并重写 Rowset → 新版本产生速度长期高于合并速度 → VersionCount 触及保护上限 → 后续导入被 -235 拒绝

数据导入 FAQ 将-235定义为对应 Tablet 版本数超过上限,常见原因就是导入频率高于 BE Compaction 速度。它不是 Segment 过多的-238,两者不能混调。

先找到哪块 Tablet 在欠债

止血前先做只读检查:

SHOWTABLETSFROMtarget_table;SHOWTABLET<tablet_id>;

继续执行SHOW TABLET返回的 ProcPath,重点比较各副本的VersionCount。如果只有少数 Tablet 高,先查分桶热点和数据倾斜;如果全表同步上涨,优先查导入频率和 Compaction 能力。

同时在对应 BE 查看:

  • Compaction Score 是否持续上升;
  • Cumulative/Base Compaction 是否执行或报错;
  • 磁盘空间、I/O、CPU 和内存是否成为限制;
  • 导入批次、并发数和每批涉及的分区数量。

单看平均 Score 会隐藏一块即将拒写的热点 Tablet。

Group Commit 优秀在服务端合并事务

Group Commit 官方文档 描述的核心不是加速单批,而是让多个并发小写入共享一笔事务。相同labeltxnId是写入被合并的直接证据。

SETgroup_commit=async_mode;INSERTINTOevent_logVALUES(...);INSERTINTOevent_logVALUES(...);

sync_mode等到合并事务可见后返回;async_mode写入 WAL 后可先返回PREPARE,可见性稍后发生。追求最低客户端延迟时,不能把收到响应误判成 SQL 已经可查。

Group Commit 也有明确边界:Stream Load 2PC、自定义 Label、部分列更新和显式事务可能绕过或回退普通路径;严格依赖提交顺序的 Unique Key 表还需要 Sequence。

止血不是调大上限

处理顺序应该是:

  1. 降低或暂停问题表的小批写入,让 VersionCount 是否下降成为第一项验证。
  2. 将客户端攒批,或在支持条件下启用 Group Commit。
  3. 检查 Compaction 是否被磁盘、内存、线程或错误卡住。
  4. 若仅单个 Tablet 热,修正 Bucket Key 或分区策略。
  5. 在灰度表重放同样负载,要求版本增速长期低于消化速度。

直接提高max_tablet_version_num只会推迟拒写,并让查询承担更多 Rowset 合并。直接增加 Compaction 线程可能与导入和查询争夺同一组 CPU、磁盘和内存。

源码只看版本保护与合并入口

在 Doris4.0.8中,源码阅读围绕三处:Tablet 元数据维护版本、写入发布前检查版本数量、Compaction 调度按 Score 选择 Tablet。再向下追 Rowset 选择策略,确认为什么某些尺寸差异过大的 Rowset 暂时不会被合并。

源码不能替代现场证据。只有把报错 Tablet、VersionCount、Compaction Score、任务日志和导入频率串起来,才能证明是版本债而不是磁盘故障或副本异常。

-235不是故障起点,而是 Doris 在版本债彻底失控前替你踩下的刹车。

官方资料

  • Group Commit
  • Data Compaction
  • Data Operation FAQ
  • Compaction Principles
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:26:42

中文AIML语料库实战:从基础语法到调优技巧

简介&#xff1a;一套整理好的中文人工智能标记语言&#xff08;AIML&#xff09;语料包&#xff0c;面向需要训练中文聊天机器人或研究自然语言处理的开发者与学习者。压缩包共91个文件&#xff0c;以56个可扩展标记语言&#xff08;XML&#xff09;文件和35个AIML文件两种格式…

作者头像 李华
网站建设 2026/9/2 21:24:26

雅思备考:Simon写作观点库与口语听力联动训练指南

雅思备考圈里&#xff0c;前雅思考官 Simon 几乎是个绕不开的名字。他的写作观点库、大小作文范文、口语答题思路和听力训练方法&#xff0c;被很多考生当成复习主线。尤其当课程配上中文字幕&#xff0c;讲义还能对照观点库一起使用时&#xff0c;学习门槛确实被拉低了不少。我…

作者头像 李华
网站建设 2026/9/2 21:18:27

弱模型生成内容如何避免“失礼”?模型分级路由与降级策略详解

最近和几位做 AI 应用的开发者聊天&#xff0c;发现一个很普遍的现象&#xff1a;不少团队为了控制 API 成本&#xff0c;倾向于用轻量级、参数规模较小的弱模型来完成日常内容生成&#xff0c;比如商品描述、客服话术、周报总结。刚开始跑通时效率很高&#xff0c;成本也确实降…

作者头像 李华
网站建设 2026/9/2 21:13:51

用FastAPI与大模型API构建按token计费的自部署服务实践

今天聊一个很有意思的方向&#xff1a;把按月付费的 AI SaaS&#xff0c;理解功能、拆解流程、再用大模型 API 重新组装成按 token 计费的自部署服务。 先澄清边界。这里的“克隆”不是复制他人代码、扒前端、抄视觉稿或者盗用品牌素材&#xff0c;而是指通过公开的产品功能理…

作者头像 李华
网站建设 2026/9/2 21:12:12

绝地潜兵2替换型Mod完全指南:以星之翼响替换TG-3为例

玩《绝地潜兵2》的朋友应该都遇到过这种想法&#xff1a;原版装备看久了&#xff0c;总想换个造型。尤其是像 TG-3 这种经常出镜、辨识度又高的装备&#xff0c;如果能换成自己喜欢的角色风格&#xff0c;整个游戏的沉浸感会完全不一样。但真打开各种 Mod 网站后&#xff0c;很…

作者头像 李华