理解Google Spanner(3):分布式事务原理与实现

本篇涉及到分布式事务的原理与Spanner事务实现,需要大概理解单机数据库事务,如果还不理解,可以先看看之前的两篇:

为了让下面的阅读不那么枯燥,先抛出几个问题大家可以思考一下:

  1. 分布式事务相比单机事务,有何难点?如何解决?
  2. 为什么在同一个Spanner事务中,提交之前完全读不到自己的写入?
  3. 什么是外部一致性?
  4. Spanner事务有哪些类型?分别适用于什么场景?
  5. Spanner读取是加锁还是MVCC?
  6. Spanner每个Paxos Group的每秒事务吞吐量是否有限制?

理解Google Spanner(2):数据是如何存储的

阅读本文之前,最好已经阅读过Spanner官方文档。 本文适合以下两类人: A. 如果你读完官方文档完全没能举一反三,还是一头雾水,不知道使用Spanner的正确姿势是什么,以及为什么这些姿势比较正确。那你就可以读一下这篇文章,一定会对你有帮助。 B. 如果你对数据库原理及其实现有一定理解,你读完官方文档已经举一反三大概猜测到了它的实现原理,大神,还是请你读一下这篇文章,交流一下我们理解不一致的地方。

重要的话再说一遍:阅读本文之前,最好已经阅读过Spanner官方文档,带着问题来读这篇文章,收获会更多一些。

(如果你想对Spanner的基本架构有一个概览,可以读一读上一篇:理解Google Spanner(1):数据复制与分片

本文会讲什么

要理解Spanner中的数据是如何被存储、组织的,只有三个关键词:

  • Key-Value数据库
  • LSM-Tree
  • PAX 行列混存

理解Google Spanner(1):数据复制与分片

现在工作中有很多项目开始转到Google Spanner,虽然是很牛逼的分布式数据库,但由于太新了,并且是闭源的,网上几乎没有什么资料可查,为了更好地使用它,开始了Spanner漫长的学习之路,一个东西只有自己能教会别人,才代表自己真的会了,因此准备进行Google Spanner的一系列分享,这是第一篇,主要是讲Spanner的数据复制与分片,最后会提到实际应用中会遇到的热点问题以及解决方案。