一、为什么企业需要冷热数据分层存储

想象一下,你经营着一家电商平台,每天都有大量用户浏览商品、下单购买。这些数据中,有些是"热数据"——比如最近3天的订单记录、用户活跃会话,需要毫秒级响应;有些则是"冷数据"——比如3年前的订单日志、历史报表,可能几个月才被查询一次。如果所有数据都放在高性能存储上,就像把十年不穿的羽绒服天天挂在衣柜最显眼的位置,既占空间又浪费钱。

以某电商平台实际数据为例:

  • 热数据(最近3个月):日均访问量50万次,要求响应时间<100ms
  • 温数据(3-12个月):日均访问量1万次,可接受1-2秒响应
  • 冷数据(1年以上):月均访问量不足100次,允许5秒以上响应

传统方案将所有数据存放在SSD存储,年存储成本高达120万元。而采用分层存储后,成本降至45万元,降幅达62.5%。

二、PolarDB的分层存储架构解析

PolarDB通过三层架构实现智能数据流动:

  1. 热数据层:采用内存+ESSD云盘,存储最近活跃数据

    -- PolarDB PostgreSQL版示例:创建热数据表
    CREATE TABLE hot_orders (
      order_id BIGSERIAL PRIMARY KEY,
      user_id INT NOT NULL,
      amount DECIMAL(10,2),
      create_time TIMESTAMPTZ DEFAULT NOW()
    ) TABLESPACE fast_ssd;  -- 显式指定高速存储表空间
    
  2. 温数据层:使用标准SSD,存储访问频次中等的数据

    -- 创建温数据归档表
    CREATE TABLE warm_orders (
      LIKE hot_orders INCLUDING DEFAULTS
    ) TABLESPACE standard_ssd;
    
  3. 冷数据层:依托OSS对象存储,成本仅为热数据的1/10

    -- 创建OSS外部表(冷数据)
    CREATE FOREIGN TABLE cold_orders (
      order_id BIGINT,
      user_id INT,
      amount DECIMAL(10,2),
      create_time TIMESTAMPTZ
    ) SERVER oss_server 
    OPTIONS (filename 'oss://cold-bucket/orders/');
    

数据流动通过内置调度器自动完成:

-- 设置自动归档策略(每月将3个月前的数据转为温数据)
CREATE AUTOMATIC ARCHIVING POLICY order_archiving
FOR hot_orders 
TO warm_orders
WHEN (create_time < NOW() - INTERVAL '3 months');

三、关键技术实现细节

3.1 智能数据识别算法

PolarDB采用基于访问模式的动态评分机制:

-- 查看表访问热度评分(示例)
SELECT relname, 
       pg_stat_get_live_tuples(oid) AS live_tuples,
       pg_stat_get_tuples_hot_updated(oid) AS hot_updates,
       pg_stat_get_blocks_fetched(oid) - pg_stat_get_blocks_hit(oid) AS disk_reads
FROM pg_class
WHERE relname LIKE '%orders%';

评分公式:

热度分数 = (读取次数×0.6 + 写入次数×0.3 + 缓存命中率×0.1) / 数据年龄系数

3.2 透明访问技术

无论数据存放在哪层,应用始终使用统一接口:

// Java应用示例:无需关心数据位置
public Order getOrderById(long orderId) {
    // 以下查询会自动路由到正确的存储层
    String sql = "SELECT * FROM orders WHERE order_id = ?";
    return jdbcTemplate.queryForObject(sql, new OrderRowMapper(), orderId);
}

3.3 成本优化实战案例

某金融客户的实际配置:

-- 分层存储配置参数
ALTER DATABASE SET polar_cost_optimize.mode = 'aggressive';
ALTER SYSTEM SET polar_hot_data_age = '7 days';
ALTER SYSTEM SET polar_warm_data_age = '90 days';

实施效果对比:
| 指标 | 实施前 | 实施后 |
|---------------|--------|--------|
| 存储成本(月) | ¥82k | ¥28k |
| 查询P99延迟 | 68ms | 53ms |
| 备份耗时 | 6h | 2h |

四、典型应用场景与避坑指南

4.1 最适合的三种场景

  1. 电商订单系统

    • 热数据:未完成订单、近期订单
    • 冷数据:已完成超3个月的订单
  2. IoT设备监控

    • 热数据:最近1小时传感器数据
    • 冷数据:历史统计报表
  3. 游戏玩家数据

    • 热数据:在线玩家状态
    • 冷数据:弃游玩家档案

4.2 需要避开的陷阱

  1. 频繁更新的冷数据

    -- 错误示例:将常更新的配置表设为冷存储
    CREATE FOREIGN TABLE app_config (...) SERVER oss_server; -- OSS不支持随机写
    
  2. 未设置缓存层

    -- 正确做法:为冷数据添加Redis缓存
    CREATE MATERIALIZED VIEW mv_cold_orders 
    REFRESH COMPLETE EVERY 1 DAY
    AS SELECT * FROM cold_orders;
    
  3. 忽略数据迁移开销

    # 建议在业务低谷期执行大批量迁移
    pg_dump --table=old_data --jobs=8 | \
    psql -c "COPY new_table FROM STDIN"
    

五、与传统方案的性能对比

通过TPC-C基准测试对比(单位:tpmC):
| 方案 | 吞吐量 | 存储成本 |
|---------------------|--------|----------|
| 全SSD | 12,500 | $1.2/MB |
| 全HDD | 3,200 | $0.3/MB |
| PolarDB分层存储 | 11,800 | $0.4/MB |

测试环境:

  • 16核CPU/64GB内存
  • 500GB初始数据量
  • 30%写入/70%读取混合负载

六、实施路线图建议

分阶段实施策略:

  1. 评估阶段(1-2周)

    -- 分析数据访问模式
    SELECT schemaname, relname, 
           seq_scan, idx_scan,
           n_tup_ins, n_tup_upd
    FROM pg_stat_user_tables;
    
  2. 小规模试点(1周)

    -- 选择1-2个表进行测试
    CREATE TABLE orders_test (LIKE orders);
    INSERT INTO orders_test SELECT * FROM orders LIMIT 100000;
    
  3. 全量迁移(根据数据量)

    # 使用并行迁移工具
    polar_migrator --source=original_db \
                  --target=layered_db \
                  --threads=16 \
                  --tables="orders,users,products"
    

七、总结与展望

冷热分层不是简单的存储降级,而是构建智能数据生命周期管理体系。PolarDB通过三个创新点实现突破:

  1. 基于机器学习的动态分层算法
  2. 计算节点与存储分离架构
  3. 全局一致性缓存

未来随着3D XPoint等新存储介质普及,我们可能会看到更多细粒度分层(如新增"沸点数据"层)。但核心原则不变:让每比特数据住在性价比最高的"房子"里。