3. 成本模型构建:算清每一分钱去哪了
做成本优化,最怕什么?
最怕拍脑袋。你说「这个查询太贵了」,贵在哪?存储还是计算?网络流量是不是也在偷偷烧钱?
我个人习惯,先搭一个成本模型。把存储、计算、网络这三块拆开,算出单位成本。有了这把尺子,你才能知道哪里该砍一刀。
3.1 存储成本:数据躺着也要花钱
存储成本最直观,但也最容易漏算。你以为只是硬盘的钱?
存储成本 = 数据量 × 单价 × 冗余系数
冗余系数包括:副本数(通常3副本)、压缩比(Parquet 能压到 1/5)、冷热分层折扣。
我在项目中遇到过一家公司,把所有历史数据都放在热存储上。我问他们为什么不用冷存储?回答是「懒得改」。结果呢?存储成本占了总成本的 60%。
来看一个实际的计算例子:
-- 假设每天新增 100GB 日志,保留 30 天
-- 热存储(SSD):$0.08/GB/月
-- 冷存储(HDD):$0.02/GB/月
-- 全热存储成本:
100GB × 30天 × $0.08 = $240/月
-- 7天热 + 23天冷:
(100GB × 7 × $0.08) + (100GB × 23 × $0.02) = $56 + $46 = $102/月
-- 节省 57.5%
嗯,这里要注意:压缩比不是白给的。Parquet 压缩虽然好,但查询时解压也要算 CPU 开销。后面讲计算成本时会提到。
| 存储类型 | 典型单价 ($/GB/月) | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| 热存储 (SSD) | 0.08 - 0.12 | 实时查询、高频访问 | 忘了设 TTL,数据越堆越多 |
| 温存储 (HDD) | 0.02 - 0.04 | 近实时分析、报表 | 分区策略不对,查询变全表扫描 |
| 冷存储 (Archive) | 0.005 - 0.01 | 合规归档、历史审计 | 恢复时间要 12 小时,业务方骂人 |
| 对象存储 (S3/GCS) | 0.02 - 0.03 | 数据湖、备份 | 请求次数多了,API 费比存储费还贵 |
我的建议:先算「有效存储成本」。比如你存了 1TB 原始数据,Parquet 压缩后只有 200GB,那有效成本应该是 200GB × 单价,而不是 1TB。别被原始数据量吓到。
3.2 计算成本:查询才是烧钱大户
存储成本是「固定支出」,计算成本才是「弹性黑洞」。你想想看,一个写得很烂的 SQL,能把集群跑满半小时。
计算成本的核心公式:
计算成本 = 执行时间 × 资源单价 × 并发数
资源单价通常按 vCPU 和内存计费,比如 $0.05/vCPU/小时。
我曾经接手过一个数据管道,每天跑 200 个任务,平均每个任务跑 45 分钟。我一看,很多任务其实可以合并。合并之后,任务数降到 80 个,平均执行时间降到 20 分钟。成本直接砍了 60%。
来看一个更细粒度的模型:
-- 假设一个查询:
-- 扫描 500GB 数据
-- 使用 100 个 vCPU
-- 执行时间 10 分钟
-- 计算成本:
100 vCPU × (10/60) 小时 × $0.05 = $0.83
-- 如果优化后只扫描 50GB(分区裁剪):
-- 使用 20 个 vCPU
-- 执行时间 2 分钟
-- 优化后成本:
20 vCPU × (2/60) 小时 × $0.05 = $0.033
-- 成本降低 96%
为什么会差这么多?因为计算成本跟数据扫描量强相关。你扫描 500GB 和扫描 50GB,需要的资源完全不是一个量级。
| 查询类型 | 典型扫描量 | 平均执行时间 | 单次成本 ($) | 日查询次数 | 日成本 ($) |
|---|---|---|---|---|---|
| 全表扫描 | 1 TB | 30 min | 2.50 | 10 | 25.00 |
| 分区裁剪 | 100 GB | 5 min | 0.42 | 10 | 4.20 |
| 预聚合查询 | 10 GB | 30 sec | 0.04 | 10 | 0.40 |
避坑指南:我曾经见过一个团队,为了省存储成本,把所有数据都压缩成 Snappy。结果查询时解压太慢,计算成本反而涨了 3 倍。压缩算法要跟查询模式匹配,不是压缩比越高越好。
3.3 网络成本:看不见的隐形杀手
网络成本最容易被忽略。为什么?因为很多云厂商的账单里,网络费用是单独列出来的,很多人根本不看。
网络成本主要来自三块:
- 跨区域传输:数据从一个 Region 传到另一个 Region,按 GB 收费,通常 $0.02-$0.12/GB
- 出站流量:数据从云平台传到公网,最贵,$0.05-$0.20/GB
- API 调用:GET/PUT 请求次数,积少成多
我有个客户,每天同步 500GB 数据从美国到新加坡。一个月下来,网络费比存储费还贵。后来他们改了策略,只在非高峰时段同步,并且用差分同步代替全量同步,成本降了 70%。
网络成本模型:
总网络成本 = 跨区域传输量 × 单价 + 出站流量 × 单价 + API 请求数 × 单价
建议:把网络成本按「数据源-目标」维度打标签,一眼就能看出哪个链路最贵。
3.4 单位数据成本模型:$/TB 和 $/Query
有了上面三块的基础,我们就可以建立两个核心指标:
- $/TB:每 TB 数据的存储 + 计算 + 网络总成本
- $/Query:每次查询的平均成本
这两个指标,说白了就是你的数据资产的「单价」。有了单价,你才能跟业务方说:「这个查询太贵了,我们优化一下。」
-- 单位数据成本计算示例
-- 假设一个月的数据:
-- 存储:10TB,成本 $800
-- 计算:5000 个查询,总执行时间 2000 vCPU小时,成本 $1000
-- 网络:跨区域传输 2TB,成本 $200
-- $/TB = (800 + 1000 + 200) / 10 = $200/TB/月
-- $/Query = (1000 + 200) / 5000 = $0.24/查询
-- 注意:存储成本按时间摊销,计算和网络按查询次数分摊
我的习惯:每个月跑一次成本模型,把 $/TB 和 $/Query 画成趋势图。如果某个指标突然飙升,说明有问题。比如 $/Query 从 $0.24 涨到 $0.48,那就要查是不是有新的慢查询上线了。
3.5 成本模型全景图
下面这张图,把整个成本模型的逻辑串起来了。你可以把它贴在墙上,每次做成本分析时对照着看。
这张图的核心逻辑很简单:先拆出三大成本,然后汇聚成总成本,最后归一化到单位成本。有了单位成本,你就能回答「这个数据值不值得存?」「这个查询要不要优化?」
总结一下:
- 存储成本:按数据量、分层、压缩算,别忘了冗余系数
- 计算成本:按执行时间、资源单价、并发数算,扫描量是关键
- 网络成本:跨区域传输、出站流量、API 请求,一个都不能漏
- 单位成本:$/TB 和 $/Query 是核心指标,每月追踪趋势