海量数据存储设计思路

215 阅读1分钟

海量数据存储设计

Level 1 顶层目标

  • 核心需求

    1. 存储规模:400亿条消息(假设单条消息≤1KB,总数据量≈400TB)
    2. 高并发写入:支持每秒百万级消息写入
    3. 低延迟查询:毫秒级检索用户历史消息
    4. SLA保障:99.99%可用性,数据零丢失
    5. 成本控制:存储成本≤$0.01/GB/月
  • 架构设计原则
    ✅ 分布式架构 | ✅ 读写分离 | ✅ 冷热分层 | ✅ 弹性扩展

Level 2 中间层策略

策略一:数据分片(Sharding)

  • 垂直分片
    ▸ 元数据(用户关系、消息ID)与消息体分离存储
    ▸ 元数据使用关系型数据库(如TiDB)
  • 水平分片
    ▸ 按用户ID哈希分片(如用户ID % 1024)
    ▸ 动态分片迁移应对数据倾斜

策略二:存储分层(Hot-Warm-Cold)

层级存储介质数据特征技术方案
Hot内存+SSD近7天数据,高频访问Redis Cluster + RocksDB
WarmHDD分布式存储7天~1年数据,中频访问Cassandra + LSM-Tree
Cold对象存储/磁带库1年以上数据,低频访问AWS S3 + 压缩归档

策略三:索引优化

  • 多级索引
    ▸ 一级索引:消息ID → 物理位置(B+Tree)
    ▸ 二级索引:用户ID+时间范围(布隆过滤器+倒排索引)
  • 混合索引
    ▸ 实时索引:Elasticsearch集群(近3个月数据)
    ▸ 离线索引:HBase + Phoenix(全量数据)

策略四:数据可靠性

  • 3副本机制:跨机架/跨机房存储副本
  • 纠删码(EC):冷数据采用8+3纠删码降低存储成本
  • WAL日志:Kafka持久化写入日志,防止数据丢失

Level 3 底层技术实现

技术栈组合

  1. 写入层

    • 消息队列:Kafka集群(分区按用户ID哈希)
    • 流处理:Flink实时写入Hot层,批量下沉Warm层
  2. 存储层

    • Hot层:
      ▸ RedisTimeSeries(实时消息)
      ▸ TiKV(分布式KV存储)
    • Warm层:
      ▸ Cassandra(宽列存储,TTL自动过期)
      ▸ 压缩算法:ZSTD(压缩比≈3:1)
    • Cold层:
      ▸ 对象存储:AWS S3 Intelligent-Tiering
      ▸ 归档格式:Parquet列式存储
  3. 查询层

    • 缓存:GuavaCache + Redis(LRU淘汰策略)
    • 查询引擎:
      ▸ 近期数据:直接访问存储层
      ▸ 历史数据:Presto跨S3/Cassandra联邦查询
  4. 运维体系

    • 监控:Prometheus + Grafana(存储节点健康度)
    • 扩缩容:Kubernetes自动伸缩存储Pod
    • 数据迁移:Spark ETL作业平衡分片负载

关键设计验证 成本估算:

Hot层(SSD):100TB × 0.1/GB =0.1/GB=10,000/月

Warm层(HDD):200TB × 0.03/GB =0.03/GB=6,000/月

Cold层(S3):100TB × 0.023/GB =0.023/GB=2,300/月 → 总成本≈$18,300/月,满足目标

性能验证:

写入吞吐:Kafka单分区10万TPS × 100分区 = 1000万TPS(满足需求)

查询延迟:Hot层≤5ms,Warm层≤50ms,Cold层≤500ms

扩展性:

单Cassandra集群支持PB级扩展

S3存储无限容量扩展