本页介绍了 Spanner 定向读取以及如何使用它。
Spanner 中的定向读取可让您灵活地将只读事务和单读取路由到双区域或多区域实例配置或自定义区域配置(可选只读区域)中的特定副本类型或区域。
优势
定向读取具有以下优势:
- 提供对跨多个区域的负载均衡工作负载的更多控制,以实现更均匀的 CPU 利用率,并避免过度预配 Spanner 实例。
- 启用工作负载隔离。您可以将分析工作负载和变更数据流读取定向到特定的 Spanner 副本,以最大限度地减少对同一 Spanner 数据库上运行的事务工作负载的影响。
支持的查询操作
查询操作 | 是否支持定向读取? |
---|---|
过时读取 | 是 |
强读取 | 是 |
读写事务 | 否 |
系统不支持对读写事务和分区 DML 类型的批量更新使用定向读取。这是因为读写事务必须在主要区域中处理。如果在读写事务中使用定向读取,则事务会失败并显示 BAD_REQUEST
错误。
限制
Spanner 定向读取具有以下限制:
- 您只能在双区域实例配置或多区域实例配置或自定义区域配置(可选只读区域)中的 Spanner 实例中使用定向读取。
- 您无法将定向读取与读写请求结合使用,因为写入请求始终由主要区域处理。
- 您无法在 Google Cloud 控制台或 Google Cloud CLI 中使用定向读取。您可以使用 REST 和 RPC API 以及 Spanner 客户端库来使用定向读取。
- 在单个定向读取中,您最多可以指定 10 个副本。
准备工作
在使用定向读取之前,请考虑以下事项:
- 如果您将读取操作路由到距离应用最近的副本或区域以外的副本或区域,应用可能会产生额外的延迟。
- 您可以根据以下条件路由流量:
- 区域名称(例如:
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
。您还可以使用
leader
或non-leader
字符串字面量指定location
参数。如果您输入leader
值,Spanner 会将您的请求定向到数据库的主副本。相反,如果您输入non-leader
值,Spanner 会在最近的非主要副本中执行请求。type
:用于处理定向读取请求的副本类型。可能的类型包括READ_WRITE
和READ_ONLY
。
autoFailoverDisabled
:默认情况下,此值设置为False
,表示已启用自动故障切换。当自动故障切换选项处于启用状态且所有指定副本均不可用或处于不健康状态时,Spanner 会将请求路由到includeReplicas
列表之外的副本。如果您停用自动故障切换选项,并且所有指定的副本都不可用或处于不健康状态,则定向读取请求会失败。可能的值包括:TRUE
(表示已停用)和FALSE
(表示已启用)。
excludeReplicas
:包含一组重复的replicaSelections
,这些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 执行定向读取:
监控
Spanner 提供了一个延迟时间指标,可帮助您监控实例中的定向读取活动。此指标可在 Cloud Monitoring 中使用。
spanner.googleapis.com/api/read_request_latencies_by_serving_location
您可以使用 /serving_location
或 /is_directed_read
字段过滤此指标。/serving location
字段指示提供请求的 Spanner 服务器的位置。/is_directed_read
字段指示是否启用了定向读取选项。
如需查看可用指标的完整列表,请参阅 Spanner 指标列表。
后续步骤
- 了解如何在事务之外执行读取操作。