本页面介绍了 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
或location
non-leader
字符串字面量。如果您输入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 API 和 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 提供了一个延迟时间指标,帮助您监控 读取实例中的 activity。该指标适用于 Cloud Monitoring。
spanner.googleapis.com/api/read_request_latencies_by_serving_location
您可以使用 /serving_location
或
/is_directed_read
字段。/serving location
字段用于指明
请求来源的 Spanner 服务器的位置。/is_directed_read
字段指示是否启用了定向读取选项。
如需查看可用指标的完整列表,请参阅 Spanner 的指标列表。
后续步骤
- 了解如何执行事务之外的读取。