复制

本页面介绍 Cloud Spanner 中数据的复制方式、Cloud Spanner 副本的不同类型及其在读写中的角色,以及复制的优势。

Cloud Spanner 中的复制概览

Cloud Spanner 会自动从其所在的底层分布式文件系统执行字节级层的复制(如 Cloud Spanner 的读写生命周期所述)。Cloud Spanner 将数据库变更写入该文件系统中的文件,该文件系统则负责在机器或磁盘出现故障时复制和恢复文件。

尽管 Cloud Spanner 所在的底层分布式文件系统已经提供了字节级层的复制,但 Cloud Spanner 还可以复制数据以提供数据可用性和地理局部性等其他优势。概括来讲,Cloud Spanner 中的所有数据都会整理成行。Cloud Spanner 会创建这些行的多个拷贝或“副本”,然后将这些副本存储在不同的地理区域中。Cloud Spanner 使用基于 Paxos 的同步复制架构,其中的投票副本(下文中有详细介绍)会在每个写入被提交之前对写入请求进行投票。全局同步复制的这一特性使您能够从任何 Cloud Spanner 读写副本或只读副本中读取最新数据。

Cloud Spanner 会为每个数据库分块创建副本,以将上述概念与架构和数据模中引入的术语和概念联系起来。分片是顶层表中一组连续的行,这些行按主键排序。分片中的所有数据通过物理方式一起存储在副本中,Cloud Spanner 通过独立的故障区域为每个副本提供服务。

系统使用 Paxos 存储和复制分片集。在每个 Paxos 副本集中,会有一个副本被选定为主要副本。主要副本负责处理写入,而所有读写或只读副本都可以在不与主要副本进行通信的情况下处理读取请求(但如果请求强读取,通常需要查询主要副本以确保只读副本已收到所有最近的变更)。下文详细介绍了主要副本和非主要副本在读取和写入中的角色。

Cloud Spanner 复制的优势

如上所述,Cloud Spanner 复制的优势包括以下几点:

  • 数据可用性:对于希望读取数据的客户端而言,拥有更多数据副本可以使数据更具可用性。另外,即使某些副本不可用,Cloud Spanner 仍然可以支持写入操作,因为在提交写入时仅需大部分投票副本即可。

  • 地理局部性:能够使用 Cloud Spanner 将数据存放到不同的区域和大洲,这意味着数据可以在地理上更接近需要它的用户和服务,因此访问速度也更快。

  • 单一数据库体验:得益于同步复制和全局高度一致性,无论规模如何,Cloud Spanner 均可提供一致的表现以及单一数据库体验。

  • 更轻松的应用开发:Cloud Spanner 的 ACID 事务具有全局高度一致性,这意味着开发者无需在应用中添加额外的逻辑来处理最终一致性,因此应用开发和后续维护变得更加轻松快捷。

副本类型

Cloud Spanner 提供三种类型的副本:读写副本只读副本见证者副本。单区域实例仅使用读写副本,而多区域实例配置使用这三种类型的组合。(要了解具体原因,请参阅:为何使用只读副本和见证者副本?

下表总结了 Cloud Spanner 的副本类型及其属性,后续部分将更详细地介绍每种类型。

副本类型 是否可以投票 是否可以成为主要副本 是否支持读取
读写
只读
见证者

读写

读写副本支持读取和写入。此类副本具有以下特性:

  • 维护数据的完整副本。
  • 支持读取。
  • 可针对是否提交写入进行投票。
  • 可参与主要副本的选择。
  • 有资格成为主要副本。
  • 是单区域实例中唯一使用的类型。

只读

只读副本只支持读取(不支持写入)。只读副本不为主要副本或提交写入投票,因此,通过只读副本,您可以扩展读取容量而无需加大写入所需的最小票数。只读副本:

  • 仅用于多区域实例。
  • 维护从读写副本复制的数据的完整副本。
  • 支持读取。
  • 不参与针对提交写入的投票。因此,只读副本的位置对写入延迟时间没有任何影响。
  • 如果过时至少 15 秒,通常无需往返默认主要区域即可处理过时读取。强读取可能需要往返主要副本;此类通信由系统自动处理。(如需详细了解过时读取和强读取,请参阅下文。)
  • 没有资格成为主要副本。

见证者

见证者副本不支持读取,但参与针对提交写入的投票。见证者副本使您可以更轻松地达成最小写票数,而无需读写副本在存储数据的完整副本及处理读取时所需的存储空间和计算资源。见证者副本:

  • 仅用于多区域实例。
  • 不维护数据的完整副本。
  • 不支持读取。
  • 针对是否提交写入进行投票。
  • 可参与主要副本的选择,但没有资格成为主要副本。

副本在写入和读取中的角色

本节介绍副本在 Cloud Spanner 写入和读取中的角色,这有助于理解 Cloud Spanner 在多区域配置中使用只读副本和见证者副本的原因。

在写入中

即使存在更靠近客户端的非主要副本,或者主要副本在地理位置上距离客户端较远,客户端写入请求也始终会首先转到主要副本。

主要副本记录传入的写入,并将其并行转发给有资格对该写入进行投票的其他副本。每个有资格投票的副本都会完成其写入,然后在响应该主要副本时对是否应该提交该写入进行投票。当大多数投票副本同意提交该写入(或达到“最小写票数”)时,写入会被提交。在后台,所有其余(非见证者)副本会记录该写入。如果读写副本或只读副本在记录写入时滞后了,可以从另一个副本请求丢失的数据,以获得完整的最新数据副本。

在读取中

客户端读取请求可能会在主要副本中执行,或需要与主要副本进行通信,具体取决于读取请求的并发模式。

  • 作为读写事务一部分的读取操作由主要副本处理,因为主要副本保有强制执行可序列化所需的锁。

  • 单次读取方法(即在事务上下文之外进行读取)和只读事务中的读取可能需要与主要副本进行通信,具体取决于读取的并发模式。(如需详细了解这些并发模式,请参阅读取类型。)

    • 强读取请求可以转到任何读写或只读副本。如果此类请求转到非主要副本,则该副本必须与主要副本进行通信才能执行读取操作。

    • 过时读取请求会转到最接近请求时间戳且距离最近的可用只读副本或读写副本。如果主要副本是与发出该读取请求的客户端距离最近的副本,则上述副本可以是主要副本。