复制

本页面介绍 Spanner 中的数据复制方式, Spanner 副本的类型及其在读取和写入中的角色, 以及复制的优势

概览

Spanner 会自动执行字节级复制。如描述 Spanner 读写生命周期中,它利用了这一点 以及构建它所依赖的底层文件系统中的功能 Spanner 将数据库变更写入此文件系统中的文件, 而文件系统则负责复制和恢复 出现故障

尽管 Spanner 的底层分布式文件系统 已提供字节级复制,Spanner 还 可复制数据,以提供数据可用性和 市行政区。概括来讲,Spanner 中的所有数据都是 数据会整理成行Spanner 创建多个副本,或者 "副本"然后将这些副本存储在不同的 区域。Spanner 使用基于 Paxos 的同步复制架构,其中的投票副本会在每个写入被提交之前对写入请求进行投票。全局同步复制的此属性 让您能够在任何设备上 Spanner 读写副本或只读副本。

Spanner 会为每个数据库分块创建副本。拆分 存储一系列连续的行,这些行按主键排序。 分块中的所有数据都一起以物理方式存储在副本中, Spanner 从独立故障中传送每个副本 可用区。如需了解详情,请参阅架构简介

系统使用 Paxos 存储和复制分片集。在每个 Paxos 副本集中,会有一个副本被选定为主要副本。主要副本 负责处理写入,而读写或只读副本 可以在不与主要副本进行通信的情况下处理读取请求(即使 请求执行强读时,系统通常会查询主要副本,以确保 只读副本已收到所有近期变更)。

Spanner 复制的优势

Spanner 复制的优势包括:

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

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

  • 单一数据库体验:得益于同步复制和全局强一致性,Spanner 可提供单一数据库体验。

  • 更轻松的应用开发:由于 Spanner 符合 ACID 要求并提供全局强一致性,因此使用 Spanner 的开发者无需在应用中添加额外的逻辑来处理最终一致性,因此应用开发和后续维护变得更加轻松快捷。

副本类型

Spanner 提供三种类型的副本:读写副本只读副本见证者副本。区域和复制 构成基本实例配置的拓扑 已修复基本单区域实例配置仅使用读写副本。基准双区域实例配置使用读写副本和见证者副本,而基准多区域实例配置使用这三种副本类型的组合。您可以创建自定义实例配置,并为单区域实例配置和多区域实例配置添加额外的只读副本

下表汇总了 Spanner 副本的类型以及 其属性:

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

*如需了解详情,请参阅如何创建具有自定义配置的实例 实例配置

读写副本

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

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

只读副本

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

  • 维护从读写模式复制的数据的完整副本 副本。
  • 支持读取。
  • 不参与针对提交写入的投票。因此,只读副本的位置对写入延迟时间没有任何影响。
  • 如果它是距离应用最近的副本,则只读副本通常无需往返默认主副本区域即可处理过时读取(假设过时至少 15 秒)。您还可以 使用定向读取将只读事务和单个读取路由到 特定副本类型或区域。 如需了解详情,请参阅定向读取

    强读可能需要往返于主副本。往返只是为了协商时间戳,而不会从主副本中传送实际数据。时间戳协商是主副本处的 CPU 高效操作,通常表明数据已在路由中。此类通信由系统自动处理。

    如需详细了解过时读取和强一致性读取,请参阅“In reads”部分

  • 没有资格成为主要副本。

您可以创建自定义单区域或多区域实例配置 并添加可选的只读副本,以扩缩读取并支持低延迟过时 读取。您可以添加可选地区下列出的地理位置 作为可选的只读副本如果没有看到您选择的只读模式 副本位置,则可以请求新的可选只读副本区域。 您无法更改基本实例配置的复制拓扑, 已修复

所有可选的只读副本都受计算容量和存储空间的限制 费用。此外,将只读副本添加到 实例配置不会更改 Spanner SLA 实例配置的一部分如果您选择在与主副本所在区域位于不同大洲的区域添加只读副本,我们建议您至少添加两个只读副本。这有助于在某个只读副本不可用时保持较低的读取延迟时间。

最佳做法是,在以下位置测试性能工作负载: 自定义实例配置如需查看区域间延迟时间中位数数据,您可以参阅“区域间延迟时间和吞吐量基准”信息中心。例如,如果您创建自定义 采用 eur6 多区域基本配置且 us-east1 中的可选只读副本, 由于与服务器之间的往返时间为 100 毫秒,us-east1 europe-west4 的主要区域。过时读取如果过时足够,则不会产生往返,因此速度会快得多。您还可以使用锁定数据分析和事务数据分析来识别导致高延迟的事务

如需了解相关说明,请参阅创建自定义实例配置

见证者副本

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

  • 用于双区域和多区域实例。
  • 不要保留数据的完整副本。
  • 不提供读取操作。
  • 针对是否提交写入进行投票。
  • 可参与主要副本的选择,但没有资格成为主要副本。

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

本部分介绍副本在 Spanner 写入中的作用, 这对于了解 Spanner 为何使用 见证者副本的多区域配置

在写入中

即使存在更靠近客户端的非主副本,或者主副本在地理位置上距离客户端较远,客户端写入请求也始终会先在主副本上处理。如果您使用多区域实例配置,并且客户端应用位于非主副本区域,Spanner 会使用主副本感知路由来动态路由读写事务,以缩短数据库中的延迟时间。有关 相关信息,请参阅领导者感知型路由

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

在读取中

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

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

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

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

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