最佳实践 · 大数据运维

待环境验证

StarRocks Stream Load 与主键更新实践

核对 Stream Load 结果、Primary Key 与条件更新语义,辨别部分更新和 Merge Commit 的确认边界,防止乱序覆盖与重复推进。

StarRocks大数据监控告警
阅读导引 · 理解后再操作

这篇知识解决什么问题

从批次确认和业务版本两个方向检查 StarRocks 更新链路。普通 Stream Load、Merge Commit 异步接收和 Primary Key 去重提供的保证不同,阅读时应逐个核对模式、label、版本列与删除事件。

收到响应要按导入模式解释

普通同步 Stream Load 的 Success 与异步 Merge Commit 的接收确认不是同一保证。发布超时应追踪原批次,异步模式还要验证后续事务结果;源端位点推进不能只绑定 HTTP 返回码。

条件更新需要稳定的业务版本

主键唯一性不能阻止旧事件覆盖新状态,merge_condition 才引入版本比较。相等版本载荷冲突和乱序删除仍需独立解决,不能把一条正确 UPSERT 的结果推广为所有更新与删除都安全。

进入文章正文
关联架构图解5 个组件 · 点击展开

图中导入客户端经 FE 确认入口,再由对应 BE 或 CN 执行;导入数据实际路径按具体协议核对。本文关注批次终态与主键有效状态,图没有展示上游 CDC、checkpoint 和条件更新协议,不能据图推断端到端恰好一次。

查看场景架构与实施步骤
参考架构 · 非实时拓扑

StarRocks 存算模式与导入查询运维架构

先辨别 shared-nothing 与 shared-data,再检查 FE、BE 或 CN、导入与主键更新、查询 Profile 和存储恢复边界。

  • 数据 / 请求
  • 控制 / 管理
  • 观测 / 查询

点击组件,在图下方查看职责;连线编号对应流向解读。小屏可横向滚动,或直接展开文字说明。

StarRocks 存算模式与导入查询运维架构:组件关系图先辨别 shared-nothing 与 shared-data,再检查 FE、BE 或 CN、导入与主键更新、查询 Profile 和存储恢复边界。 导入与查询客户端 → FE 计划与元数据:入口与计划;FE 计划与元数据 → BE 本地存储:存算一体调度;FE 计划与元数据 → CN 计算与缓存:存算分离调度;CN 计算与缓存 → 共享存储:远端持久数据访问;导入与查询客户端 → BE 本地存储:一体模式导入路径;导入与查询客户端 → CN 计算与缓存:分离模式导入路径。箭头说明见下方流向解读。
逻辑参考图,待环境验证。覆盖 StarRocks 3.3+ 常见架构,操作前对照实际小版本。shared-nothing 使用 BE 本地存储与副本,shared-data 使用 CN 计算、共享存储及本地缓存;两条分支独立核验。

导入与查询客户端

入口 / 来源

明确输入批次、更新顺序和业务可见性。

全部组件职责 5 个组件
导入与查询客户端
明确输入批次、更新顺序和业务可见性。
FE 计划与元数据
两种模式均需 FE 管理元数据和查询计划。工具介绍 FE 计划与元数据
BE 本地存储
存算一体通过 BE 维护本地 Tablet 和副本。工具介绍 BE 本地存储
CN 计算与缓存
存算分离通过 CN 计算并访问共享存储,本地缓存不是唯一数据副本。工具介绍 CN 计算与缓存
共享存储
持久数据由配置的共享存储保存,访问依赖存储卷和凭据。
流向解读 6 条连接
  1. 1

    导入与查询客户端 FE 计划与元数据

    数据 / 请求 · 入口与计划

    记录查询与导入的控制入口,数据路径按具体协议确认。

  2. 2

    FE 计划与元数据 BE 本地存储

    控制 / 管理 · 存算一体调度

    仅选择 shared-nothing 时采用该分支。

  3. 3

    FE 计划与元数据 CN 计算与缓存

    控制 / 管理 · 存算分离调度

    仅选择 shared-data 时采用该分支。

  4. 4

    CN 计算与缓存 共享存储

    数据 / 请求 · 远端持久数据访问

    CN 读取共享数据并利用本地缓存,区分远端延迟与计算耗时。

  5. 5

    导入与查询客户端 BE 本地存储

    数据 / 请求 · 一体模式导入路径

    逻辑表示客户端向 BE 导入,是否重定向或经过代理以具体导入方式为准。

  6. 6

    导入与查询客户端 CN 计算与缓存

    数据 / 请求 · 分离模式导入路径

    逻辑表示 shared-data 模式向 CN 导入;是否重定向及数据持久化路径以具体导入方式和存储配置为准。

故障域与操作边界

适用版本与部署模式

