Intro
Google Spanner是一个全球性分布式数据库,提供了关系型数据库ACID语义的同时,兼顾了分布式系统的高扩展性,在Spanner之前,Google内部主要依赖两类存储系统:
- BigTable:不支持ACID的关系型大规模列式存储,无法支持强事务应用场景。
- MegaStore:支持ACID语义,但事务存在跨Entity Group时吞吐量较差, 难以支撑跨数据中心的分大规模事务场景。
Spanner的设计目标正是弥补上述缺陷:
- 全球分布和扩展性:支持跨数据中心部署,并保证线性可扩展
- 强一致事务:可以细粒度控制数据副本,支持跨数据中心的事务,改善MegaStore的事务限制
- 一致性时间语义:通过TrueTime API,实现全球范围的外部一致性(线性)
架构设计
Spanner使用Zone作为一个部署服务的最小单元,每个Zone中包含以下三个组件:
- zone master:为spanserver分配数据
- spanserver:为client提供数据服务
- location proxy:负责分发client的请求
在Zone之外还有两个单例服务:
- universe master:显示所有Zone的状态信息,用于监控调试。
- placement driver:可以分钟级完成Zone间的自动化迁移,定期与spanserver通信获取需要迁移的数据,以满足数据负载均衡的需求。
spanserver
Spanserver架构层次上来看,由下到上分别为:
- 数据存储层(Colossus、BigTable Tablet)
- 数据复制和一致性(Paxos)
- 事务处理、并发控制、领导者选举
数据存储层
Tablet 是 Spanner 管理数据的基本单位,是一个逻辑结构,使用B-Tree和WAL进行管理,内部有timestamp,用于支持Spanner实现MVCC机制。Colossus作为底层的数据存储引擎,它是Google对GFS的优化项目,用于支撑Spanner大规模存储。所有的Tablet以文件形式存储在Colossus中。
数据复制与一致性
为了防止意外情况导致的数据丢失,Spanner支持副本机制,每个Tablet上都实现了一个Paxos状态机,写操作由Tablet leader执行,读操作可以从任意在同步中的Tablet执行。
Directory
Directory是Spanner的逻辑分区,类似于bucket概念,一个Paxos Group可能包含多个directory,每个directory都对应一段key range。
TrueTime
Spanner为了实现全球范围的分布式事务和一致性,设计了TrueTime,来解决传统分布式系统的时钟问题:
- 各节点时钟可能存在偏移问题
- 仅靠NTP同步的时间,无法达到毫秒级一致
TrueTime能在即使物理时间存在偏差的情况下,也能保证严格的线性一致性。
TrueTime API提供了以下三个方法:
TrueTime底层使用的参考时间为GPS和原子时钟两种模式,GPS模式通过数据中心的time server和每台机器的time slave daemon线程实现,其余的master使用原子时钟。
事务管理和并发控制
Spanner 支持 分布式事务(跨多个 Paxos group),其核心机制是:
- 2PC:跨 Tablet 的事务使用 2PC 协调提交
- 时间戳分配与 TrueTime
每个leader副本中,都有一个lock table来实现并发控制,并且支持2PC,Spanner中各类读写情况对比如下:
读写事务
读写事务需要并发控制(二阶段锁),其他只读或快照读都是lock-free操作,需要使用二阶段锁的情况,都需要分配时间戳,Spanner中每个Paxos group内,Spanner以单调递增的顺序为Paxos write分配时间戳。
事务的写入操作在提交前会在client端缓存,这样事务中的读取操作无法看到事务的写入信息。读取操作使用了round-wait来避免死锁:client将读取提交给Paxos Group中的Leader副本,它会读取锁并读取最新的数据,事务开启时,client会发送keep alive信息,避免leader将事务设置为timeout,当client完成了所有的读取并缓存了所有写入信息后,它会开始进行二阶段提交。
总结
Google Spanner 是全球首个实现 跨数据中心强一致事务 的分布式数据库系统。它结合了关系数据库的事务能力与 NoSQL 系统的可扩展性,支持全球范围的数据分布与高可用。Spanner 的核心创新在于引入 TrueTime API,通过 GPS 与原子钟提供带误差界限的物理时间,从而实现 外部一致性(External Consistency),系统以 Paxos 协议 保障复制一致性,并通过 Tablet 自动分裂与迁移 提升可扩展性。Spanner 的设计证明了在工程实践中,借助精确时间同步,可以在全球范围内同时实现高可用与强一致。