4.3 从 HDFS 到 Spanner:工作负载决定架构
HDFS 与 Spanner 都跨机器保存数据,但服务目标不同:前者面向大文件和高吞吐顺序访问,后者面向全球分片、同步复制和外部一致事务。不能用产品规模替代工作负载分析。
HDFS 分离元数据与数据路径
NameNode 维护命名空间、文件到 block 的映射和副本状态;DataNode 保存实际 block。客户端先查询元数据,再直接与 DataNode 传输数据。
Client ──metadata──> NameNode
│
└──block stream──> DataNode A → DataNode B → DataNode C大 block 减少元数据数量和寻址开销,流水线复制提高写入吞吐。机架感知副本放置在网络成本与故障域之间权衡。
HDFS 适合大文件、批处理和流式读写,不适合海量小文件、低延迟随机更新和通用 POSIX 语义。具体 block 大小和副本数由部署配置决定,不应把某个默认值写成协议定律。
元数据高可用仍需要协调
Active/Standby NameNode 需要共享编辑日志或一致的日志机制、故障检测与 fencing。只有“检测到 Active 不健康”还不够,必须阻止旧 Active 继续写共享资源,否则会脑裂。
DataNode 定期上报 block 状态,NameNode 根据缺副本、过量副本和故障域执行再复制。恢复流量要限速,避免节点故障触发的复制风暴影响前台作业。
Spanner 把分片、副本与时间协议组合
Spanner 将数据按 key range 分片,每个分片的副本通过共识保持同步;事务层协调跨分片读写,TrueTime 暴露物理时间的不确定区间,以支持外部一致性和历史时间读取。
关键点不是“有 GPS/原子钟所以数据库很快”,而是:
- 复制组用共识决定写入顺序;
- 事务需要并发控制和跨分片协调;
- 时间 API 把误差作为区间暴露;
- 协议通过等待等方式使提交时间戳尊重真实时间顺序。
这些保证会支付跨地域网络、共识和提交等待成本。schema 与 key 设计仍要避免热点范围。
选择存储先写访问模式
| 需求 | 倾向 |
|---|---|
| PB 级大文件顺序扫描、批作业 | 分布式文件/对象存储 |
| 高写吞吐、按分区键访问、可调一致 | Leaderless 宽列/键值系统 |
| 全球事务、关系查询、外部一致 | 分布式 SQL,接受协调成本 |
| 小规模强一致元数据 | 共识 KV,不存大对象 |
还要明确:对象大小、请求率、范围查询、事务范围、读新鲜度、地域、RPO/RTO、成本和运维能力。
备份与副本不同
副本会同步应用误删除、错误写入和应用 bug。备份需要独立故障域、保留周期、不可变性和恢复演练。
对任何存储系统都要证明:
- 能恢复到哪个时间点;
- 恢复多久;
- 加密密钥和 schema 是否一起可恢复;
- 恢复环境如何避免覆盖生产;
- 最近一次完整演练是什么时候。
参考资料
- Google Research, The Google File System
- Google Research, Spanner: Google's Globally-Distributed Database