第 30 关 · ★★★★★

毕业综合实战

构建 Agent-Ready 实时数据平台:架构、DDL、脚本、测试与 Runbook 完整交付。

已点亮 · 最佳 分

Agentic Analytics 展望

当数据库的一等用户从人变成 Agent

MCP混合检索Agent-Friendly
1 / 11

Day 30|毕业综合实战:构建 Agent-Ready 实时数据平台

课程阶段:第六阶段|湖仓与 AI
毕业项目: 电商经营分析 + 订单 CDC + 日志检索 + 企业知识库 RAG + Doris MCP 问数
完整功能基线: Apache Doris 4.1.3
稳定兼容基线: Apache Doris 4.0.8
MCP 基线: Doris MCP Server 1.0.0,MCP 2026-07-28
验收原则: 正确性、P99、稳定性、安全、可复现五项同时达标。

Day 30 毕业项目总览
Day 30 毕业项目总览


一、毕业项目要证明什么

前二十九天分别学习了数据库定位、架构、表模型、导入、索引、物化视图、查询内核、存储引擎、资源治理、运维、安全、湖仓、搜索和 MCP。Day 30 的任务是把这些能力组织成一套能够运行、能够验证、能够交接的系统。

项目最终回答四个问题:

  1. 业务是否得到稳定结果。 数据进入系统后,经营看板、订单状态、日志检索和知识问答都要达到约定时效。
  2. 系统行为是否能够解释。 每一项性能结论都要有 Explain、Profile、Metrics、日志或审计证据。
  3. 故障是否能够被控制。 节点、导入、查询、对象存储、权限和 Agent 调用出现异常时,平台要有止损和恢复路径。
  4. 交付物是否能够被复现。 版本、配置、数据集、脚本、结果、已知限制和回滚条件都应进入项目包。

毕业项目强调系统协同。功能列表很容易写得很长,业务链路仍可能断裂。例如表建得很漂亮,CDC 没有 Sequence;向量索引召回很好,ACL 在应用层过滤;Dashboard 单查询很快,高并发时却挤压实时写入;MCP 能执行 SQL,结果没有行数和字节上限。Day 30 要关闭这些链路间的缝隙。

30 天知识汇聚图
30 天知识汇聚图


二、项目业务背景与目标

假设一家多租户电商企业已有业务库、Kafka、数据湖和内部知识文档,希望统一建设实时数据平台。平台同时服务五类用户:

  • 经营团队查看 GMV、订单量、买家数、渠道和地区趋势;
  • 客服与订单 API 查询单个订单当前状态;
  • SRE 检索应用日志并沿 trace_id 定位异常;
  • 员工通过 RAG 查询产品、运维和制度文档;
  • Agent 通过 Doris MCP Server 获取 Schema、执行受限查询、查看 Profile 和诊断集群。

项目目标值如下:

业务链路 目标
数据新鲜度 业务事件进入 Doris 后 30 秒内可查
核心 Dashboard 100 并发下 p95 ≤ 2 秒、p99 ≤ 5 秒
订单 Point Query 热缓存 p99 ≤ 100 毫秒
日志检索 近 7 天关键词检索 p95 ≤ 500 毫秒
RAG Golden Set Recall@20 ≥ 0.85,权限过滤 100% 生效
MCP 只读;单次 ≤1000 行、≤1MB、≤60 秒
可用性 月度目标 99.9%
灾备 RPO ≤15 分钟、RTO ≤30 分钟

这些数值是项目验收目标,需要在自己的硬件和并发条件下实测。官方文档提供架构和能力说明,无法替代业务压测。

业务场景与 SLO
业务场景与 SLO


三、版本锁定与两套运行配置

截至 2026 年 8 月 18 日,Apache Doris 下载页标记 4.1.3 为 Latest、4.0.8 为 Stable。毕业项目希望覆盖 4.1 的 Vector、Wide Table V3、搜索增强等能力,因此完整功能配置锁定 4.1.3;生产组织若优先使用 Stable 分支,可以选择 4.0.8 兼容配置。

