领导者感知型路由

本页面介绍了 Spanner 中的领导者感知型路由及其使用方法。 Spanner 使用领导者感知型路由来动态路由读写 双区域和多区域实例配置中的事务处理, 并提升数据库性能主要副本路由是 默认处于启用状态

针对读写事务的 Spanner 路由

Spanner 复制数据以提供额外的数据 。在 Spanner 中 双区域和多区域实例配置, 双区域和多区域实例配置中的一个区域 并且包含主要区域 数据库副本当您使用双区域或多区域实例时 配置,并且您的客户端会向数据库发出读写事务 则写入始终在主要区域中处理,并且 然后发送回非主要区域。因此,读写事务 从非主要区域提交需要到主要区域多次往返 才能成功提交副本

主要副本路由是一种可缩短读写延迟时间的机制 自动管理这些交易如果可感知领导者 即使写入并非来自主要区域, 会话创建请求会被路由到主要区域 具有主要区域的 Spanner 前端 (SpanFE)。此路由 机制可以减少读写事务的延迟时间, 非主要区域(即客户端所在区域)之间 将主要区域更改为 2。

屏幕截图:启用了 leader-aware-routing 的 Spanner 路由。 图 1.启用了 leader-aware-routing 的 Spanner 路由示例。

如果停用领导者感知型路由,则客户端应用首先进行路由 向客户端应用区域内的 SpanFE 服务发送请求 (非主要区域)。然后,从客户端应用区域的 SpanFE Spanner 服务器往返次数达到或超过三次 (SpanServer) 来提交写入,从而增加延迟时间。这些 需要额外的往返次数来支持二级索引、约束条件 以及读取您的写入内容。

屏幕截图:已停用 leader-aware-routing 的 Spanner 路由。 图 2.停用了 leader-aware-routing 的 Spanner 路由示例。

使用场景

使用领导者感知型路由后,以下用例的优势 降低延迟:

  • 批量更新:执行 Dataflow 导入或在后台运行 更改(例如批量 DML) 非主要区域。
  • 灾难恢复和提高可用性:部署客户端 主要区域和非主要区域中的应用,以容忍区域级 从非主要区域启动写入操作时发生服务中断。
  • 全局应用:全局部署客户端应用 分布在区域位置来提交数据。

限制

如果您的客户端应用部署在主要区域之外,而您 只写入值而不读取数据(“盲写”),您可能会观察到 回归问题。这是因为 路由已启用,则有两个区域间往返(beginTransactioncommit 请求之间) 区域和主要区域中的 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

后续步骤