覆盖 StarRocks 3.3+ 常见架构,操作前对照实际小版本。shared-nothing 使用 BE 本地存储与副本,shared-data 使用 CN 计算、共享存储及本地缓存;两条分支独立核验。

数据与变更边界

不提供在线切换存算模式、批量删除节点或清空对象存储的通用命令。缓存可重建不代表 FE 元数据、存储卷凭据或业务数据可以丢弃。

架构依据与版本核对 2 篇官方资料

图解是本站基于官方资料整理的逻辑参考;实施前仍需核对实际部署版本、组件支持范围与变更审批。

适用范围与批次契约

本文面向 StarRocks 3.3 及以后版本的普通 Stream Load 与 Primary Key 表,讨论写入结果、重放和乱序更新。shared-data 与 shared-nothing 的部分更新和索引能力存在版本差异,应按实际补丁确认。Merge Commit 和 Stream Load 事务接口具有单独的确认语义,本篇不把它们当作普通同步请求。内容待实测,验证等级为 PENDING。

导入前应有源端范围、输入摘要、列映射、业务主键、版本字段与 label 的对应关系。排障只读取既有请求和结果,不向真实表发送数据。能够重复发送一份文件,并不意味着能够安全重复执行这个业务批次。

Primary Key 保存当前状态

Primary Key 表用主键索引定位行,并通过删除标记等结构维护新旧行的有效性,适合订单状态与 CDC 更新。主键唯一性和查询排序是不同需求;主键列须包含分区与分桶列,因此可变日期或租户字段必须谨慎纳入键设计。机制和约束见 Primary Key 表

SHOW CREATE TABLE analytics.orders_current;
DESC analytics.orders_current;

从实际 DDL 确认 PRIMARY KEY,不要把 UNIQUE KEY 名称相似的旧模型直接等同于它。检查 source_version 的类型、是否允许空值以及来源。若把普通属性全部放进复合主键,属性改变会成为新键,不能获得预期的订单状态替换。

Stream Load 的接入与响应

普通 Stream Load 使用 HTTP PUT,向 FE 提交后可能重定向到作为协调者的 BE 或 CN。因此客户端只通 FE 端口而无法访问重定向目的地,也会出现“数据库能连、导入失败”。网络诊断应依据实际重定向目标,不把认证信息发给未经确认的地址,流程见 从本地文件系统导入

保存 JSON 正文而不仅是 HTTP 返回码。Success 表示数据已加载且可查询;Publish Timeout 表示已成功提交但尚未可查,无需重新导入;Label Already Exists 表明原 label 已使用,可能仍在加载或已经成功。NumberLoadedRows 仅在 Status=Success 时有明确有效性,字段以 STREAM LOAD 参考 为准。

用正确视图追踪导入

普通 Stream Load 不能通过 SHOW LOAD 查询结果,应首先查看保存的响应。在现场版本提供并保留相应记录时,可精确查询 information_schema.stream_loads

SELECT LABEL, TXN_ID, DB_NAME, TABLE_NAME, STATE,
       ERROR_MSG, NUM_ROWS_NORMAL, NUM_ROWS_AB_NORMAL
FROM information_schema.stream_loads
WHERE DB_NAME = 'analytics'
  AND TABLE_NAME = 'orders_current'
  AND LABEL = 'orders_20260901_batch0042'
LIMIT 5;

这是对已知批次的检查,STATE 是该视图中的任务状态,不应直接套用 Doris 的事务状态名称。字段、保留和可见权限需按环境核验;查不到可能是版本、记录范围或保留问题,不是安全重放的证明。字段见 stream_loads 视图

去重与乱序更新分别验证

Primary Key 保证同一键的有效记录唯一,但不会自动理解上游事件的业务先后。条件更新可通过导入参数 merge_condition 指定版本列。官方示例按传入版本大于或等于当前版本时更新,因此版本相等但载荷不同仍可能产生覆盖,需要上游保证相同版本内容一致,见 通过导入变更数据

用订单 90001 解释验收:当前版本 20 已支付,迟到版本 19 待支付应被挡住;版本 21 已退款应生效;同为版本 21 却金额不同属于源端冲突。DELETE 不支持同样的条件更新保护,删除事件乱序必须单独设计,不应直接以一次 UPSERT 试验推断删除也安全。

部分更新需要明确缺失列语义

普通完整 UPSERT 与部分更新不能混用。先检查请求是否开启 partial_update、使用 row 还是 column 模式、明确列映射,并确认当前部署形态支持该组合。缺失列、显式 NULL、空字符串和默认值有不同含义,尤其会影响非空约束和新键行为。

将样本拆成“既有键只变状态”“新键只提供部分字段”“显式清空字段”三类,各自写出期望结果。两个并发写入者更新不同列,也要核实版本与合并策略,不能认为开启部分更新就自动解决所有写冲突。本文不提供可直接提交的写入命令,以免把缺失的表定义与数据契约藏在示例中。

