解读广告数仓(二)数据架构与关键系统设计

目录

  1. 系统整体架构
  2. 核心技术选型
  3. 广告数据模型
  4. 数据管道与ETL
  5. 实时计算引擎
  6. 数据存储策略

系统整体架构

1.1 分层架构设计

scss 复制代码
┌──────────────────────────────────────────────────────────────┐
│                    数据消费层 (BI/应用)                        │
├──────────┬──────────────┬──────────────┬──────────────────────┤
│ 实时看板 │  离线报表    │   API服务    │   自动化决策        │
│ (秒级)   │  (天级)      │  (毫秒级)    │  (自主优化)         │
└──────────┴──────────────┴──────────────┴──────────────────────┘
                              ↑
┌──────────────────────────────────────────────────────────────┐
│                  数据应用层 (ADS - Analysis Data Store)        │
├─────────────────┬──────────────────┬──────────────────────────┤
│ 广告效果汇总    │   用户行为分析   │  算法模型输入特征      │
│ • 渠道汇总表    │ • 用户转化漏斗   │ • 用户embedding       │
│ • 日报表        │ • 用户群体分布   │ • 特征工程输出        │
│ • 成本控制表    │ • 留存分析       │ • 模型预测结果        │
└─────────────────┴──────────────────┴──────────────────────────┘
                              ↑
┌──────────────────────────────────────────────────────────────┐
│              数据仓库层 (DWD/DWS/ODS) - Doris引擎             │
├────────────────┬──────────────────┬──────────────────────────┤
│ ODS原始层      │ DWD明细层        │ DWS汇总层              │
│ • raw_impr     │ • fact_impression │ • daily_channel_stat   │
│ • raw_click    │ • fact_click      │ • hourly_platform_stat │
│ • raw_conv     │ • fact_conversion │ • user_conversion_path │
└────────────────┴──────────────────┴──────────────────────────┘
                              ↑
┌──────────────────────────────────────────────────────────────┐
│               数据集成层 (Kafka + Flink + Paimon)             │
├────────────────┬──────────────────┬──────────────────────────┤
│ Kafka消息队列  │ Flink流处理      │ Paimon数据湖           │
│ • impr_topic   │ • 实时清洗       │ • 湖表一体             │
│ • click_topic  │ • 实时去重       │ • 版本控制             │
│ • conv_topic   │ • 实时转化追踪   │ • 时间旅行             │
└────────────────┴──────────────────┴──────────────────────────┘
                              ↑
┌──────────────────────────────────────────────────────────────┐
│                     数据采集层 (Data Source)                  │
├────────────┬──────────────┬──────────────┬──────────────────┤
│ API接口    │ SDK埋点      │ 日志上报     │ 第三方工具      │
│ • 百度API  │ • 自有App    │ • 服务器日志 │ • Mixpanel     │
│ • 抖音API  │ • Web埋点    │ • CDN日志    │ • Google       │
│ • 快手API  │ • 跨域追踪   │ • 数据库DML  │ • 数据交换平台 │
└────────────┴──────────────┴──────────────┴──────────────────┘
                              ↑
┌──────────────────────────────────────────────────────────────┐
│              业务系统与数据源 (多平台/多渠道)                  │
├──────────────────────────────────────────────────────────────┤
│ 搜索广告    信息流      展示       视频       电商       社交  │
│ (百度)      (抖快小红) (网站)     (优爱腾)   (淘抖)     (微博)│
└──────────────────────────────────────────────────────────────┘

1.2 分层的数据特性

makefile 复制代码
┌────────────────────────────────────────────────────────────┐
│           各层级的数据量级、延迟、维度对比                 │
├─────────────┬──────────┬──────────┬────────┬──────────────┤
│ 层级        │ 数据量   │ 延迟     │ 维度数 │ 更新频率     │
├─────────────┼──────────┼──────────┼────────┼──────────────┤
│ 采集层      │ 百亿级   │ 秒级     │ 100+   │ 实时         │
│ 集成层      │ 十亿级   │ 分钟级   │ 80     │ 1-5分钟      │
│ DWD/ODS     │ 亿级     │ 小时级   │ 60     │ 小时级       │
│ DWS/聚合    │ 千万级   │ 分钟级   │ 40     │ 5分钟-1小时  │
│ ADS/应用    │ 百万级   │ 秒级     │ 20     │ 实时-小时    │
└─────────────┴──────────┴──────────┴────────┴──────────────┘

