复制

本页面介绍了 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 高效操作,通常表明数据已在路由中。此类通信由系统自动处理。

    如需详细了解过时读取和强读取,请参阅读取部分

可选的只读副本

您可以创建自定义单区域或多区域实例配置,并添加可选的只读副本,以扩缩数据读取并支持低延迟过时数据读取。添加的只读副本必须位于不属于预定义基本实例配置的区域中。如需查看可添加的可选只读区域的列表,请参阅可用的单区域配置可用的多区域配置下的“可选区域”列。如果您没有看到所选的只读副本位置,可以请求新的可选只读副本区域

所有可选的只读副本均需支付计算容量、存储和复制费用

此外,向自定义实例配置添加只读副本不会更改实例配置的 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 实例 > 实例 > 跨区域复制的字节数,然后点击应用

    只有当实例中存在跨区域复制活动时,此指标才会在活跃指标下显示。否则,该指标会显示在非活跃指标下。默认情况下,界面会过滤并仅显示活跃指标。清除活跃对勾标记,即可同时查看活跃和非活跃指标。

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

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

    1. 聚合字段中,点击总和下拉菜单,然后选择配置校准器
    2. 校准函数字段中,点击速率下拉菜单,然后选择增量
    3. 选择两者作为表类型,而不是“图表”。

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

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

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

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

后续步骤