实时数仓全链路架构设计
一、技术栈选型
| 层级 | 组件选型 |
|---|---|
| 数据采集 | Kafka 3.7 + Flume 1.11 |
| 实时计算 | Flink 1.17(Exactly-Once语义) |
| 存储引擎 | OpenGemini 1.1(时序数据) Doris 2.0(宽表) PostgreSQL 15(事务层) |
| 数据服务 | Spring Boot 3.2 + Redis 7.0 |
| 监控预警 | Prometheus 2.47 + AlertManager 0.27 + Grafana 10.3 |
二、全链路架构设计
1. 逻辑架构图
graph TD
subgraph 数据源层
A[IoT设备] --> B[Flume采集集群]
C[应用日志] --> D[Kafka生产者]
end
subgraph 数据流0层-接入层
B --> E[Kafka Topic: raw_events]
D --> E
end
subgraph 数据流1层-处理层
E --> F[Flink实时清洗]
F -->|DWD| G[OpenGemini]
F -->|DWS| H[Doris]
end
subgraph 数据流2层-服务层
G --> I[Spring Boot API]
H --> I
I --> J[Grafana大屏]
I --> K[决策系统]
end
subgraph 监控层
J --> L[Prometheus]
K --> L
L --> M[AlertManager]
end
2. 物理部署图
graph TD
subgraph 物理节点集群
N1[Kafka Node x5] -->|生产数据| N2[Flink JobManager x3]
N2 -->|任务分发| N3[Flink TaskManager x10]
N3 -->|写存储| N4[OpenGemini Cluster]
N3 -->|写存储| N5[Doris Cluster]
N5 -->|API调用| N6[Spring Boot服务节点 x4]
end
3. 开发视图(UML组件图)
classDiagram
class FlumeAgent {
+collectData()
+pushToKafka()
}
class FlinkJob {
+sourceFromKafka()
+cleanData()
+windowAggregate()
}
class OpenGemini {
+writeTimeSeries()
+queryContinuousAgg()
}
class Doris {
+createMaterializedView()
+queryOLAP()
}
FlumeAgent --> FlinkJob : 原始数据流
FlinkJob --> OpenGemini : DWD清洗结果
FlinkJob --> Doris : DWS聚合结果
三、数据流分层设计
1. 数据流0层(原始接入层)
flowchart LR
A[设备传感器] --> B[Flume Agent]
B --> C{Kafka Topic分区}
C -->|Partition 1| D[Broker 1]
C -->|Partition 2| E[Broker 2]
C -->|Partition N| F[Broker N]
G[应用服务] --> C
技术要点:
- Kafka Topic按设备ID哈希分区,保证相同设备数据顺序性
- Flume拦截器实现数据脱敏和格式校验
2. 数据流1层(实时处理层)
flowchart LR
A[Kafka Topic] --> B[Flink Source]
B --> C{数据处理逻辑}
C -->|DWD清洗| D[(OpenGemini)]
C -->|DWS聚合| E[(Doris)]
D --> F[连续聚合物化视图]
E --> G[预计算宽表]
关键实现:
// Flink窗口聚合逻辑
stream
.keyBy(device -> device.getRegion())
.window(TumblingEventTimeWindows.of(Time.minutes(5)))
.aggregate(new AverageTempAggregate())
.addSink(new DorisSink());
3. 数据流2层(服务应用层)
flowchart LR
A[OpenGemini] --> B{Spring Boot API}
C[Doris] --> B
B --> D[Redis缓存]
D --> E[Grafana渲染]
D --> F[决策系统调用]
优化设计:
- Redis缓存热点数据,减少对存储层直接访问
- API响应添加ETag实现客户端缓存
四、实施资源规划
| 资源类型 | 配置详情 |
|---|---|
| 硬件资源 | - Kafka集群:5节点(16C/64G/2TB NVMe * 2 RAID0) - Flink集群:3 JobManager + 10 TaskManager(32C/128G/1TB SSD) |
| 网络要求 | - 万兆内网互通,Kafka与Flink间延迟 <1ms |
| 依赖服务 | - Zookeeper 3.8集群(3节点) - OpenGemini元数据集群(3节点) |
五、测试方案
1. 功能测试用例
| 测试项 | 测试方法 | 预期结果 |
|---|---|---|
| 数据完整性 | 注入10万条标记数据,验证端到端一致性 | 丢失率 <0.001% |
| 窗口计算准确性 | 构造跨窗口事件验证聚合结果 | 窗口包含所有符合条件事件 |
| 故障恢复能力 | 随机终止Flink TaskManager并观察恢复 | 60秒内自动重启并恢复处理 |
2. 压力测试场景
| 压测类型 | 参数配置 | 成功标准 |
|---|---|---|
| 峰值写入测试 | 100万设备 × 100 msg/s持续30分钟 | Kafka吞吐 ≥80万 msg/s |
| 高并发查询 | 5000并发查询时序数据 | OpenGemini P99 ≤800ms |
| 混合负载测试 | 50%写入负载 + 50%复杂查询 | 系统无雪崩,资源利用率 <85% |
3. 监控验证指标
pie
title 监控覆盖率
"数据完整性监控" : 35
"计算延迟监控" : 25
"资源利用率监控" : 20
"服务健康度监控" : 20
架构交付物
- 部署手册:包括Ansible脚本和K8s Helm Chart
- 监控看板模板:Grafana Dashboard JSON文件
- 压测报告模板:JMeter测试计划 + 结果分析
- 容灾方案:节点故障切换SOP文档
总结
通过分层架构实现高内聚低耦合,结合Flink+OpenGemini+Doris构建高效实时分析能力,满足P99稳定性要求,并通过全链路监控保障系统可靠性。