Roteamento baseado no líder

Nesta página, descrevemos o roteamento com reconhecimento de líder no Spanner e como usá-lo. O Spanner usa roteamento com reconhecimento de líder para rotear dinamicamente transações de leitura/gravação em configurações de instância birregional e multirregional para reduzir a latência e melhorar o desempenho no banco de dados. O roteamento com reconhecimento de líder está ativado por padrão.

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

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

O roteamento com reconhecimento de líder é um mecanismo que melhora a latência de transações de leitura/gravação ao rotear essas transações de maneira inteligente. Se o roteamento com reconhecimento de líder estiver ativado, mesmo que a gravação não seja originada da 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 front-end do Spanner (SpanFE) à região do líder. Esse mecanismo de roteamento melhora a latência para transações de leitura/gravação reduzindo para dois o número de idas e voltas de rede necessárias entre a região não líder (onde o aplicativo cliente está localizado) e a região líder.

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 com reconhecimento do líder ativado.

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

Casos de uso

Como resultado do uso do roteamento com reconhecimento de líder, os seguintes casos de uso se beneficiam da menor latência:

  • Atualizações em massa: executar importações do Dataflow ou alterações em segundo plano (por exemplo, DMLs em lote) de uma região não líder.
  • Tolerância a desastres e maior disponibilidade: implantação de aplicativos clientes em regiões líderes e não líderes para tolerar interrupções regionais enquanto iniciam gravações de regiões não líderes.
  • Aplicativo global: implantar aplicativos clientes globalmente com locais de regiões generalizadas que confirmam 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 com reconhecimento de líder estiver ativado. Isso ocorre porque, quando o roteamento com reconhecimento de líder é ativado, há duas viagens de ida e volta entre regiões (beginTransaction e a solicitação commit) entre o aplicativo cliente na região não líder e o 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 é processado no SpanFE local). Por exemplo, se você carregar dados de arquivos em massa em uma tabela recém-criada, as transações provavelmente não lerão os dados da tabela. Se você confirma frequentemente operações de gravação sem lê-las no aplicativo, talvez seja melhor desativar o roteamento com reconhecimento de líder. Para mais informações, consulte Desativar o roteamento com reconhecimento de líder.

Usar o roteamento com reconhecimento de líder

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

Recomendamos que você processe suas solicitações de leitura e gravação com o roteamento com reconhecimento de líder ativado. É possível desativá-la para comparar as diferenças de desempenho.

Ativar roteamento com reconhecimento de líder

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

C++

Use a estrutura RouteToLeaderOption para configurar seu aplicativo cliente com o roteamento com reconhecimento de 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 seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

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

Go

Use 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 seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

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

Node.js

Use 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 seu aplicativo cliente com o roteamento com reconhecimento de líder ativado:

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

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

Python

Use 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

Use 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 com reconhecimento de líder

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

C++

Use a estrutura RouteToLeaderOption para configurar seu aplicativo cliente com o roteamento com reconhecimento de líderes 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#

Use 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 seu aplicativo cliente com o roteamento com reconhecimento de 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

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

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

Node.js

Use 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 seu aplicativo cliente com o roteamento com reconhecimento de líder desativado:

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

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

Python

Use 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

Use 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