复制

本页介绍 Spanner 中数据的复制方式、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 中的可选只读副本创建自定义实例配置,则由于到 europe-west4 中的主副本的往返时间,us-east1 中客户端的预期强一致性读取延迟大约为 100 毫秒。过时读取如果过时足够,则不会产生往返,因此速度会快得多。您还可以使用锁定数据分析和事务数据分析来识别导致高延迟的事务

如需了解如何添加可选的只读副本,请参阅创建自定义实例配置

见证者副本

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

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

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

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

在写入中

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

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

在读取中

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

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

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

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

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

监控数据复制

您可以在实例配置中监控从主副本复制到跨区域副本的更改速率和数据量。变化率以每秒字节数表示,数据量以字节为单位。为此,请使用跨区域复制字节数 (instance/cross_region_replicated_bytes_count) 监控指标。

如需在 Google Cloud 控制台中查看此指标,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 Monitoring

    转到“监控”

  2. 在导航菜单中,选择 Metrics Explorer

  3. 指标字段中,点击选择指标下拉菜单。

  4. 按资源或指标名称过滤字段中,依次选择 Cloud Spanner Instance > Instance > Cross region replicated bytes,然后点击 Apply

    只有当您的实例中有跨区域复制活动时,此指标才会显示在活跃指标下。否则,该指标会显示在无效指标下。默认情况下,界面会过滤并仅显示有效指标。取消选中有效复选框,即可同时查看有效和无效指标。

    该图表显示了指定时间范围内所有 Spanner 实例中复制数据的变化率(以每秒字节数为单位)。

  5. 可选:如需显示复制的数据量(以字节为单位),而不是更改速率,请执行以下操作:

    1. 汇总字段中,点击 Sum 下拉菜单,然后选择 Configure aligner(配置对齐器)。
    2. 对齐函数字段中,点击速率下拉菜单,然后选择增量
    3. 选择表格全部作为表格类型,而不是“图表”。

      此表显示了在指定时间范围内复制的数据量(以字节为单位)。

  6. 可选:如需查看特定实例或属性的使用情况,请执行以下操作:

    1. 使用 Filter 字段添加过滤条件,例如实例 ID、数据库 ID、来源区域、目标区域或标记。
    2. 点击添加过滤条件以添加多个过滤条件。

如需查看 Google Cloud 指标的完整列表,请参阅 Google Cloud 指标

后续步骤