Appearance
第6章:分布式存储、缓存与计算
元数据与数据路径
分布式文件系统常把名字到块的映射、块位置等元数据,与实际数据传输分开。客户端先查位置,再向数据节点访问。元数据服务也需要高可用,否则数据副本仍在却可能无法定位。
大块顺序访问和小对象随机访问有不同开销结构,系统的块大小、复制方式和缓存设计应服务其工作负载。
缓存一致性
缓存不是权威数据的无条件替代。先更新数据库再删除缓存,仍可能与并发读交错:读者先读到旧数据库值,更新者提交并删缓存,读者随后把旧值写回缓存。
处理方式可使用版本号、失效协议、事务性更新或接受有界陈旧等,取决于一致性要求。简单口号“更新后删缓存”没有覆盖所有并发执行。
MapReduce 与重执行
Map 将输入转换成键值对,shuffle 按键分组,reduce 处理同键集合。任务失败后可以重执行,但只有当副作用受到控制、输出提交有规则时,重试才不会重复产生外部效果。
一个 map 任务每处理一条记录就向外部服务扣费,任务重跑会重复扣费。任务框架的成功记录并不自动使任意外部副作用恰好一次。
尾延迟与负载
一个请求依赖一百个并行子请求时,总时间常由最慢者决定。即使每个子请求只偶尔很慢,聚合请求遭遇尾延迟的概率也会放大。
若各子请求独立且各有 1% 概率超过阈值,100 个中至少一个超过的概率为 。相关故障会使独立假设失效,因此需按实测分析。
对冲请求可以降低部分尾延迟,却增加负载,过载时可能加剧故障。限流、退避、抖动和隔离资源需要一起设计。
练习
- 写出更新数据库与填充缓存的旧值回填执行顺序。
- 哪些 map 任务副作用可以安全重试,哪些需要额外幂等机制?
- 独立性假设为什么会影响上述尾延迟概率计算?