本页面介绍了 Spanner 定向读取及其使用方法。
Spanner 中的定向读取可让您灵活地将只读事务和单次读取路由到多区域实例配置中的特定副本类型或区域,或具有可选只读区域的自定义区域配置。
常见使用场景
定向读取的一些常见用例包括:
- 跨多个区域对工作负载进行负载均衡,以实现更统一的 CPU 利用率。
- 通过最大限度地减少对事务工作负载的影响,将分析隔离在应用中。
- 为变更数据流读取提供部分隔离。如果您使用 Spanner API 流式传输 Spanner 数据更改,则可以使用定向读取来帮助最大限度地减少对事务性工作负载的影响。
支持的查询操作
查询操作 | 是否支持定向读取? |
---|---|
过时读取 | 是 |
强读取 | 是 |
读写事务 | 否 |
读写事务和分区 DML 类型的批量更新不支持定向读取。这是因为读写事务必须在主要区域中处理。如果在读写事务中使用定向读取,则事务将失败并显示 BAD_REQUEST
错误。
限制
Spanner 的定向读取具有以下限制:
- 您只能在采用多区域实例配置的 Spanner 实例或具有可选只读区域的自定义区域配置中使用定向读取。
- 您不能将定向读取与读写请求结合使用,因为写入请求始终由主要区域处理。
- 您不能在 Google Cloud 控制台或 Google Cloud CLI 中使用定向读取。它可通过 REST 和 RPC API 以及 Spanner 客户端库使用。
- 您可以在单个定向读取中最多指定 10 个副本。
- 如果您使用 System Insights 信息中心或 Metrics Explorer,在“每秒操作次数”“每秒操作次数(按数据库)”和“每秒操作次数(按 API 方法)”图表中,您可能会在您指定的位置以外的位置看到定向读取请求。在这种情况下,图表中的信息可能不正确。您可以使用 CPU 利用率指标来确认读取请求是否已路由到选定区域。这些指标显示了有关定向读取流量被路由到何处的最准确信息。
准备工作
在使用定向读取之前,请考虑以下几点:
- 如果您将读取路由到除了距离应用最近的副本或区域之外,则应用可能会产生额外的延迟时间。
- 您可以根据以下条件路由流量:
- 地区名称(例如:
us-central1
)。 - 副本类型(可能的值:
READ_ONLY
和READ_WRITE
)。
- 地区名称(例如:
- 定向读取中的自动故障切换选项默认处于启用状态。如果启用了自动故障切换选项,并且所有指定的副本都不可用或运行状况不佳,则 Spanner 会将请求路由到
includeReplicas
列表之外的副本。如果您停用自动故障切换选项,并且所有指定的副本都不可用或运行状况不佳,则定向读取请求将失败。
定向读取参数
如果您使用 REST 或 RPC API 执行定向读取,则必须在 directedReadOptions
参数中定义这些字段。您只能添加 includeReplicas
和 excludeReplicas
中的一个,不能同时添加两者。
includeReplicas
:包含一组重复的replicaSelections
。此列表指示应考虑按顺序读取特定区域或副本类型的定向读取。您最多可以指定 10 个includeReplicas
。replicaSelections
:包含处理定向读取请求的location
或副本type
。如果您使用includeReplicas
,则必须至少提供以下字段中的一个:location
:传送定向读取请求的位置。该位置必须是数据库多区域配置中的其中一个区域。如果该位置不是数据库多区域配置内的区域之一,则请求将不会按预期路由。而是由最近的区域提供服务。例如,在多区域实例配置nam6
中,您可以将读取定向到数据库的位置us-central1
。type
:处理定向读取请求的副本类型。可能的类型包括READ_WRITE
和READ_ONLY
。
autoFailoverDisabled
:默认设置为False
,表示启用自动故障切换。启用自动故障切换选项后,如果所有指定副本都不可用或运行状况不佳,则 Spanner 会将请求路由到includeReplicas
列表之外的副本。如果您停用自动故障切换选项,并且所有指定副本都不可用或运行状况不佳,则定向读取请求将失败。可能的值包括TRUE
(表示已停用)和FALSE
(表示已启用)。
excludeReplicas
:包含从服务请求中排除的一组重复的replicaSelections
。Spanner 不会将请求路由到此列表中的副本。replicaSelections
:从传送定向读取请求中排除的位置或副本类型。如果您使用excludeReplicas
,则必须至少提供以下字段中的一个:location
:从传送定向读取请求中排除的位置。type
:从处理定向读取请求中排除的副本类型。可能的类型包括READ_WRITE
和READ_ONLY
。
如需查看 REST 请求正文的内容示例,请点击使用定向读取部分中的 REST 标签页。
使用定向读取
您可以使用 Spanner 客户端库以及 REST 和 RPC API 来执行定向读取。
客户端库
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
REST
您可以使用以下 REST API 执行定向读取:
例如,如需使用 executeSQL
在 us-central1
中执行定向读取,请使用以下代码:
对于 session,输入:
projects/<VAR>PROJECT-ID</VAR>/instances/<VAR>INSTANCE-ID</VAR>/databases/<VAR>DATABASE-ID</VAR>/sessions/<VAR>SESSION-ID</VAR>
请替换以下内容:
- PROJECT-ID:项目 ID。
- INSTANCE-ID:实例 ID。
- DATABASE-ID:数据库 ID。
- SESSION-ID:会话 ID。您在创建会话时会收到
SESSION-ID
值。
对于 Request body,使用以下内容:
{ "directedReadOptions": { "includeReplicas": { "replicaSelections": [ { "location": "us-central1", } ] } }, "sql": "SELECT SingerId, AlbumId, AlbumTitle FROM Albums" }
点击 Execute。该响应会显示查询结果。
远程过程调用 (RPC)
您可以使用以下 RPC API 执行定向读取:
后续步骤
- 了解如何在事务外部执行读取操作。