label 与 Merge Commit 的边界

普通 Stream Load 的 label 应稳定标识同一份业务输入。记录保留有期限,因此它不是永久去重账本;同一批数据换一个 label 后,仍需要靠业务模型和来源约束避免错误重放。质量过滤与 WHERE 条件过滤也要分开核对,不能用总行数抵消业务键丢失。

从 3.4 起,Merge Commit 可合并并发小请求,但服务端会生成 label、忽略客户端指定 label。异步模式仅确认接收,不保证此时已持久化或可见,也不保证同客户端请求的顺序。使用该模式需独立保存事务结果并验证,不能沿用普通同步模式的“收到成功立即推进位点”规则,见 Merge Commit 说明

核查有效状态与资源代价

事务结果明确后,按已知主键和分区验证:

SELECT tenant_id, order_id, status, source_version, amount
FROM analytics.orders_current
WHERE order_date = '2026-09-01'
  AND tenant_id = 42
  AND order_id IN (90001, 90002, 90003)
LIMIT 10;

执行前先确认分区裁剪,LIMIT 不是读取成本保证。比较的不只是唯一行数,还包括最高业务版本、状态与金额。新增行数少可能完全正常,因为批次大部分是已有主键更新。

主键索引、删除标记和合并都占用资源。持续小批更新变慢时,观察热分区、索引内存、版本增长与 Compaction,而不是直接提高并发。持久化索引把部分成本转移到存储,不能笼统写成“不占内存”。相关权衡见 Primary Key 表最佳实践

验收、停止与回退

完成验收需要批次响应或后续终态、输入摘要与 label 对应关系、过滤原因、版本样本和源端位点证据。测试应涵盖重复批次、乱序版本、相等版本冲突、部分更新新键和删除;任何未知语义都不能以“无重复行”结案。

若旧版本覆盖新状态、删除重放产生歧义、记录缺失而源端准备推进,停止自动重试并保留事件。已提交更新不能靠停止加载恢复旧值;回退需要可信旧版本或源端事件重建。关联阅读 StarRocks 两种存储架构查询 Profile 调优

参考资料

从现象到判断

先收集证据,再缩小范围。以下是判读路径,不代表已经确认根因或获准变更。

  1. 客户端显示 Publish Timeout,SHOW LOAD 又查不到原导入。

    只读核对
    核对原请求为普通 Stream Load,读取保存的响应,并在版本支持时按 label 查 stream_loads。
    如何判读
    SHOW LOAD 不是普通 Stream Load 的结果入口,缺少该记录不能作为换 label 重投的理由。
  2. Primary Key 表只有一条订单记录,版本却低于上游已处理事件。

    只读核对
    核对 source_version、merge_condition、主键分区字段和相同版本的载荷一致性。
    如何判读
    可能是业务顺序保护或键设计问题,唯一行数本身不能证明新状态被保留。
  3. 开启 Merge Commit 后提交端很快,但目标数据尚未可见且原 label 无法对应。

    只读核对
    确认是否使用异步模式,保存服务端事务标识和后续结果,核对该模式生成 label 的规则。
    如何判读
    异步接收不保证当时已持久化,客户端 label 会被忽略,需要单独确认和位点策略。
常见误区与判断边界 2 项

缺失列和显式 NULL 混用

完整 UPSERT、部分更新与新键插入具有不同输入要求。先核查列映射、partial_update 和模式支持,再分别验证缺失、清空与默认值,避免把既有键样本通过推广到所有输入。

主键表天然允许任意重放

重放可能不增加行,却能改变有效版本或触发删除,尤其相等版本冲突无法由唯一性修复。应保留源事件与批次身份,停止结果未知的重试;已提交状态需要补偿或可信来源重建。

交接时应留下的证据

作为记录提纲使用,不是自动检查结果;未取得的证据应标记缺口,并注明负责人。

  • 记录部署模式、表 DDL、Primary Key 与业务版本契约,标明部分更新和索引所需补丁版本。
  • 保存输入摘要、源端范围、列映射、label 和服务端事务信息,注明普通同步或 Merge Commit 模式。
  • 保留重复、迟到、相等版本冲突、新键部分更新和删除样本的预期与实际状态,未运行项保持待验证。
  • 交接质量过滤、热分区索引与合并压力、源端位点推进依据和可信补偿来源。

记录需包含环境、版本、时间与时区;分享前脱敏,不附访问令牌、密码或完整业务敏感数据。

继续阅读与资料核对

补充相关主题,再结合当前环境的实施记录形成结论。

返回原理导读

DOUYA OPS ECOSYSTEM

贡献你的经验,帮助更多运维人

把故障复盘、标准流程和最佳实践沉淀为可检索、可复用的知识内容。