数据流向特点:
├─ 采集→集成: 原始数据尽快进入系统, 支持高吞吐量
├─ 集成→仓库: 数据清洗、去重、标准化, 时间可以延迟到小时级
├─ 仓库→应用: 生成应用表、实时更新, 支持秒级查询
└─ 应用→消费: 直接查询应用表, 毫秒级响应时间

核心技术选型

2.1 为什么选择 Doris 作为数据仓库

markdown 复制代码
对标方案对比:

指标              Doris          ClickHouse       Presto         Snowflake
─────────────────────────────────────────────────────────────────────────
部署方式        开源/自建        开源/自建        开源/自建        SaaS(付费)
实时更新        ✅ 支持(高效)    ⚠️ 较差          ❌ 不支持         ✅ 可以
并发查询        ✅ >1000 QPS     ⚠️ 200 QPS       ❌ <50 QPS       ✅ 支持
多维分析        ✅ Bitmap索引    ⚠️ Array类型    ✅ 支持          ✅ 支持
学习成本        ✅ MySQL兼容     ⚠️ 新语言        ⚠️ ANSI SQL     ⚠️ SQL+组件
成本            ✅ 开源免费      ✅ 开源免费      ✅ 开源免费      ❌ 昂贵
集群管理        ⚠️ 中等复杂      ⚠️ 复杂          ❌ 很复杂        ✅ 托管
性能/成本比     ⭐⭐⭐⭐⭐      ⭐⭐⭐⭐       ⭐⭐⭐         ⭐⭐⭐⭐
─────────────────────────────────────────────────────────────────────────

Doris适合广告数仓的理由:
1. 实时性: 广告数据需要分钟级更新, Doris支持高效的实时导入
2. 高并发: 多用户查询同一个看板, 需要支持高并发
3. 成本: 开源免费, 中等企业也能承受
4. 易用性: MySQL兼容, 原有SQL经验可直接上手
5. 性能: 列式存储, 广告数据通常只需要查询部分列
markdown 复制代码
流处理框架对比:

特性            Flink          Spark Streaming   Kafka Streams
────────────────────────────────────────────────────────────────
延迟            亚秒级(毫秒)    秒级(批处理)      毫秒级
状态管理        强大(RocksDB)   有限            有限
窗口支持        丰富           一般            基础
CheckPoint      强一致性         弱              弱
学习成本        中等           中等            低
社区活跃度      非常活跃        活跃            活跃
复杂计算        ✅ 支持         ✅ 支持         ❌ 不支持
───────────────────────────────────────────────────────────────

Flink适合广告数仓的理由:
1. 低延迟: 实时竞价需要毫秒级反馈
2. 复杂逻辑: 转化追踪、去重等需要复杂的状态管理
3. 准确性: 恰好一次(Exactly Once)语义保证数据准确
4. 灵活性: 支持多种窗口类型, 适应不同计算需求

2.3 完整的技术栈

