海量数据存储设计
Level 1 顶层目标
-
核心需求
- 存储规模:400亿条消息(假设单条消息≤1KB,总数据量≈400TB)
- 高并发写入:支持每秒百万级消息写入
- 低延迟查询:毫秒级检索用户历史消息
- SLA保障:99.99%可用性,数据零丢失
- 成本控制:存储成本≤$0.01/GB/月
-
架构设计原则
✅ 分布式架构 | ✅ 读写分离 | ✅ 冷热分层 | ✅ 弹性扩展
Level 2 中间层策略
策略一:数据分片(Sharding)
- 垂直分片
▸ 元数据(用户关系、消息ID)与消息体分离存储
▸ 元数据使用关系型数据库(如TiDB) - 水平分片
▸ 按用户ID哈希分片(如用户ID % 1024)
▸ 动态分片迁移应对数据倾斜
策略二:存储分层(Hot-Warm-Cold)
| 层级 | 存储介质 | 数据特征 | 技术方案 |
|---|---|---|---|
| Hot | 内存+SSD | 近7天数据,高频访问 | Redis Cluster + RocksDB |
| Warm | HDD分布式存储 | 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 底层技术实现
技术栈组合
-
写入层
- 消息队列:Kafka集群(分区按用户ID哈希)
- 流处理:Flink实时写入Hot层,批量下沉Warm层
-
存储层
- Hot层:
▸ RedisTimeSeries(实时消息)
▸ TiKV(分布式KV存储) - Warm层:
▸ Cassandra(宽列存储,TTL自动过期)
▸ 压缩算法:ZSTD(压缩比≈3:1) - Cold层:
▸ 对象存储:AWS S3 Intelligent-Tiering
▸ 归档格式:Parquet列式存储
- Hot层:
-
查询层
- 缓存:GuavaCache + Redis(LRU淘汰策略)
- 查询引擎:
▸ 近期数据:直接访问存储层
▸ 历史数据:Presto跨S3/Cassandra联邦查询
-
运维体系
- 监控: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存储无限容量扩展