Roteamento com reconhecimento de líder

Esta página descreve o roteamento ciente do líder no Spanner e como usá-lo. O Spanner usa o roteamento com reconhecimento de líder para rotear dinamicamente transações de leitura e gravação em configurações de instâncias biregionais e multirregionais para reduzir a latência e melhorar o desempenho no seu banco de dados. O roteamento baseado no líder é ativada por padrão.

Roteamento do Spanner para transações de leitura e gravação

O Spanner replica os dados para fornecer mais dados disponibilidade e localidade geográfica. No Spanner configurações de instâncias birregionais e multirregionais, uma região na configuração de instância birregional e multirregional é designada como região líder e contém as réplicas líderes do banco de dados. Quando você usa uma instância birregional ou multirregional e seu cliente emite uma transação de leitura/gravação no seu banco de dados de uma região não líder, a gravação é sempre processada na região líder e enviada de volta à região não líder. Portanto, as transações de leitura e gravação comprometidas em uma região não líder exigem várias viagens de ida e volta ao líder réplica seja confirmada com sucesso.

O roteamento ciente do líder é um mecanismo que melhora a latência das transações de leitura e gravação por meio de um roteamento inteligente. Se o roteamento com reconhecimento de líder estiver ativado, mesmo que a gravação não seja originada na região líder, as solicitações de criação de sessão serão roteadas para a região líder para alinhar o Spanner Front End (SpanFE) com a região líder. Este roteamento mecanismo melhora a latência para transações de leitura/gravação reduzindo o número de viagens de ida e volta da rede necessárias entre a região não líder (quando o cliente o aplicativo está localizado) e a região líder para dois.

Captura de tela do roteamento do Spanner com o roteamento com reconhecimento de líder ativado. Figura 1. Exemplo de roteamento do Spanner com o roteamento ciente do líder ativado.

Se o roteamento com reconhecimento de líder estiver desativado, o aplicativo cliente encaminha primeiro a solicitação para um serviço SpanFE na região do aplicativo cliente (região não líder). Em seguida, do SpanFE na região do aplicativo cliente, são feitas três ou mais viagens de ida e volta para o servidor do Spanner (SpanServer) na região líder para confirmar a gravação, aumentando a latência. Essas viagens de ida e volta adicionais são necessárias para oferecer suporte a índices secundários, verificações de restrições e leitura de gravações.

Captura de tela do roteamento do Spanner com o roteamento com reconhecimento de líder desativado. Figura 2. Exemplo de roteamento do Spanner com o roteamento com reconhecimento de líder desativado.

Casos de uso

Como resultado do uso do roteamento baseado no líder, os casos de uso a seguir beneficiam de latência menor:

  • Atualizações em massa: como executar importações do Dataflow ou execução em segundo plano mudanças, como DMLs em lote de uma região não líder.
  • Tolerância a desastres e maior disponibilidade: implantação de cliente aplicativos nas regiões líder e não líder para tolerar as mudanças falhas temporárias ao iniciar gravações de regiões não líderes.
  • Aplicativo global: como implantar aplicativos clientes globalmente com locais regionais generalizados que fazem commit de dados.

Limitações

Se o aplicativo cliente for implantado fora da região líder e você gravar valores sem ler os dados ("gravações cegas"), poderá observar uma regressão de latência se o roteamento ciente do líder estiver ativado. Isso ocorre porque, quando o líder reconhece o roteamento estiver ativado, há duas viagens de ida e volta entre regiões (beginTransaction e a solicitação commit) entre o aplicativo cliente na rede não líder e "SpanFE" na região líder. No entanto, com o roteamento com reconhecimento de líder desativado, as gravações sem leituras exigem apenas uma ida e volta entre regiões para a Solicitação commit (beginTransaction é processada no SpanFE local). Por exemplo, se você carregar dados de arquivos em massa em uma tabela recém-criada, é improvável que as transações leiam dados da tabela. Se você faz commit de gravações com frequência operações sem lê-los no aplicativo, convém considerar e desativar o roteamento com reconhecimento de líder. Para mais informações, consulte Desativar o roteamento ciente do líder.

Usar o roteamento com reconhecimento de líder

O roteamento com reconhecimento de líder é ativado por padrão no cliente Spanner bibliotecas.

Recomendamos processar suas solicitações de leitura/gravação com roteamento com reconhecimento de líder ativado. Você pode desativar esse recurso para comparar as diferenças de performance.

Ativar roteamento com reconhecimento de líder

Use as bibliotecas de cliente do Spanner para permitir reconhecimento de líderes roteamento de forma manual.

C++

Usar o RouteToLeaderOption para configurar seu aplicativo cliente com roteamento baseado em líder ativado:

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#

Use EnableLeaderRouting para configurar o aplicativo cliente com o roteamento ciente do líder ativado:

// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;

Go

Usar ClientConfig para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

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

Use SpannerOptions.Builder para configurar o aplicativo cliente com o roteamento ciente do líder ativado:

SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";

Node.js

Usar SpannerOptions para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});

PHP

Use routeToLeader para configurar o aplicativo cliente com o roteamento ciente do líder ativado:

// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);

Python

Usar route_to_leader_enabled para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

Usar self.new para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

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

Desativar o roteamento ciente do líder

É possível usar as bibliotecas de cliente do Spanner para desativar o roteamento com líder.

C++

Use a estrutura RouteToLeaderOption para configurar o aplicativo cliente com o roteamento ciente do líder desativado:

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#

Usar EnableLeaderRouting para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder desativado:

// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;

Go

Use ClientConfig para configurar o aplicativo cliente com o roteamento ciente do líder desativado:

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

Usar SpannerOptions.Builder para criar uma conexão com um banco de dados do Spanner roteamento com reconhecimento desativado:

SpannerOptions options = SpannerOptions.newBuilder().disableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";

Node.js

Usar SpannerOptions para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder desativado:

// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});

PHP

Use routeToLeader para configurar o aplicativo cliente com o roteamento ciente do líder desativado:

// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);

Python

Usar route_to_leader_enabled para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder desativado:

spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

Usar self.new para configurar seu aplicativo cliente com o roteamento com reconhecimento de líder desativado:

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

A seguir