读取租约

本页介绍了如何使用 Spanner 读取租约。读取租约有助于数据库降低读写区域或只读区域中的强读延迟时间,但代价是写入延迟时间会更长。

默认情况下,当 Spanner 在非主要区域中收到强一致性读取请求时,处理读取请求的副本会与实例的主要读写区域联系。此联系人会在处理请求之前确认其数据是否为最新数据。此过程会在接收请求的区域与主要区域之间产生一次网络往返。与单个区域内的通信不同,区域之间的地理距离会增加请求的延迟时间。

使用 Spanner 读取租约可避免此往返。为数据库设置一个或多个读取租约区域后,Spanner 会授予这些区域在本地提供一致性读取的权限。这样,非领导者区域就可以直接提供强读取,而无需与主要区域通信。从更靠近客户端的非主要区域提供强读服务,可缩短跨区域的延迟时间。这样一来,双区域或多区域实例中的强读取便可实现区域内延迟。启用读取租约后,只读事务中的强读取会在本地处理,而无需与主节点联系。对于读写事务,除非您使用可重复读隔离级别并停用主要副本感知路由,否则读取操作仍会定向到主要区域。

在区域中启用或停用读取租约功能不需要停机。不过,使用此功能时,写入操作的延迟时间会更长,因为启用读取租约后,主副本在处理写入操作时需要与读取租约区域联系。副作用是,写入操作会持有锁更长时间,这可能会影响高争用写入工作负载。如需了解详情,请参阅何时使用读取租约。读取租约最适合愿意牺牲写入延迟时间来换取更快的强读取速度的应用。例如,访问权限控制系统,其工作负载具有频繁读取但很少写入的特点。

如需了解如何启用读取租约,请参阅使用读取租约

何时使用读取租约

如果您的应用和工作负载符合以下条件,请启用读取租约:

  • 强读的低延迟比写入的低延迟更重要。
  • 您的工作负载可以容忍更长的写入锁定持续时间,或者写入争用较低。

当存在并发写入时,选择使用查询 API 还是读取 API 会影响使用读取租约区域的数据库的性能。

如需详细了解监控延迟时间,请参阅监控

用例示例

假设有一个在全球部署的应用,该应用在美国执行写入操作,并且在美国、欧洲和亚洲都有客户端。您可以配置一个多区域 Spanner 实例(例如 nam-eur-asia1),其中主要区域位于 us-central1,只读副本位于 europe-west1asia-east1

europe-west1asia-east1 只读区域中启用读取租约后,Spanner 会从这些本地副本处理来自欧洲和亚洲的强一致性读取,从而缩短延迟时间。代价是所有写入操作的写入延迟时间都会增加。增加的延迟时间相当于主要 us-central1 区域与最远的读取租约区域之间的往返时间。

限制

Spanner 读取租约存在以下限制:

  • 您无法将读取租约与地理分区搭配使用。
  • 对于属于读写事务的读取,读取租约不会缩短延迟时间。如果您希望在读写事务中实现读取的区域内延迟时间,则必须使用可重复读隔离级别,并停用主要副本感知路由以使用读取租约。即使使用可重复读隔离级别,读写事务中的读取操作仍可能会定向到主要区域,尤其是在事务中发生写入操作之后,以确保读后写一致性。
  • 如果您将实例迁移到其他实例配置,则读取租约设置不会保留。迁移完成后,您必须重新启用数据库的读取租约。

使用读取租约

您必须先启用读取租约,然后才能使用它。

使用 IAM 进行访问权限控制

如需设置读取租约区域,用户需要拥有 spanner.databases.createspanner.databases.updateDdl IAM 权限。预定义的数据库管理员角色 (roles/spanner.databaseAdmin) 包含这些权限。如需了解详情,请参阅 Spanner 的 IAM 概览

如需了解如何授予权限,请参阅应用 IAM 权限

PostgreSQL 数据库用户在开始之前需要了解的事项