3.1 4.1.3 完整配置

适合课程答辩和新能力验证:

  • HNSW、IVF、IVF_ON_DISK 与量化评测;
  • Storage Format V3;
  • 当前 4.1 的 Cache、Variant 和 Search 增强;
  • Doris MCP Server 1.0 能力探测后按实际可用 Child 调用。

3.2 4.0.8 稳定兼容配置

保持相同业务模型和数据合同,同时调整:

  • 向量检索优先使用 HNSW;
  • 跳过 4.1-only 的 IVF、部分量化和 V3 实验;
  • 所有参数、系统表和 SQL 重新执行版本核验;
  • Agent 根据 Runtime Capability Manifest 隐藏不可用 Child。

项目包必须保存 SELECT VERSION()、FE/BE 列表、配置快照和 Release Notes 评审记录。任何回归都先区分版本变化、数据变化、统计信息变化和执行计划变化。


四、总体架构:实验模式与生产参考模式

生产参考模式采用存算分离:3 个 FE 提供 SQL、Catalog、Nereids、权限和调度;Meta Service 管理数据层元数据;多个 BE 组成 cg_writecg_querycg_batch;Storage Vault 指向 S3/HDFS;本地 SSD 作为 File Cache。湖上历史通过 Hive、Iceberg、Hudi 或 Paimon Catalog 接入。

实验模式可以复用 Day 5 的单集群环境。它能够验证 DDL、Stream Load、查询、索引、MV、Search 和 MCP 读链路。Compute Group、Meta Service、FoundationDB、对象存储抖动和多节点容灾需要独立环境。

三个计算组的职责建议如下:

Compute Group 任务 资源特征
cg_write CDC、Routine Load、Compaction、Schema Change 高吞吐、高 IO
cg_query Dashboard、API、Point Query、Search 低延迟、稳定尾延迟
cg_batch ETL、历史回算、MV Refresh 高并行、允许 Spill、峰谷弹性

组内继续使用 Workload Group 管理 CPU、内存、并发、队列和 Spill。这样形成节点级硬隔离与进程内细粒度配额两层治理。

总体架构
总体架构


五、数据模型:状态、事件、明细、日志和知识文档分开设计

5.1 当前状态表

fact_orderdim_userdim_sku 使用 Unique Key MoW。业务主键承担唯一身份,source_seq 处理 CDC 乱序。订单更新、删除和部分列更新都围绕同一主键合同展开。

fact_order 还启用 Row Store,服务订单详情 Point Query。它保留列存分析能力,同时降低整行返回时的列重组成本。

5.2 原始事件与明细

fact_order_itemorder_status_event 使用 Duplicate Key,保留每一条明细与状态变化。事件表用于审计、漏斗、时序分析和问题追踪,不能被当前状态表替代。

5.3 日志与半结构化属性

app_log 保存时间、租户、服务、级别、trace_id、message 和 VARIANT attrs。service、level、trace_id 建结构化倒排索引,message 建全文索引。attrs 用于承接动态字段,常用属性可以在后续通过 Schema Template 固定类型。

5.4 知识库文档

docs_kb 保存正文、标题、标签、tenant、acl_group、有效期、Embedding Model、Version 和 content_hash。title/body 使用倒排索引,embedding 使用 ANN Index。RAG 查询必须在数据库中先执行 tenant、ACL、文档类型和有效期过滤。

数据模型 ER
数据模型 ER


六、分区、分桶与索引设计

订单和日志按日期分区,满足三类需求:

  • 查询裁剪;
  • 生命周期管理;
  • 补数、删除和恢复的管理边界。

订单按 tenant_id + order_id Hash 分桶,让主键查询和订单明细关联保持稳定分布。日志可以 Random Bucketing,避免缺少稳定分桶键时产生倾斜。Bucket 数先根据单分区压缩量、目标 Tablet 大小、BE 数量和并行度估算,再通过 POC 校正。