yaml 复制代码
┌──────────────────────────────────────────────────────────────┐
│ 广告数仓技术栈 (Production-Ready)                             │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│ 数据存储层:                                                   │
│ ├─ Doris (OLAP数据库): 实时OLAP分析查询                      │
│ ├─ Paimon (数据湖): 可选, 用于长期数据存档                   │
│ ├─ HDFS/S3: 原始日志备份与归档                                │
│ └─ Redis/Memcached: 热数据缓存加速                            │
│                                                              │
│ 流处理层:                                                     │
│ ├─ Kafka: 实时数据流传输 (消息队列)                          │
│ ├─ Flink: 实时流处理引擎 (数据清洗、去重、转化追踪)         │
│ ├─ Spark: 可选, 用于复杂的批处理任务                         │
│ └─ Airflow/DolphinScheduler: 任务调度与工作流管理            │
│                                                              │
│ 数据集成:                                                     │
│ ├─ Datax/Seamless: 从源系统抽数到Kafka                       │
│ ├─ Python/Java SDK: 埋点数据的客户端SDK                      │
│ ├─ Filebeat/Logstash: 日志采集                               │
│ └─ 自研API中间件: 各平台API调用与数据转换                    │
│                                                              │
│ 监控与管理:                                                   │
│ ├─ Prometheus: 系统监控 (CPU、内存、网络)                    │
│ ├─ Grafana: 监控可视化                                        │
│ ├─ ELK Stack: 日志聚合与分析                                  │
│ ├─ Alertmanager: 告警管理                                     │
│ └─ 自研管理平台: 数据质量、血缘关系、权限管理                │
│                                                              │
│ 分析工具:                                                     │
│ ├─ Doris SQL: 直接SQL查询                                     │
│ ├─ Tableau/Metabase: BI工具与可视化                          │
│ ├─ Jupyter/Zeppelin: 数据分析笔记本                           │
│ └─ Python/R: 统计分析与机器学习                               │
│                                                              │
│ 机器学习:                                                     │
│ ├─ TensorFlow/PyTorch: 模型训练                               │
│ ├─ XGBoost/LightGBM: 树模型                                   │
│ ├─ scikit-learn: 传统机器学习                                 │
│ └─ 模型服务: TensorFlow Serving/TorchServe                    │
│                                                              │
└──────────────────────────────────────────────────────────────┘

广告数据模型

3.1 维度与事实表设计

sql 复制代码
核心事实表:

1. 展示事实表 (fact_impression)
   列名                  类型        维度        说明
   ────────────────────────────────────────────────────
   impr_id              STRING      无          展示唯一ID
   timestamp            DATETIME    时间维度    展示时间
   advertiser_id        INT         广告主维度  广告主ID
   campaign_id          INT         活动维度    活动ID
   adgroup_id           INT         广告组维度  广告组ID
   creative_id          INT         创意维度    创意ID
   user_id              STRING      用户维度    用户ID (UDID)
   device_type          STRING      设备维度    设备类型
   platform_id          INT         平台维度    平台ID
   region_id            INT         地域维度    地域ID
   cost                 DECIMAL     无          展示成本
   event_time           DATETIME    无          事件时间戳
   
   聚合方式: 按(impr_id, user_id, device_type)去重

2. 点击事实表 (fact_click)
   列名                  类型        维度
   ───────────────────────────────────────
   click_id             STRING      无
   impr_id              STRING      无
   timestamp            DATETIME    时间
   advertiser_id        INT         广告主
   campaign_id          INT         活动
   user_id              STRING      用户
   device_type          STRING      设备
   platform_id          INT         平台
   cost                 DECIMAL     无
   click_url            STRING      无 (跳转链接)
   
   关键: 通过impr_id与fact_impression关联

3. 转化事实表 (fact_conversion)
   列名                  类型        维度
   ───────────────────────────────────────
   conv_id              STRING      无
   click_id             STRING      无
   impr_id              STRING      无
   user_id              STRING      用户
   advertiser_id        INT         广告主
   campaign_id          INT         活动
   conversion_type      STRING      转化类型
                                   (register/purchase/download/view)
   conversion_value     DECIMAL     转化价值
   conversion_time      DATETIME    转化时间
   conversion_lag_hour  INT         转化延迟(小时)
   
   关键: 支持延迟转化(最长支持90天回归)

4. 维度表 (dimension_*)
   
   维度表: dim_advertiser
   ├─ advertiser_id (PK)
   ├─ advertiser_name
   ├─ industry
   ├─ budget
   ├─ status
   └─ created_date
   
   维度表: dim_campaign
   ├─ campaign_id (PK)
   ├─ advertiser_id (FK)
   ├─ campaign_name
   ├─ objective (awareness/conversion/...)
   ├─ budget
   ├─ start_date
   ├─ end_date
   └─ status
   
   维度表: dim_platform
   ├─ platform_id (PK)
   ├─ platform_name (百度/抖音/快手/...)
   ├─ platform_type (search/feed/display/...)
   ├─ api_available
   └─ data_latency_hour
   
   维度表: dim_user
   ├─ user_id (PK)
   ├─ device_id
   ├─ device_type
   ├─ os_type
   ├─ region
   ├─ age_group (可选, 隐私考虑)
   ├─ interest_tag (可选)
   └─ first_seen_date

