4. 自助目录架构总览:分层架构设计与核心组件

本章是整门课程的技术骨架。我们将从采集、处理、存储、目录、消费五个层面,拆解一个由可靠性评审驱动的 OpenTelemetry 自助目录系统。每一层都承担明确的职责,并通过标准化接口与上下游协作。理解分层架构,是后续设计评审规则、目录模型、自助 API 的基础。

架构设计原则: 每一层只做一件事,层间通过契约(Schema + API)解耦。采集层不关心数据如何消费,目录层不关心数据如何传输。这种隔离使得每一层都可以独立演进、独立扩缩容。

4.1 五层架构总览

自助目录架构采用经典的“采集 → 处理 → 存储 → 目录 → 消费”流水线模型。每一层内部包含若干核心组件,组件之间通过 OpenTelemetry 协议(OTLP)或内部 gRPC/HTTP 接口通信。

层级 核心职责 关键组件 输出产物
采集层 从各类数据源(应用、基础设施、第三方)收集遥测数据 OTel Collector、Instrumentation SDK、Receiver OTLP 格式的 Span/Metric/Log
处理层 数据清洗、采样、增强、路由、可靠性校验 Processor Pipeline、Batch Processor、Reliability Validator 清洗后的结构化遥测数据
存储层 持久化遥测数据与目录元数据 时序数据库、对象存储、元数据库 可查询的存储记录
目录层 管理数据资产目录、Schema 注册、血缘关系 Catalog Service、Schema Registry、Lineage Engine 目录索引、Schema 定义、血缘图
消费层 提供查询、可视化、告警、自助 API Query Service、Dashboard、Alert Manager、Self-Service API API 响应、图表、告警通知

下图展示了五层架构的整体拓扑与数据流向。注意,目录层并非数据流的终点,而是作为元数据中枢,为消费层提供数据发现与 Schema 校验能力。

自助目录五层架构总览 采集层 OTel Collector · Instrumentation SDK · Receiver 处理层 Processor Pipeline · Batch Processor · Reliability Validator 存储层 时序数据库 · 对象存储 · 元数据库 目录层 Catalog Service · Schema Registry · Lineage Engine 消费层 Query Service · Dashboard · Alert Manager · Self-Service API

4.2 采集层:数据入口的标准化

采集层是遥测数据的第一个接触点。它必须解决三个核心问题:数据源多样性、协议标准化、低开销采集。

  • OTel Collector:作为统一网关,接收来自各种 SDK 和 exporter 的数据。支持 receiver(接收)、processor(处理)、exporter(导出)三种组件。
  • Instrumentation SDK:嵌入应用代码,自动或手动生成 Span、Metric、Log。推荐使用自动注入(Java Agent、Python SDK)减少侵入。
  • Receiver 适配器:将非 OTLP 协议(如 Prometheus Remote Write、Zipkin、Jaeger)转换为内部统一格式。
可靠性评审要点: 采集层必须配置背压(Backpressure)机制。当处理层或存储层出现瓶颈时,采集层应主动降级采样率或丢弃低优先级数据,避免 OOM 或链路阻塞。评审时需检查 Collector 的 memory_limiter 和 batch 处理器配置。

4.3 处理层:数据清洗与可靠性校验

处理层是架构中最复杂的环节。它不仅要完成数据格式转换、采样、属性增强,还要执行可靠性校验——这是本课程的核心创新点。

处理器类型 功能 可靠性相关
Batch Processor 合并小数据包,减少存储写入次数 防止写入风暴
Attributes Processor 添加、删除、修改 Span/Metric 属性 确保必填字段存在
Sampling Processor 基于规则或概率采样 保证关键链路不丢失
Reliability Validator 校验数据完整性、Schema 合规性、血缘连续性 核心:拒绝脏数据进入目录

Reliability Validator 是处理层的“守门员”。它根据目录层下发的 Schema 规则,逐条校验遥测数据:

  • Span 是否包含 trace_id、span_id、parent_span_id?
  • Metric 的 label 是否与注册的 Schema 一致?
  • Log 的 severity 字段是否在允许范围内?

校验失败的数据会被路由到死信队列(Dead Letter Queue),并触发告警。这种设计防止了脏数据污染目录层和存储层。

4.4 存储层:时序数据与元数据分离

存储层采用混合存储架构:时序数据库(如 VictoriaMetrics、ClickHouse)存储高吞吐的遥测数据;对象存储(如 S3、MinIO)存储原始日志和长周期归档;元数据库(如 PostgreSQL、TiDB)存储目录元数据。

存储层混合架构 处理层输出 时序数据库 Span / Metric 元数据库 目录 / Schema 对象存储 原始日志 / 归档

这种分离设计带来三个好处:

  1. 性能隔离:时序数据库专注于高写入吞吐,元数据库专注于强一致性查询。
  2. 成本优化:原始日志和低频数据存入对象存储,降低热存储成本。
  3. 目录独立性:目录层只依赖元数据库,不直接访问时序数据,避免查询放大。

4.5 目录层:数据资产的中枢

目录层是自助目录架构的“大脑”。它管理三类核心信息:

  • 数据资产目录:记录每个数据源、服务、接口的元信息(名称、版本、负责人、标签)。
  • Schema 注册表:存储每个数据资产的字段定义、类型、约束、可靠性规则。
  • 血缘关系:记录数据从采集到消费的完整链路,包括上下游依赖、转换逻辑。

目录层通过 gRPC 接口向处理层提供 Schema 校验规则,向消费层提供数据发现和血缘查询能力。它是可靠性评审的“规则下发中心”。

常见陷阱: 目录层不应直接存储遥测数据。如果目录层承担了查询时序数据的职责,会导致元数据库压力过大,影响目录服务的可用性。目录层只存“数据的描述”,不存“数据本身”。

4.6 消费层:自助能力的外化

消费层面向最终用户(SRE、开发、运维)提供四种能力:

能力 接口形式 典型场景
数据查询 REST / GraphQL 查询某服务过去 1 小时的 P99 延迟
可视化 Grafana / 自定义 Dashboard 展示服务拓扑与调用链火焰图
告警 Alert Manager + Webhook 当错误率超过阈值时通知 On-Call
自助 API gRPC / REST 开发者自助注册新数据源、更新 Schema、查询血缘

自助 API 是消费层的核心。它允许用户不经过人工审批,直接通过 API 完成数据资产注册、Schema 更新、可靠性规则配置。这些操作会触发目录层的版本变更,并同步到处理层的 Reliability Validator。

4.7 层间契约与数据流

五层架构的稳定性依赖于清晰的层间契约。我们定义了三种契约类型:

  • 数据契约:OTLP 协议 + Protobuf Schema。采集层到处理层、处理层到存储层均使用 OTLP。
  • 元数据契约:目录层定义的 Schema 注册表格式。处理层通过 gRPC 拉取校验规则。
  • 查询契约:消费层与存储层之间的查询语言(PromQL、SQL、TraceQL)。

任何层间接口变更都必须经过可靠性评审,确保向后兼容。这是本课程后续章节会深入展开的评审流程。

架构决策记录(ADR): 为什么选择 OTLP 作为统一数据契约?因为 OTLP 天然支持 Span、Metric、Log 三种信号,且具备良好的扩展性(通过 InstrumentationScope 和 Resource 属性)。这避免了为每种信号维护独立协议的复杂性。