索引设计遵循查询模式:

  • fact_order.user_id/status/channel:倒排索引用于高选择性过滤;
  • fact_order_item.sku_id:商品维度过滤与 Join 候选缩小;
  • app_log.message:全文检索;
  • docs_kb.title/body:全文与 BM25;
  • docs_kb.embedding:HNSW 或 4.1 的 IVF 系列;
  • Prefix、ZoneMap 和 Partition Pruning 继续承担自动裁剪。

索引会增加写入 CPU、存储和 Compaction 成本。上线前必须比较索引前后导入吞吐、索引大小、查询 p95/p99 和目标并发。


七、导入体系:每条链路都有独立的一致性合同

7.1 订单 CDC

业务库通过 Streaming Job 或 Flink CDC 写入 Unique Key 表。正确性由四部分共同保证:

源端主键
+ UPSERT
+ __DORIS_DELETE_SIGN__
+ Sequence Column

验收需要模拟旧状态晚到、同一事件重复、删除后重放和 Schema 增加字段。最终 Doris 当前状态必须和源库快照一致。

7.2 Kafka 事件与日志

订单事件和应用日志通过 Routine Load 持续消费。监控 Job/Task 状态、Kafka Offset、Lag、错误率和目标表行数。坏数据达到阈值时,任务可能暂停,Runbook 要包含排查、隔离和恢复步骤。

7.3 文件与历史数据

订单明细通过 Stream Load,使用唯一 Label 保证重试幂等。远端历史文件先通过 TVF 预览和抽样,再 INSERT INTO ... SELECT。Lake Catalog 中的三年历史可以继续联邦查询,近 90 天热点回灌内部表。

7.4 文档和 Embedding

文档先切 Chunk,再生成 Embedding。写入时同时保存 content_hash 和模型版本。Embedding 失败、维度不一致、NaN、零向量或 Hash 不一致的记录进入隔离区。样例包中的 16 维向量由哈希算法生成,只验证工程链路,不能用来评价语义检索质量。

导入方案矩阵
导入方案矩阵


八、数据质量:技术成功、数据成功和业务成功三层验收

Stream Load 返回 SUCCESS,只说明本批事务达到技术状态。平台还要继续验证:

  1. 技术成功:事务 VISIBLE、Loaded Rows、Filtered Rows、Label、Offset;
  2. 数据成功:总量、主键、金额、状态、NULL、时间范围、删除;
  3. 业务成功:Dashboard 口径、订单状态、检索可见性、RAG 权限。

建议建立每日对账:

源库订单数 / 金额
Doris 当前状态表订单数 / 金额
订单明细聚合金额
事件最终状态
湖上历史边界

差异不能直接修表。先记录源批次、目标分区、影响范围、补数 SQL、审批人和回滚方法。补数完成后重新收集对账和 Profile 证据。

数据质量闭环
数据质量闭环


九、经营看板:Async MV、统计信息和 Profile

核心 Dashboard 按日期、租户、渠道和状态聚合。直接扫描订单事实表可以作为基线,再创建 mv_daily_sales 预计算订单量、GMV 和买家数。

Async MV 是最终一致性结构,刷新 SLA 要写入业务合同。项目示例设置 5 分钟调度和 60 秒 grace_period 作为实验起点,真实环境应根据数据新鲜度和刷新资源重新设计。

验收分四步:

  1. 运行基线 SQL,保存 Explain 和 Profile;
  2. 创建并刷新 MV;
  3. 再次 Explain,确认 Materialized View Rewrite;
  4. 在冷缓存、热缓存和 100 并发下比较 p95/p99、CPU、Scan Rows 和 Bytes。

统计信息必须在大批回灌、分区替换和数据分布明显变化后重新核验。优化器估算和 Profile 实际行数差距过大时,先修统计信息,再考虑 Hint。


十、订单 Point Query 与高并发 Serving

订单详情请求采用:

Unique Key MoW
→ Row Store
→ 完整主键等值条件
→ Short-Circuit
→ Prepared Statement
→ Row Cache

