levy5307 / blog

https://levy5307.github.io/blog/
MIT License
0 stars 0 forks source link

spanner #42

Open levy5307 opened 3 years ago

levy5307 commented 3 years ago

https://levy5307.github.io/blog/spanner/

Spanner是谷歌开发的一款可扩展的、全球分布式的数据库,其复制技术可以用来服务于全球可用性和地理局部性。

其提供了几个特性:

在数据的副本配置方面,应用可以在一个很细的粒度上进行动态控制。应用可以详细规定哪些数据中心包含哪些数据,数据距离用户有多远(控制用户读取数据的延迟),不同数据副本之间距离有多远(控制写操作的延迟),以及需要维护多少个副本(控制可用性和读操作性能)。数据也可以被动态和透明地在数据中心之间进行移动,从而平衡不同数据中心内资源的使用。

Spanner有两个重要的特性,很难在一个分布式数据库上实现,即Spanner提供了读和写操作的外部一致性,以及在一个时间戳下面的跨越数据库的全球一致性的读操作。这些特性使得Spanner可以支持一致的备份、一致的MapReduce执行[12]和原子模式变更,所有都是在全球范围内实现,即使存在正在处理中的事务也可以。

之所以可以支持这些特性,是因为Spanner可以为事务分配全球范围内单调向前的commit timestamp,即便事务可能是分布式的。这些时间戳反映了事务串行化的顺序。除此以外,这些串行化的顺序满足了外部一致性的要求:如果一个事务T1在另一个事务T2开始之前就已经提交了,那么,T1的commit timestamp就要比T2的commit timestamp小。Spanner是第一个可以在全球范围内提供这种保证的系统。实现这种特性的关键技术就是一个新的TrueTime API及其实现,这个在后面将会详细讲解。

实现