如果您想在 PostgreSQL 数据库中使用读取租约,请对数据库进行以下配置更改之一。否则,即使您已设置读取租约区域,读取操作仍由主要区域处理。

  • 如果您仅使用只读事务,请配置 PostgreSQL 连接,以便将数据库中每个新事务的默认状态设置为只读。为此,请将 default_transaction_read_only 选项设置为 true

    postgres://USER_ID:PASSWORD@localhost:5432/DATABASE_ID?sslmode=disable&options=-c \
      default_transaction_read_only=true
    host=/tmp port=5432 database=DATABASE_ID \
      options='-c default_transaction_read_only=true'
    

    替换以下内容:

    • USER_ID 替换为用户的唯一标识符。

    • PASSWORD 替换为您的密码。

    • DATABASE_ID 替换为数据库的唯一标识符。

  • 如果您希望在读写事务中实现区域内延迟读取,或者无法始终切换连接选项,请使用可重复读隔离级别并停用主要副本感知路由。即使读写事务仅包含读取操作,也必须进行这些设置。否则,读写事务中的读取操作始终会定向到主要区域。在此类事务中,在出现第一个写入 DML 语句后,读取租约会被停用。这是因为写入始终定向到主要区域。因此,为了读取您的写入内容,后续读取也需要前往主要区域。

    postgres://USER_ID:PASSWORD@localhost:5432/DATABASE_ID?sslmode=disable&options=-c \
      default_isolation_level=REPEATABLE_READ -c routeToLeader=false
    host=/tmp port=5432 database=DATABASE_ID \
      options='-c default_isolation_level=REPEATABLE_READ -c routeToLeader=false'
    

启用读取租约

如需在创建新数据库时启用读取租约,请在 ALTER DATABASEGoogleSQLPostgreSQL)DDL 语句中设置 read_lease_regions 选项:

控制台

  1. 前往 Google Cloud 控制台中的实例页面。

    实例

  2. 选择要启用读取租约的实例。

  3. 在随即打开的实例概览页面中,点击创建数据库

  4. 对于数据库名称,输入一个名称。

  5. 选择数据库方言。

  6. 点击创建

    Google Cloud 控制台将显示您创建的数据库的概览页面。

  7. 在导航菜单中,点击 Spanner Studio

  8. Spanner Studio 页面上,点击 新标签页或使用空白编辑器标签页。

  9. 输入以下 ALTER DATABASE DDL 语句。

    GoogleSQL

    ALTER DATABASE DATABASE_ID
    SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');
    

    替换以下内容:

    • DATABASE_ID 替换为数据库的唯一标识符。

    • READ_LEASE_REGION 替换为要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

    PostgreSQL

    ALTER DATABASE DATABASE_ID
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';
    

    替换以下内容:

    • DATABASE_ID 替换为数据库的唯一标识符。

    • READ_LEASE_REGION 替换为要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

  10. 点击运行

gcloud

如需在创建数据库时设置 read_lease_regions 数据库选项,请使用 gcloud spanner databases create

GoogleSQL

gcloud spanner databases create DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');"

替换以下内容:

  • DATABASE_ID:Spanner 数据库的永久性标识符。
  • INSTANCE_ID:Spanner 实例的永久性标识符。
  • READ_LEASE_REGION:您要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

PostgreSQL

gcloud spanner databases create DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID \
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';"

替换以下内容:

  • DATABASE_ID:Spanner 数据库的永久性标识符。
  • INSTANCE_ID:Spanner 实例的永久性标识符。
  • READ_LEASE_REGION:您要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

如需在更新现有数据库时启用读取租约,请在 ALTER DATABASEGoogleSQLPostgreSQL)DDL 语句中设置 read_lease_regions 选项:

