4. 成本结构拆解

MongoDB 容量增长带来的成本压力,往往不是单一账单项在涨,而是多个成本维度同时被放大。要治理成本,第一步不是立刻降配或删数据,而是把云数据库账单拆成可归因的几块:实例规格费、存储费、备份费、跨区流量费、运维人力成本。只有把每一块与业务行为、数据增长、访问模式对应起来,才能判断哪些是刚性成本、哪些是浪费、哪些可以通过架构调整转移或压缩。

下面这张图把五类成本放在同一条“容量增长驱动链”上,展示它们如何被数据量、写入量、副本数、备份策略和跨区部署共同放大。图中箭头方向表示成本随容量增长的传导路径,而不是操作步骤。

容量增长驱动源 数据量 · 写入量 · 副本数 · 保留周期 ① 实例规格费 CPU / 内存 / IOPS 按小时计费 × 节点数 ② 存储费用 数据 + 索引 + oplog 按 GB·月 计费 ③ 备份费用 快照 + oplog 增量 保留天数 × 副本数 ④ 跨区流量费 副本同步 + 读写分离 按 GB 出站计费 ⑤ 运维人力 监控/调优/应急 人力工时折算 放大因子: 副本数 ×3 → 存储与实例费同步 ×3 备份保留 30 天 → 备份费 ≈ 存储费 × 保留系数 跨区副本 → 每 GB 写入产生 N-1 倍出站流量 索引膨胀 → 存储费额外增加 20%~40% 典型成本占比示意(示例假设,非实测) 实例规格 40% 存储 25% 备份 15% 流量 10% 人力 10% 拆解要点: • 实例规格费由“峰值负载 + 副本数”决定,降本优先看是否长期低利用率 • 存储与备份费由“数据量 + 索引 + 保留策略”决定,治理重点是冷热分离与保留周期 • 跨区流量费由“写入量 × 跨区副本数”决定,可通过就近写入或异步副本压缩 • 运维人力成本隐性但真实,自动化程度越高,单位容量人力成本越低

一、实例规格费:不是“越大越贵”,而是“匹配度”决定性价比

云数据库实例规格费通常按“节点规格 × 节点数 × 运行小时”计费。MongoDB 副本集至少三节点,分片集群还要叠加 mongos 与 config server,因此规格费往往是账单中占比最大的一块。判断规格是否合理,不能只看 CPU 使用率,还要看内存命中率、IOPS 饱和度、连接数峰值。一个常见误区是:CPU 长期 20% 就认为可以降配,但实际瓶颈可能在内存不足导致大量磁盘读,或 IOPS 已经打满。

实操中建议按以下顺序判断:先看 db.serverStatus().mem 中 resident 与 virtual 的比例,再看 wiredTiger.cache 的 bytes read into cache 是否持续增长。如果 cache 命中率低于 95%,说明工作集已超出内存,此时降配会直接导致性能崩塌。反之,如果 cache 命中率长期高于 99%、CPU 峰值低于 40%、IOPS 低于规格上限的 50%,才具备降配空间。降配前应先在低峰期做一次滚动测试,观察 P99 延迟变化。

二、存储费用:数据、索引与 oplog 的三重叠加

存储费按实际占用 GB·月计费,但 MongoDB 的“实际占用”往往比业务数据大得多。它包括:集合数据、索引、oplog、以及 WiredTiger 的预分配与碎片空间。一个 100 GB 的业务集合,如果建了 5 个复合索引,索引可能再占 30~50 GB;oplog 默认按小时窗口滚动,高写入场景下也可能占用数十 GB。因此,存储治理的第一步是量化“数据 : 索引 : oplog”的比例。

可以通过 db.stats() 查看 dataSize 与 storageSize,通过 db.collection.stats() 查看 totalIndexSize。如果 storageSize 远大于 dataSize,说明碎片或预分配严重,可考虑在低峰期执行 compact 或重建集合。对于历史数据,应按时间字段做冷热分离:热数据保留在高性能存储,冷数据归档到低频存储或对象存储,可显著降低单位 GB 成本。

三、备份费用:保留策略是最大的成本杠杆

备份费用由“快照大小 × 保留份数 × 存储单价”决定。云数据库通常支持自动快照与 oplog 增量备份,但很多团队默认保留 30 天甚至 90 天,且未做分级。实际上,最近 7 天的备份用于快速恢复,7~30 天的备份用于合规审计,30 天以上的备份可以转低频或归档。如果业务允许,还可以对非核心库降低备份频率,从每日一次改为每周一次。

一个可执行的检查表如下:

  • 核心交易库:每日全量 + 持续 oplog,保留 30 天,其中 7 天内高频可快速恢复。
  • 用户行为库:每日全量,保留 14 天,30 天以上转归档存储。
  • 日志/临时库:每周全量,保留 7 天,或直接不备份,依赖上游重放。

四、跨区流量费:写入放大与副本同步的隐性成本

跨区流量费常被忽略,因为它在账单中占比不大,但增长速度快。MongoDB 跨区副本集或分片集群中,每次写入都要同步到其他区域的节点,产生出站流量。如果写入量为 100 GB/天,跨 2 个区域,则每天出站流量约 200 GB,按月累计可达 6 TB。若跨区还承载读请求,流量会进一步放大。

治理思路有三条:一是就近写入,让主节点位于写入量最大的区域,减少跨区同步距离;二是异步副本,对一致性要求不高的分析型副本使用异步同步,降低同步频率;三是压缩传输,启用 MongoDB 的压缩选项(如 snappy、zstd),减少实际出站字节数。需要注意的是,压缩会消耗 CPU,需在实例规格上留出余量。

五、运维人力成本:最容易被低估的一块

运维人力成本不直接出现在云账单中,但它是真实存在的。包括:日常监控告警处理、慢查询优化、索引调整、版本升级、故障应急、容量规划等。一个中等规模 MongoDB 集群,如果缺乏自动化,可能需要 0.5~1 个专职 DBA 的投入。按人力成本折算,这部分可能占总体拥有成本的 10%~20%。

降低人力成本的核心是自动化与标准化:用监控平台自动采集 serverStatus、collStats、currentOp 等指标;用脚本自动生成索引建议;用基础设施即代码管理集群配置;用混沌演练验证故障切换。自动化程度越高,单位容量所需人力越少,成本曲线越平缓。

拆解顺序建议:先拉取最近 3 个月的云账单,按“实例、存储、备份、流量、其他”分类;再把每一类除以对应的数据量或写入量,得到单位成本;最后对比不同业务线的单位成本,找出异常项。单位成本比绝对金额更能反映治理效果。