Routing con leader

Questa pagina descrive il routing sensibile al leader in Spanner e come utilizzarlo. Spanner usa il routing leader-aware per il routing dinamico delle operazioni di lettura e scrittura in configurazioni di istanze a due e più regioni per ridurre latenza e migliorare le prestazioni del database. Il routing sensibile al contesto è sono abilitate per impostazione predefinita.

Routing Spanner per le transazioni di lettura/scrittura

Spanner replica i dati per fornire dati aggiuntivi disponibilità e località geografica. In Spanner Configurazioni di istanze a due e più regioni, una regione nella configurazione di istanze a due e più regioni designata come regione leader e contiene le repliche leader del database. Quando utilizzi un'istanza a due o più regioni e il client invia una transazione di lettura/scrittura al database da una regione non leader, la scrittura viene sempre elaborata nella regione leader e poi rimandato alla regione non leader. Di conseguenza, le transazioni di lettura/scrittura da una regione non leader richiedono più viaggi di andata e ritorno per il leader di eseguire il commit della replica correttamente.

Il routing leader-aware è un meccanismo che migliora la latenza in lettura e scrittura di transazioni di Google attraverso il routing intelligente di queste transazioni. Se è consapevole del leader il routing è abilitato, anche se la scrittura non proviene dalla regione leader, le richieste di creazione di sessioni vengono indirizzate alla regione leader per Spanner Front End (SpanFE) con la regione leader. Questo percorso migliora la latenza per le transazioni di lettura/scrittura riducendo il numero di round trip di rete richiesti tra la regione non leader (in cui il client dell'applicazione) e la regione leader a due.

Screenshot del routing Spanner con routing basato sul leader abilitato. Figura 1. Esempio di routing Spanner con routing sensibile al leader abilitato.

Se il routing sensibile al leader è disattivato, l'applicazione client instrada prima la richiesta a un servizio SpanFE all'interno della regione dell'applicazione client (regione non leader). Quindi, da SpanFE nella regione dell'applicazione client, vengono effettuati tre o più round trip al server Spanner (SpanServer) nella regione leader per eseguire il commit della scrittura, aumentando la latenza. Questi sono necessarie ulteriori corse di andata e ritorno per supportare indici secondari, esegue controlli e legge le scritture.

Screenshot del routing Spanner con routing sensibile al leader disabilitato. Figura 2. Esempio di routing Spanner con routing sensibile al leader disabilitato.

Casi d'uso

Come risultato dell'uso del routing sensibile al contesto, i seguenti casi d'uso offrono da una latenza più bassa:

  • Aggiornamenti collettivi: esecuzione di importazioni di Dataflow o esecuzione in background modifiche (ad esempio, DML batch) da una regione non leader.
  • Tolleranza in caso di emergenza e maggiore disponibilità: deployment del client sia nelle regioni leader che non leader per tollerare le applicazioni di interruzioni durante l'avvio delle scritture da regioni non leader.
  • Applicazione globale: deployment di applicazioni client a livello globale con località geografiche diffuse che eseguono il commit dei dati.

Limitazioni

Se il deployment della tua applicazione client viene eseguito al di fuori della regione leader scrivere valori senza leggere i dati ("scritture cieche"),potresti osservare una latenza regressione se è abilitato il routing sensibile al leader. Questo perché quando sono consapevoli dei leader il routing è abilitato, sono disponibili due viaggi di andata e ritorno tra regioni (beginTransaction e la richiesta commit) tra l'applicazione client nel gruppo non leader e SpanFE nella regione leader. Tuttavia, con il routing sensibile al contesto disabilitato, le scritture senza letture richiedono solo un round trip tra regioni per Richiesta commit (beginTransaction viene elaborata nello SpanFE locale). Per Ad esempio, se carichi collettivamente i dati di file in una tabella appena creata, le transazioni è improbabile che legga i dati dalla tabella. Se esegui spesso il commit operazioni senza leggerle nella tua applicazione, potresti prendere in considerazione disabilitando il routing leader-aware. Per ulteriori informazioni, vedi Disattiva il routing sensibile al contesto.

Utilizza il routing sensibile al contesto

Il routing sensibile al leader è abilitato per impostazione predefinita nel client Spanner librerie.

Consigliamo di elaborare le richieste di lettura/scrittura con il routing leader-aware in un bucket in cui è abilitato il controllo delle versioni. Puoi disattivarlo per confrontare le differenze di rendimento.

Abilita routing sensibile al contesto

Puoi utilizzare le librerie client di Spanner per abilitare il riconoscimento dei leader manualmente il routing.

C++

Utilizza la RouteToLeaderOption per configurare la tua applicazione client con routing sensibile al contesto attivato:

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#

Utilizza EnableLeaderRouting per configurare la tua applicazione client con il routing leader-aware abilitato:

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

Vai

Utilizza ClientConfig per configurare la tua applicazione client con il routing leader-aware abilitato:

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

Utilizza SpannerOptions.Builder per configurare la tua applicazione client con il routing leader-aware abilitato:

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

Node.js

Utilizza SpannerOptions per configurare la tua applicazione client con il routing leader-aware abilitato:

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

PHP

Usa routeToLeader per configurare la tua applicazione client con il routing leader-aware abilitato:

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

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

Python

Utilizza route_to_leader_enabled per configurare la tua applicazione client con il routing leader-aware abilitato:

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

Ruby

Utilizza self.new per configurare la tua applicazione client con il routing leader-aware abilitato:

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

Disattiva routing sensibile al contesto

Puoi utilizzare le librerie client di Spanner per disabilitare la funzionalità leader-aware i percorsi dei carichi di lavoro.

C++

Utilizza la RouteToLeaderOption per configurare la tua applicazione client con routing sensibile al contesto disattivata:

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#

Utilizza EnableLeaderRouting per configurare la tua applicazione client con il routing leader-aware disabilitato:

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

Vai

Utilizza ClientConfig per configurare la tua applicazione client con il routing leader-aware disabilitato:

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

Utilizza SpannerOptions.Builder per creare una connessione a un database Spanner con leader routing consapevole disabilitato:

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

Node.js

Utilizza SpannerOptions per configurare la tua applicazione client con il routing leader-aware disabilitato:

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

PHP

Usa routeToLeader per configurare la tua applicazione client con il routing leader-aware disabilitato:

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

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

Python

Utilizza route_to_leader_enabled per configurare la tua applicazione client con il routing leader-aware disabilitato:

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

Ruby

Utilizza self.new per configurare la tua applicazione client con il routing leader-aware disabilitato:

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

Passaggi successivi