控制台

  1. 前往 Google Cloud 控制台中的实例页面。

    实例

  2. 选择要启用读取租约的实例。

  3. 选择要启用读取租约的数据库。

  4. 在导航菜单中,点击 Spanner Studio

  5. Spanner Studio 页面上,点击 新标签页或使用空白编辑器标签页。

  6. 输入以下 ALTER DATABASE DDL 语句。

    GoogleSQL

    ALTER DATABASE DATABASE_ID \
    SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');
    

    替换以下内容:

    • DATABASE_ID 替换为数据库的唯一标识符。

    • READ_LEASE_REGION 替换为要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

    PostgreSQL

    ALTER DATABASE DATABASE_ID \
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';
    

    替换以下内容:

    • DATABASE_ID 替换为数据库的唯一标识符。

    • READ_LEASE_REGION 替换为要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

  7. 点击运行

gcloud

如需设置 read_lease_regions 数据库选项,请使用 gcloud spanner databases ddl update

GoogleSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID \
    SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');"

替换以下内容:

  • DATABASE_ID:Spanner 数据库的永久性标识符。
  • INSTANCE_ID:Spanner 实例的永久性标识符。
  • READ_LEASE_REGION 替换为要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

PostgreSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID \
    SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';"

替换以下内容:

  • DATABASE_ID:Spanner 数据库的永久性标识符。
  • INSTANCE_ID:Spanner 实例的永久性标识符。
  • READ_LEASE_REGION 替换为要启用读取租约的区域。例如 europe-west1。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。

停用读取租约

读取租约默认处于停用状态。

如需在现有数据库中更新和停用此功能,请在 ALTER DATABASEGoogleSQLPostgreSQL)DDL 语句中将 read_lease_regions 选项设置为 NULL

控制台

  1. 前往 Google Cloud 控制台中的实例页面。

    实例

  2. 选择要停用读取租约的实例。

  3. 选择要停用读取租约的数据库。

  4. 在导航菜单中,点击 Spanner Studio

  5. Spanner Studio 页面上,点击 新标签页或使用空白编辑器标签页。

  6. 输入以下 ALTER DATABASE DDL 语句。

    GoogleSQL

    ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = NULL);
    

    DATABASE_ID 替换为数据库的唯一标识符。

    PostgreSQL

    ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = NULL;
    

    DATABASE_ID 替换为数据库的唯一标识符。

  7. 点击运行

gcloud

如需设置 read_lease_regions 数据库选项,请使用 gcloud spanner databases ddl update

GoogleSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = NULL);"

替换以下内容:

  • DATABASE_ID:Spanner 数据库的永久性标识符。
  • INSTANCE_ID:Spanner 实例的永久性标识符。

PostgreSQL

gcloud spanner databases ddl update DATABASE_ID \
  --instance=INSTANCE_ID \
  --ddl="ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = NULL;"

替换以下内容:

  • DATABASE_ID:Spanner 数据库的永久性标识符。
  • INSTANCE_ID:Spanner 实例的永久性标识符。

最佳做法

为了最大限度地发挥使用此功能的优势,请使用多路复用会话,以便在单个会话中创建大量并发请求。

监控

启用读取租约后,请务必监控延迟时间,以确认该功能是否达到了预期效果。为此,请查询 data_options 信息架构表(GoogleSQLPostgreSQL)或您的数据库,以确定主要区域和已启用读取租约的区域。已启用读取租约的区域希望强读取具有区域内延迟。与此同时,写入延迟时间会增加,增加幅度为主要区域与启用读取租约的最远区域之间的一个往返时间。

您还可以使用以下 Spanner 延迟时间指标来帮助您监控实例中的读取请求延迟时间:

  • spanner.googleapis.com/api/read_request_latencies_by_serving_location

您可以使用 /serving_location 字段过滤此指标。/serving location 字段表示提供请求的 Spanner 服务器的位置。

如需可用指标的完整列表,请参阅 Spanner 指标列表

费用注意事项

从启用读取租约功能的区域提供的强读取使用的计算资源略少。另一方面,启用了读取租约功能的数据库的写入操作会使用略多的计算资源。如需了解详情,请参阅 Spanner 计算容量价格

此功能不会影响其他价格构成要素,例如存储和网络。

后续步骤