3.2 Doris表的建表语句示例

sql 复制代码
-- 展示事实表 (fact_impression)
CREATE TABLE fact_impression (
    impr_id STRING,
    timestamp DATETIME,
    advertiser_id INT,
    campaign_id INT,
    adgroup_id INT,
    creative_id INT,
    user_id STRING,
    device_type STRING,
    platform_id INT,
    region_id INT,
    cost DECIMAL(10, 4),
    event_time DATETIME
)
DUPLICATE KEY (impr_id, user_id, device_type)
PARTITION BY RANGE (timestamp) (
    PARTITION p_20250101 VALUES LESS THAN ("2025-01-02"),
    PARTITION p_20250102 VALUES LESS THAN ("2025-01-03")
)
DISTRIBUTED BY HASH (impr_id) BUCKETS 256
PROPERTIES (
    "replication_num" = "3",
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.start" = "-30",
    "dynamic_partition.end" = "1",
    "dynamic_partition.prefix" = "p_",
    "dynamic_partition.buckets" = "256"
);

-- 点击事实表 (fact_click)
CREATE TABLE fact_click (
    click_id STRING,
    impr_id STRING,
    timestamp DATETIME,
    advertiser_id INT,
    campaign_id INT,
    user_id STRING,
    device_type STRING,
    platform_id INT,
    cost DECIMAL(10, 4),
    click_url STRING
)
UNIQUE KEY (click_id)
PARTITION BY RANGE (timestamp) (...)
DISTRIBUTED BY HASH (click_id) BUCKETS 256;

-- 转化事实表 (fact_conversion)
CREATE TABLE fact_conversion (
    conv_id STRING,
    click_id STRING,
    impr_id STRING,
    user_id STRING,
    advertiser_id INT,
    campaign_id INT,
    conversion_type STRING,
    conversion_value DECIMAL(10, 2),
    conversion_time DATETIME,
    conversion_lag_hour INT
)
UNIQUE KEY (conv_id)
PARTITION BY RANGE (conversion_time)
DISTRIBUTED BY HASH (conv_id) BUCKETS 256;

-- 广告主维度表
CREATE TABLE dim_advertiser (
    advertiser_id INT,
    advertiser_name STRING,
    industry STRING,
    budget DECIMAL(12, 2),
    status STRING,
    created_date DATE
)
DUPLICATE KEY (advertiser_id)
DISTRIBUTED BY HASH (advertiser_id) BUCKETS 64;

数据管道与ETL

4.1 多源数据采集方案

markdown 复制代码
数据源分类与采集方案:

1. 平台官方API (推荐优先级最高)
   └─ 百度/抖音/快手等官方API
   └─ 频率: 每小时/每天拉取一次
   └─ 延迟: 4-24小时
   └─ 准确性: 最高
   └─ 实现: Python脚本或Java应用 + Kafka

2. 自有埋点SDK (推荐优先级次高)
   └─ 在自有App/Web上埋点
   └─ 频率: 实时
   └─ 延迟: 秒级
   └─ 准确性: 高
   └─ 实现: 客户端SDK + 服务器收集 + Kafka

3. 第三方转化追踪工具
   └─ Mixpanel/AppsFlyer/Adjust等
   └─ 频率: 实时
   └─ 延迟: 秒-分钟级
   └─ 准确性: 高(通常)
   └─ 实现: 第三方Webhook + Kafka

4. 日志系统
   └─ 服务器日志、CDN日志等
   └─ 频率: 实时/分钟级
   └─ 延迟: 秒-分钟级
   └─ 准确性: 中
   └─ 实现: Filebeat + Logstash + Kafka

