本页面介绍了 Spanner 中的领导者感知型路由及其使用方法。 Spanner 使用领导者感知型路由来动态路由读写 双区域和多区域实例配置中的事务处理, 并提升数据库性能主要副本路由是 默认处于启用状态
针对读写事务的 Spanner 路由
Spanner 复制数据以提供额外的数据 。在 Spanner 中 双区域和多区域实例配置, 双区域和多区域实例配置中的一个区域 并且包含主要区域 数据库副本当您使用双区域或多区域实例时 配置,并且您的客户端会向数据库发出读写事务 则写入始终在主要区域中处理,并且 然后发送回非主要区域。因此,读写事务 从非主要区域提交需要到主要区域多次往返 才能成功提交副本
主要副本路由是一种可缩短读写延迟时间的机制 自动管理这些交易如果可感知领导者 即使写入并非来自主要区域, 会话创建请求会被路由到主要区域 具有主要区域的 Spanner 前端 (SpanFE)。此路由 机制可以减少读写事务的延迟时间, 非主要区域(即客户端所在区域)之间 将主要区域更改为 2。
图 1.启用了 leader-aware-routing 的 Spanner 路由示例。
如果停用领导者感知型路由,则客户端应用首先进行路由 向客户端应用区域内的 SpanFE 服务发送请求 (非主要区域)。然后,从客户端应用区域的 SpanFE Spanner 服务器往返次数达到或超过三次 (SpanServer) 来提交写入,从而增加延迟时间。这些 需要额外的往返次数来支持二级索引、约束条件 以及读取您的写入内容。
图 2.停用了 leader-aware-routing 的 Spanner 路由示例。
使用场景
使用领导者感知型路由后,以下用例的优势 降低延迟:
- 批量更新:执行 Dataflow 导入或在后台运行 更改(例如批量 DML) 非主要区域。
- 灾难恢复和提高可用性:部署客户端 主要区域和非主要区域中的应用,以容忍区域级 从非主要区域启动写入操作时发生服务中断。
- 全局应用:全局部署客户端应用 分布在区域位置来提交数据。
限制
如果您的客户端应用部署在主要区域之外,而您
只写入值而不读取数据(“盲写”),您可能会观察到
回归问题。这是因为
路由已启用,则有两个区域间往返(beginTransaction
和 commit
请求之间)
区域和主要区域中的 SpanFE。但是,如果使用主要副本路由,
已停用的写入(但不读取)只需要对
commit
请求(beginTransaction
在本地 SpanFE 中处理)。对于
例如,如果您将文件数据批量加载到新创建的表中,事务处理
则不太可能从表中读取数据。如果您经常提交
操作,那么您可能要考虑
停用领导者感知型路由如需了解详情,请参阅
停用主要副本感知型路由。
使用领导者感知型路由
Spanner 客户端中默认启用领导者感知型路由 库。
我们建议您使用主副本感知型路由来处理读写请求 。您可以停用该功能,以比较效果差异。
启用领导者感知型路由
您可以使用 Spanner 客户端库来实现领导者感知 。
C++
使用 RouteToLeaderOption
结构,以使用领导者感知型路由配置客户端应用
已启用:
void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;
// Create a client with RouteToLeaderOption enabled.
auto client = spanner::Client(
spanner::MakeConnection(
spanner::Database(project_id, instance_id, database_id)),
google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
spanner::true));
C#
使用EnableLeaderRouting
来配置您的客户端应用并启用领导者感知路由功能:
// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;
Go
使用ClientConfig
来配置您的客户端应用并启用领导者感知路由功能:
type ClientConfig struct {
// DisableRouteToLeader specifies if all the requests of type read-write
// and PDML need to be routed to the leader region.
// Default: false
DisableRouteToLeader false
}
Java
使用SpannerOptions.Builder
来配置您的客户端应用并启用领导者感知路由功能:
SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
使用SpannerOptions
来配置您的客户端应用并启用领导者感知路由功能:
// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});
PHP
使用routeToLeader
来配置您的客户端应用并启用领导者感知路由功能:
// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);
Python
使用route_to_leader_enabled
来配置您的客户端应用并启用领导者感知路由功能:
spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
使用self.new
来配置您的客户端应用并启用领导者感知路由功能:
def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
lib_name: nil, lib_version: nil, enable_leader_aware_routing: true) ->
Google::Cloud::Spanner::Project
停用领导者感知型路由
您可以使用 Spanner 客户端库停用领导者感知能力 路由。
C++
使用 RouteToLeaderOption
结构,以使用领导者感知型路由配置客户端应用
已停用:
void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;
// Create a client with RouteToLeaderOption disabled.
auto client = spanner::Client(
spanner::MakeConnection(
spanner::Database(project_id, instance_id, database_id)),
google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
spanner::false));
C#
使用EnableLeaderRouting
来配置客户端应用并停用领导者感知型路由:
// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;
Go
使用ClientConfig
来配置客户端应用并停用领导者感知型路由:
type ClientConfig struct {
// DisableRouteToLeader specifies if all the requests of type read-write
// and PDML need to be routed to the leader region.
// Default: false
DisableRouteToLeader true
}
Java
使用SpannerOptions.Builder
创建与包含主要副本的 Spanner 数据库的连接
已停用感知路由:
SpannerOptions options = SpannerOptions.newBuilder().disableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
使用SpannerOptions
来配置客户端应用并停用领导者感知型路由:
// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});
PHP
使用routeToLeader
来配置客户端应用并停用领导者感知型路由:
// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);
Python
使用route_to_leader_enabled
来配置客户端应用并停用领导者感知型路由:
spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
使用self.new
来配置客户端应用并停用领导者感知型路由:
def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
lib_name: nil, lib_version: nil, enable_leader_aware_routing: false) ->
Google::Cloud::Spanner::Project
后续步骤
- 了解单区域、双区域和多区域 配置。
- 了解复制。
- 了解如何修改数据库的主要区域。