6.824 分布式系统 Spanner
2023-11-02 17:00:00
# Papers
实现

Spanner 是 Zone 的集合, 一个 Zone 有
- 一个
zoneMaster: 为spanserver分配数据 - 几百到几千个
spanserver: 为客户端提供数据服务 location proxy给客户端定位分配好的spanserver
universemaster 是一个控制台, 显示所有 zone 的状态信息
placement dirver 分钟级处理 zone 间的自动化迁移, 定期与 spanserver 交互从而进行副本约束或负载均衡

每个 spanserver 负责 100~1000 个 tablet
其状态被保存在一系列类 B 树的文件和一个预写日志中 (WAH)
他们都在一个叫做 Colossus 的分布式文件系统中(GFS 的后继)
每个键值对都会按照 key 哈希从而被分区, 所有数据中心的对应分区组成一个 Paxos
其中一个 Paxos 组的 Leader 成为跨组事务的 Leader 协调者, 即 coordinator leader, 其他的是 paticipant leader
TrueTime
为了实现一致性, 事务被分配了全局的唯一 ID, 使用全球时钟同步机制 (基于 GPS 和 原子钟)
TrueTime API 提供如下三个接口
TT.now(), 返回一个范围区间[earliest, latest]TT.before(t), 如果确保真实事件不到t, 返回trueTT.after(t), 如果确保真实事件超过t, 返回true
事务
支持如下几种事务
- 读写事务
- 只读事务
- 快照读, 客户端提供时间戳
- 快照读, 客户端提供时间范围
考虑原子钟数据传输导致的误差, Spanner 使用延时提交的方式
假设原子钟的误差是 x, 事务 B 要在 事务 A 提交之后再过 x 的时间提交, 所以写事务的时延至少是 2x
单个 Paxos 组
- 读写: 获取当前时间戳, 执行读写操作并提交时间戳
- 只读: 获取当前时间戳, 获取当前应该读取的版本
- 快照读: 自带时间戳, 获取当前应该读取的版本
多个 Paxos 组
- 读写需要两阶段提交
Prepare: 客户端将数据发送给多个Paxos组的Leader,Leader发起Prepare, 其他Follower需要锁住对应的资源Commit: 协调者发起commit, 使用协调者本地的时间戳
- 读: 同上单个
Paxos组