5. 数据交换与合作伙伴
   └─ 与其他平台的数据共享
   └─ 频率: 日级/周级
   └─ 延迟: 小时级
   └─ 准确性: 中
   └─ 实现: 文件传输 + ETL导入

4.2 ETL流程设计

sql 复制代码
完整的ETL流程:

┌─────────────────────────────────────────────────────────┐
│ 第1步: 数据采集 (Extract)                               │
├─────────────────────────────────────────────────────────┤
│ • 从各个数据源获取原始数据                              │
│ • 推送到Kafka的raw_impr/raw_click/raw_conv topics      │
│ • 保留原始格式, 便于问题回溯                            │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│ 第2步: 数据清洗与标准化 (Transform - Flink)            │
├─────────────────────────────────────────────────────────┤
│ • 字段校验 (必填字段、数据类型)                         │
│ • 格式转换 (时间戳标准化、字符编码)                     │
│ • 去重 (按event_id/impr_id)                             │
│ • 异常值处理 (成本为负值、时间错误等)                   │
│ • 维度补全 (user_id补全、地域编码等)                    │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│ 第3步: 转化追踪与关联 (Advanced Transform - Flink)     │
├─────────────────────────────────────────────────────────┤
│ • 展示→点击关联 (通过impr_id)                           │
│ • 点击→转化关联 (通过click_id, 支持延迟90天)          │
│ • 归因分析 (first-touch/last-touch/linear等)           │
│ • 用户旅程构建 (展示→点击→转化的完整链路)              │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│ 第4步: 数据导入 (Load - Doris)                         │
├─────────────────────────────────────────────────────────┤
│ • 批量导入到Doris ODS层 (原始数据表)                    │
│ • 支持秒级/分钟级导入                                   │
│ • 处理重复记录 (UPDATE或INSERT IGNORE)                  │
│ • 验证导入完整性                                        │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│ 第5步: 数据汇总与计算 (Aggregate - Doris SQL)         │
├─────────────────────────────────────────────────────────┤
│ • ODS → DWD (明细数据清洗)                              │
│ • DWD → DWS (按维度汇总)                                │
│ • 计算关键指标:                                         │
│   ├─ 展示数、点击数、点击率                              │
│   ├─ 转化数、转化率、转化成本                            │
│   ├─ ROI、毛利率、预算消耗                               │
│   └─ 按时间、维度、平台等多维度                         │
└─────────────────────────────────────────────────────────┘
                        ↓
┌─────────────────────────────────────────────────────────┐
│ 第6步: 数据应用 (Application)                          │
├─────────────────────────────────────────────────────────┤
│ • DWS → ADS (生成应用表)                                │
│ • 实时看板 (秒级更新)                                   │
│ • 离线报表 (日级/周级)                                  │
│ • API服务 (毫秒级查询)                                  │
│ • 自动化决策 (竞价、预算分配等)                         │
└─────────────────────────────────────────────────────────┘

实时计算引擎

5.1 Flink实时处理架构

arduino 复制代码
Flink作业拓扑 (Streaming Topology):

┌──────────────────────────────────────────────────────────┐
│ Kafka Source (multiple topics)                          │
│ ├─ raw_impression_topic                                │
│ ├─ raw_click_topic                                      │
│ └─ raw_conversion_topic                                 │
└──────────────────────────────────────────────────────────┘
                        ↓
┌──────────────────────────────────────────────────────────┐
│ 数据清洗与标准化 (Stateless Operators)                   │
│ • 解析JSON, 字段校验                                     │
│ • 格式转换 (时间戳、坐标等)                              │
│ • 异常值过滤                                             │
└──────────────────────────────────────────────────────────┘
                        ↓
