本页介绍了 Spanner 读取租约,并说明了如何使用它们。读取租约有助于数据库在非领导者区域中缩短需要强一致性的事务的读取延迟时间。
默认情况下,当 Spanner 在非主要区域中收到强一致性读取请求时,处理读取请求的副本会与实例的主要读写区域联系。此联系人会在处理请求之前确认其数据是否为最新数据。此过程会在接收请求的区域与主要区域之间产生一次网络往返。与单个区域内的通信不同,区域之间的地理距离会增加请求的延迟时间。
使用 Spanner 读取租约可避免此往返。为数据库设置一个或多个读取租约区域后,Spanner 会将本地读取服务权限授予一个或多个非主要、读写或只读区域。这样,非主区域就可以直接提供强读取服务,而无需与主要区域通信。从距离客户端较近的非主区域提供强读服务可减少区域间的延迟。这样一来,双区域或多区域实例中的强读取便可实现区域内延迟。
在区域中启用或停用读取租约功能不需要停机。不过,使用此功能时,写入操作的延迟时间会更长,因为启用读取租约后,主副本在处理写入操作时需要与读取租约区域联系。副作用是,写入操作持有锁的时间更长,这可能会影响高争用写入工作负载。如需了解详情,请参阅何时使用读取租约。读取租约最适合愿意牺牲写入延迟时间来换取更快的强读取速度的应用。例如,访问权限控制系统,其工作负载具有频繁读取但很少写入的特点。
如需了解如何在非主要区域中启用读取租约,请参阅使用读取租约。
何时使用读取租约
如果您的应用和工作负载符合以下条件,请启用读取租约:
- 强读的低延迟比写入的低延迟更重要。
- 您的工作负载可以容忍更长的写入锁定时间,或者写入争用程度较低。
启用读取租约会增加写入延迟时间,从而导致写入锁的持有时间更长。如果您的写入工作负载已经存在严重的写入争用,此功能可能会导致写入延迟时间更长并降低吞吐量。
当存在并发写入时,选择使用查询 API 还是读取 API 会影响使用读取租约区域的数据库的性能。
在 Spanner 中执行 SQL 语句涉及从多个行或范围读取数据。如果使用启用了读取租约的查询 API,读取需要等待并发写入,才能确保正确性。因此,您可能会发现延迟时间较长,尤其是在写入负载较高时。与查询 API 相比,读取 API 通常对并发写入的容忍度更高。如果您经常使用写入负载较高的查询 API,请考虑降低写入频率或改用过时读取。
读取 API 经过优化,可用于读取特定行或特定范围的数据。它们只需要等待修改其尝试读取的确切数据的写入操作。如果您使用的是读取 API,则只有对完全相同的数据范围的写入操作会阻止您的读取操作。因此,当存在并发写入且您使用读取租约区域时,Spanner 强一致性读取的性能会更好,延迟时间也会更短。
如需详细了解监控延迟时间,请参阅监控。
用例示例
假设有一个在全球部署的应用,该应用在美国执行写入操作,并且在美国、欧洲和亚洲都有客户端。您可以配置一个多区域 Spanner 实例(例如 nam-eur-asia1
),其中主要区域位于 us-central1
,只读副本位于 europe-west1
和 asia-east1
。
在 europe-west1
和 asia-east1
只读区域中启用读取租约后,Spanner 会从这些本地副本处理来自欧洲和亚洲的强一致性读取,从而缩短延迟时间。代价是所有写入操作的写入延迟时间都会增加。增加的延迟时间相当于主要 us-central1
区域与最远的读取租约区域之间的往返时间。
限制
Spanner 读取租约存在以下限制:
- 您无法在见证区域中启用读取租约。
- 您无法将读取租约与地理分区搭配使用。
- 对于属于读写事务的读取,读取租约不会缩短延迟时间。即使读写事务仅包含读取操作,这些读取操作仍由主要区域处理。
- 如果您将实例迁移到其他实例配置,则读取租约设置不会保留。迁移完成后,您必须重新启用数据库的读取租约。
使用读取租约
您必须先启用读取租约,然后才能使用它。
使用 IAM 进行访问权限控制
如需设置读取租约区域,用户需要拥有 spanner.databases.create
或 spanner.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 替换为数据库的唯一标识符。
启用读取租赁
如需在创建新数据库时启用读取租约,请在 ALTER DATABASE
(GoogleSQL、PostgreSQL)DDL 语句中设置 read_lease_regions
选项:
控制台
前往 Google Cloud 控制台中的实例页面。
选择要启用读取租约的实例。
在随即打开的实例概览页面中,点击创建数据库。
对于数据库名称,输入一个名称。
选择数据库方言。
点击创建。
Google Cloud 控制台将显示您创建的数据库的概览页面。
在导航菜单中,点击 Spanner Studio。
在 Spanner Studio 页面上,点击
新标签页或使用空白编辑器标签页。输入以下
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
。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。
点击运行。
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 DATABASE
(GoogleSQL、PostgreSQL)DDL 语句中设置 read_lease_regions
选项:
控制台
前往 Google Cloud 控制台中的实例页面。
选择要启用读取租约的实例。
选择要启用读取租约的数据库。
在导航菜单中,点击 Spanner Studio。
在 Spanner Studio 页面上,点击
新标签页或使用空白编辑器标签页。输入以下
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
。您可以为多个区域启用读取租约。请用英文逗号分隔各个区域。
点击运行。
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 DATABASE
(GoogleSQL、PostgreSQL)DDL 语句中将 read_lease_regions
选项设置为 NULL
:
控制台
前往 Google Cloud 控制台中的实例页面。
选择要停用读取租约的实例。
选择要停用读取租约的数据库。
在导航菜单中,点击 Spanner Studio。
在 Spanner Studio 页面上,点击
新标签页或使用空白编辑器标签页。输入以下
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 替换为数据库的唯一标识符。
点击运行。
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
信息架构表(GoogleSQL、PostgreSQL)或您的数据库,以确定主要区域和已启用读取租约的区域。启用读取租约的区域希望强读取具有区域内延迟。与此同时,主要区域与启用读取租约的最远区域之间的写入延迟时间会增加。
您还可以使用以下 Spanner 延迟时间指标来帮助您监控实例中的读取请求延迟时间:
spanner.googleapis.com/api/read_request_latencies_by_serving_location
您可以使用 /serving_location
字段过滤此指标。/serving location
字段表示提供请求的 Spanner 服务器的位置。
如需可用指标的完整列表,请参阅 Spanner 指标列表。
费用注意事项
从启用读取租约功能的区域提供的强读取使用的计算资源略少。另一方面,启用了读取租约功能的数据库的写入操作会使用略多的计算资源。如需了解详情,请参阅 Spanner 计算容量价格。
此功能不会影响其他价格构成要素,例如存储和网络。
后续步骤
- 详细了解 Spanner 复制。
- 详细了解在事务之外执行读取操作。