系统设计 Lab
分布式 key-value store 通过调节「多少个 replica 必须达成一致」,在 consistency、latency 和 availability 之间做权衡。
调节吞吐、key 数量、value 大小、replication factor N、read quorum R、write quorum W,以及集群规模。设计会从单节点逐步演进到 consistent-hash ring、replication、quorum 调优(把 CAP 权衡变得具体),最后到带 anti-entropy 的多 region。这对应 Amazon Dynamo 和 Apache Cassandra。
分步讲解
一步一步把它想清楚
要点
常规演进场景
从左到右点击,就是预设的演示路径。每张卡片都会改变 workload 输入。
推荐形态
当前架构路径
Clients
Client 用一个不透明的 key 发起 get 和 put 操作
Coordinator
Coordinator 对 key 做 hash,找到它在 ring 上的位置,并把请求 fan-out 给各个 replica
Quorum logic 等到 R 个读响应或 W 个写 ack 之后再回复 client
Hash ring
Consistent ring 把 key 的 hash 映射到 partition;virtual node 让集群变化时负载保持均衡
Replicas
Primary replica ring 上为某个 key 负责的 N 个 node 中的第一个
Extra replicas 顺时针往下的几个 node,各持一份副本以提供 durability 和 availability
Hinted handoff 一个替补 node 临时替挂掉的 replica 存下写入,之后再回放给它
Anti-entropy
Gossip node 之间交换 membership 和健康状态,让 ring 不靠 master 也能收敛
Read repair 修复读取时发现的过期 replica,以及通过后台 Merkle-tree 同步来调和差异
瓶颈
每节点操作负载
每节点存储
Write amplification
Quorum / 一致性
跨 region + anti-entropy
为什么会变
决策权衡
有出处支撑的规则
这些是模型背后那些经得起时间考验的 system design 论断。而 slider 的具体阈值,则被刻意标注为教学用的假设。
Consistent hashing 把 key 分区,并把 membership 变化时的搬迁量限制在很小范围
Dynamo 用 hash 把 key 放到 ring 上,并用 virtual node,使得加入或移除一个 node 只搬动一小部分 key,从而保持负载均衡。
Amazon Dynamo (SOSP 2007)Quorum R+W>N 给出 read-your-writes;更小的 quorum 偏向 latency 和 availability
Dynamo 把 N、R、W 暴露成可调旋钮;R+W>N 让读集合和写集合产生重叠,于是一次读能看到最新的写,代价是 latency 和 availability。
Amazon Dynamo (SOSP 2007)Hinted handoff 和 read repair 让 store 保持 available 和最终一致
Cassandra 为不可达的 replica 存下 hint,并在读取时以及通过后台 anti-entropy 修复差异,所以故障不会阻塞写入。
Apache Cassandra DocsDynamoDB 是一个托管的 key-value store,带可调、按 region 范围的 replication
DynamoDB 提供最终一致和强一致的读,以及跨 region 复制的 global table,把同样的 N/R/W 权衡变成了托管服务。
AWS DynamoDB教学用假设
- 每节点的操作和存储预算是保守的教学数字;真实 node 会因硬件和 value 大小差异很大。
- Write amplification 简单地按 replication factor N 建模——每个 put 都施加到 N 个 replica 上。
- 一致性压力用 R+W 和 N 做对比;它抽象掉了 clock skew、sloppy quorum 和 hinted write。