┌──────────────────────────────────────────────────────────┐
│ 分流处理 (Stream Branching)                              │
├──────────────────────────────────────────────────────────┤
│ ├─ 展示流 (Impression Stream)                           │
│ │  ├─ 去重 (按impr_id)                                 │
│ │  ├─ 维度补全                                          │
│ │  └─ 输出到clean_impression_topic                     │
│ │                                                       │
│ ├─ 点击流 (Click Stream)                                │
│ │  ├─ 去重 (按click_id)                                │
│ │  ├─ 与展示关联 (impr_id lookup)                      │
│ │  └─ 输出到clean_click_topic                          │
│ │                                                       │
│ └─ 转化流 (Conversion Stream)                            │
│    ├─ 去重 (按conv_id)                                 │
│    ├─ 延迟转化处理 (最长90天)                           │
│    ├─ 与点击关联 (click_id lookup)                     │
│    ├─ 归因计算 (first-touch/multi-touch)              │
│    └─ 输出到clean_conversion_topic                     │
│                                                       │
└──────────────────────────────────────────────────────────┘
                        ↓
┌──────────────────────────────────────────────────────────┐
│ 窗口聚合与实时指标 (Windowed Aggregation)                │
│ • 滚动窗口: 1小时、1天                                   │
│ • 滑动窗口: 5分钟滑动                                    │
│ • Session窗口: 用户会话分析                              │
└──────────────────────────────────────────────────────────┘
                        ↓
┌──────────────────────────────────────────────────────────┐
│ Sink到Doris (Doris Sink Connector)                      │
│ • 写入到ODS层原始表                                      │
│ • 批量写入优化吞吐量                                     │
│ • 支持EXACTLY_ONCE语义                                   │
│ • 自动失败重试与超时处理                                 │
└──────────────────────────────────────────────────────────┘

5.2 关键Flink作业代码示例

java 复制代码
// 伪代码示例: Flink展示数据清洗与导入

public class ImpressionProcessingJob {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = 
            StreamExecutionEnvironment.getExecutionEnvironment();
        
        // Source: Kafka
        DataStream<String> kafkaSource = env
            .addSource(new FlinkKafkaConsumer<>(
                "raw_impression_topic",
                new SimpleStringSchema(),
                kafkaProps
            ))
            .name("KafkaSource_Impression");
        
        // Transform: 解析和清洗
        DataStream<ImpressionRecord> cleanedStream = kafkaSource
            .flatMap(new ImpressionParser())
            .name("Parser")
            .filter(new ImpressionValidator())
            .name("Validator")
            .map(new ImpressionEnricher())  // 补全维度
            .name("Enricher");
        
        // Dedup: 按impr_id去重 (使用State)
        DataStream<ImpressionRecord> dedupStream = cleanedStream
            .keyBy(ImpressionRecord::getImprId)
            .flatMap(new DeduplicationOperator(
                stateTTL = 3600  // 1小时
            ))
            .name("Deduplication");
        
        // Sink to Doris
        dedupStream
            .sinkTo(new DorisSink<>(
                URL = "doris-fe:8030",
                database = "adtech_dwh",
                table = "fact_impression",
                batchSize = 10000,
                flushInterval = 5000  // 5秒
            ))
            .name("DorisSink_Impression");
        
        env.execute("ImpressionProcessingJob");
    }
}

// 关键类定义
class ImpressionRecord {
    String imprId;
    Long timestamp;
    Integer advertiserId;
    Integer campaignId;
    String userId;
    String deviceType;
    Integer platformId;
    BigDecimal cost;
    
    // getters/setters...
}

数据存储策略

6.1 Doris表优化策略

sql 复制代码
存储优化:

1. 分区策略 (Partition)
   ├─ 时间分区: 按日期分区, 便于删除过期数据
   ├─ 动态分区: 自动创建新分区, 无需手工维护
   ├─ 分区保留: 通常保留30天热数据, 90天总数据(可配置)
   └─ 示例:
      PARTITION BY RANGE(timestamp) (
          PARTITION p_20250101 VALUES LESS THAN ("2025-01-02"),
          PARTITION p_20250102 VALUES LESS THAN ("2025-01-03")
      )

2. 分桶策略 (Bucket/Distribution)
   ├─ 分桶键: 选择查询最常见的过滤条件
   ├─ 分桶数: 根据数据量确定, 通常256-512个桶
   ├─ 好处: 并行查询, 提升性能
   └─ 示例:
      DISTRIBUTED BY HASH(advertiser_id, timestamp) BUCKETS 256

