本页介绍了 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 指标列表。
后续步骤
- 了解如何执行事务之外的读取。