复制

本页面介绍 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 副本的类型以及 其属性:

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

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

读写副本

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

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

只读副本

只读副本仅支持读取,不支持写入。这些副本 为主要副本或提交写操作投票,这样您可以扩展读取 而无需增加写入所需的仲裁大小。只读副本:

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

    强读可能需要往返于主副本。往返 仅用于协商时间戳,而不是从 主要副本。时间戳协商是对主要副本的 CPU 高效操作, 通常,数据已经在传输中。系统会处理此通信 由系统自动管理

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

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

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

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

添加只读副本后,主副本的体验会更多 复制负载,这可能会影响性能。最佳做法是 自定义实例中非生产实例中的性能工作负载 配置。您可以参阅区域间延迟时间和吞吐量 基准信息中心,查看中位数 区域间延迟数据例如,如果您创建自定义实例 采用 eur6 多区域基本配置和一个可选配置 us-east1 中的只读副本, 由于与服务器之间的往返时间为 100 毫秒,us-east1 europe-west4 的主要区域。具有充分过时的过时读取不会包含 因此速度要快得多您还可以使用延迟时间 按交易类型指标设置为 查看读写和只读类型事务的延迟时间数据。

有关说明,请参阅创建自定义实例配置

见证者副本

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

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

副本在写入和读取中的作用

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

在写入中

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

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

在读取中

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

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

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

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

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