3. 副本策略 (Replication)
   ├─ 副本数: 3副本保证高可用
   ├─ 引擎: 使用UNIQUE KEY模型, 支持更新
   └─ 冗余度: 成本/可靠性权衡

4. 索引优化
   ├─ Bitmap索引: 用于低基数列 (platform_id, device_type等)
   ├─ 前缀索引: 用于WHERE条件频繁的列
   ├─ 存储格式: V2格式提升读性能
   └─ 示例:
      ALTER TABLE fact_impression 
      ADD INDEX idx_advertiser(advertiser_id) USING BITMAP;

5. 列式存储优化
   ├─ 选择列数据类型: INT<BIGINT<DECIMAL<STRING
   ├─ 避免NULL值: 使用默认值替代
   ├─ 字符串压缩: 使用DICTIONARY类型
   └─ 数值精度: 使用DECIMAL(10,2)而不是DECIMAL(18,4)

6. 磁盘与内存权衡
   ├─ 热表: 高频查询表使用高性能磁盘SSD
   ├─ 温表: 中频表使用普通HDD
   ├─ 冷表: 低频表压缩存储或归档
   └─ 缓存: 常用查询结果缓存到Redis

6.2 成本控制与扩展计划

ini 复制代码
存储成本估算:

日数据生成量估算:
├─ 展示数: 5亿条 / 日
│  ├─ 平均大小: 0.5KB / 条
│  └─ 日成本: 500GB
├─ 点击数: 5000万条 / 日
│  ├─ 平均大小: 0.8KB / 条
│  └─ 日成本: 40GB
├─ 转化数: 500万条 / 日
│  ├─ 平均大小: 1.0KB / 条
│  └─ 日成本: 5GB
└─ 合计: ~550GB / 日

存储总成本:
├─ 30天热数据: 550GB × 30 = 16.5TB (3副本 = 50TB物理)
├─ 90天全数据: 550GB × 90 = 50TB (3副本 = 150TB物理)
├─ 硬件成本: 约¥20-30万 (中等规模)
└─ 年度运维: 约¥5-10万

可选成本优化:
├─ 压缩: 启用ZSTD压缩, 减少40-50%存储
├─ 分层存储: 冷表迁移到Paimon/S3, 节省50%成本
├─ 数据采样: 非关键维度采样存储, 节省20-30%
└─ 定期清理: 清理冗余/过期数据

总结

架构设计实现了:

  • 实时性: 秒级数据延迟, 分钟级指标更新
  • 可靠性: 3副本Doris集群, 99.9%可用性
  • 可扩展性: 支持从日5亿条到50亿条的增长
  • 成本优化: 开源技术栈, 合理的存储分层
  • 易用性: MySQL兼容的Doris, 学习成本低

下一阶段将详细描述:

  • 03: 部署与基础设施方案
  • 04: 指标计算与应用方案
  • 05: 监控告警与SLA保障
  • 06: 成本与ROI评估
相关推荐
冉冰学姐3 小时前
SSM实验室安全管理系统c03w5(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·实验室安全管理·数字化管理系统
松☆3 小时前
OpenHarmony + Flutter 混合开发实战:构建高性能离线优先的行业应用(含 SQLite 与数据同步策略)
数据库·flutter·sqlite
语落心生3 小时前
解读广告数仓(四) - 指标计算与应用实现
数据库
语落心生3 小时前
解读广告数仓(一) - 广告业务模型与指标体系深化分析
数据库
老华带你飞3 小时前
旅游|基于Java旅游信息推荐系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot·后端·旅游
冉冰学姐4 小时前
SSM石家庄铁道大学影视资料管理系统ql5pa(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm框架·石家庄铁道大学
Sunhen_Qiletian4 小时前
《Python开发之语言基础》第七集:库--时间库
前端·数据库·python
程序边界4 小时前
金仓数据库助力Oracle迁移实战:破局四大挑战,解锁高效迁移新路径
数据库·oracle
白衣衬衫 两袖清风4 小时前
SQL索引优化
数据库·sql