客户端开启服务端 Prepared Statement 和连接池缓存。查询模板固定为 tenant_id + order_id,避免查询缺少完整主键后退回普通扫描。

POC 需要依次比较普通路径、Row Store、Short-Circuit、Prepared Statement 和冷热 Row Cache。记录 QPS、p50/p95/p99、FE CPU、BE CPU、连接池等待和混合写入下的尾延迟。


十一、日志检索与可观测性分析

SRE 使用以下条件组合:

时间分区
+ service_name
+ level
+ trace_id
+ message MATCH
+ attrs 路径

倒排索引先得到候选 RowID,随后读取必要列。message 的 Analyzer 需要根据中英文、错误码、堆栈和服务名评测。错误码与 TraceID 更适合精确索引,自然语言消息使用 unicode/chinese 分词和短语支持。

检索结果还可以进入 OLAP 聚合:按服务、错误类型、版本和地区统计趋势。这样“找到异常”和“分析异常规模”处于同一条 SQL 链路。


十二、湖仓边界:实时热数据和长期历史共存

内部表负责近 90 天实时分析、更新、高并发和搜索;Hive/Iceberg/Hudi/Paimon 保存长期历史。统一查询使用 catalog.database.table

湖仓查询先验证分区、Manifest、文件和 Row Group 裁剪,再观察 Data Cache、Remote Read、对象存储延迟和 Shuffle。高频结果可以回灌内部表或建立 Async MV。JDBC Catalog 只访问小维表,避免大扫描压垮业务库。

湖仓冷热协同
湖仓冷热协同


十三、知识库 RAG:关键词、语义和权限同时生效

RAG 请求包含用户身份、租户、ACL、问题和 Query Embedding。检索分两路:

  • 倒排索引 + BM25 返回关键词 Top-N;
  • ANN 返回语义 Top-N。

RRF 使用排名融合,避免直接相加不同量纲的 BM25 分数和向量距离。最终结果再做文档去重、版本优先、来源权威度和邻接 Chunk 扩展。

整个过程要记录 retrieval_version、embedding_model、候选 ID、BM25 Rank、ANN Rank、RRF Rank 和最终 Chunk。Golden Query Set 同时测 Recall@K、MRR、NDCG@K、Zero-result Rate 和安全过滤。

RAG 与混合检索
RAG 与混合检索


十四、AI Functions 与数据加工

AI Functions 适合在 SQL 内执行分类、抽取、摘要、翻译、脱敏和跨行聚合。毕业项目可以选择以下轻量场景:

  • 对日志错误文本做类别抽取;
  • 对客服反馈做情感与原因分类;
  • 对一批告警生成摘要;
  • 使用 EMBED() 生成文档向量并持久化。

模型调用需要保存 Provider、Model、Prompt Version、Source Hash、Token、Latency 和 Result Status。对同一内容反复调用会增加成本,因此优先做增量处理和结果复用。Dashboard 在线查询不应逐行调用外部模型。


十五、Doris MCP Server:Agent 工具层

Doris MCP Server 1.0 把公共工具面组织为 8 个 Domain 和 55 个精确 Child Capability。Host 先发现 Domain,再获取 Child、Schema、Availability 和 manifest_version,最后发起受限调用。

Agent 请求链:

MCP Host
→ Domain Discovery
→ Child Call
→ Capability Gate
→ Query Guard
→ Request-specific Doris Identity
→ Doris RBAC / Row / Column
→ Result Envelope / Audit

毕业项目只开放查询、Catalog、Profile 和必要诊断能力。查询统一限制只读、60 秒、1000 行和 1MB。未授权 Child 隐藏,不可用能力返回 reason_code,过期 Manifest 触发重新发现。

Prompt Injection 样例会在知识文档中要求 Agent 读取全部手机号。系统必须依靠 Scope、Query Guard、Doris RBAC、ACL、结果上限和审计拒绝该请求,不能把 SQL 黑名单当作唯一防线。

MCP 请求链
MCP 请求链


登录后可阅读本文完整内容。