Routing basato sui leader

Questa pagina descrive il routing basato sui leader in Spanner e come utilizzarlo. Spanner utilizza il routing basato sui leader per instradare dinamicamente le transazioni di lettura e scrittura nelle configurazioni di istanze multiregionali al fine di ridurre la latenza e migliorare le prestazioni del database. Il routing basato sui leader è attivato per impostazione predefinita.

Routing Spanner per transazioni di lettura/scrittura

Spanner replica i dati per fornire ulteriori disponibilità dei dati e località geografica. Nelle configurazioni di istanze multiregionali di Spanner, una regione nella configurazione di istanze multiregionali è indicata come regione leader e contiene le repliche leader del database. Quando utilizzi una configurazione di istanze multiregionali e il client invia una transazione di lettura e scrittura al tuo database da una regione non leader, la scrittura viene sempre elaborata nella regione leader e poi inviata di nuovo alla regione non leader. Di conseguenza, le transazioni di lettura e scrittura impegnate da un'area geografica non principale richiedono più round trip per la replica leader per essere eseguite correttamente.

Il routing basato sui leader è un meccanismo che migliora la latenza per le transazioni di lettura e scrittura tramite il routing intelligente di queste transazioni. Se il routing sensibile ai leader è abilitato, anche se la scrittura non proviene dalla regione leader, le richieste di creazione delle sessioni vengono instradate alla regione leader per allineare Spanner Front End (Spanner Front End) alla regione leader. Questo meccanismo di routing migliora la latenza per le transazioni di lettura/scrittura riducendo a due il numero di round trip di rete richiesti tra la regione non leader (dove si trova l'applicazione client) e la regione leader.

Screenshot di Routing di Spanner con routing sensibile ai leader abilitato. Figura 1. Esempio di routing di Spanner con routing sensibile ai leader abilitato.

Se il routing sensibile ai leader è disabilitato, l'applicazione client instrada prima la richiesta a un servizio SpanFE all'interno della regione dell'applicazione client (regione non leader). Poi, dallo SpanFE nella regione delle applicazioni 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 round trip aggiuntivi sono necessari per supportare indici secondari, controlli dei vincoli e lettura delle scritture.

Screenshot di Routing di Spanner con routing sensibile ai leader disabilitato. Figura 2. Esempio di routing di Spanner con routing sensibile ai leader disabilitato.

Casi d'uso

Come conseguenza dell'utilizzo del routing sensibile ai leader, i seguenti casi d'uso beneficiano di una minore latenza:

  • Aggiornamenti collettivi: esecuzione di importazioni Dataflow o modifiche in background (ad esempio DML in batch) da una regione non leader.
  • Tolleranza di emergenza e maggiore disponibilità: esegui il deployment di applicazioni client nelle regioni leader e non principali per tollerare le interruzioni a livello di regione, avviando al contempo scritture da regioni non principali.
  • Applicazione globale: deployment di applicazioni client a livello globale con località regionali estese per il commit dei dati.

Limitazioni

Se il deployment dell'applicazione client è stato eseguito al di fuori della regione leader e scrivi valori senza leggere i dati ("scritture cieche"),potresti osservare una regressione della latenza se il routing sensibile ai leader è abilitato. Questo perché, quando è abilitato il routing basato sui leader, vengono eseguiti due round trip tra regioni (beginTransaction e richiesta commit) tra l'applicazione client nell'area geografica non principale e lo SpanFE nella regione leader. Tuttavia, con il routing sensibile ai leader disabilitato, le scritture senza letture richiedono solo un round trip tra regioni per la richiesta commit (beginTransaction viene elaborato nello SpanFE locale). Ad esempio, se carichi collettivamente i dati del file in una tabella appena creata, è improbabile che le transazioni leggano i dati della tabella. Se esegui spesso operazioni di scrittura senza leggerle nell'applicazione, potresti considerare la disattivazione del routing basato sui leader. Per maggiori informazioni, consulta Disattivare il routing basato sui leader.

Utilizza il routing basato sui leader

Il routing basato sui leader è abilitato per impostazione predefinita nelle librerie client di Spanner.

Ti consigliamo di elaborare le richieste di lettura/scrittura con il routing sensibile ai leader abilitato. Puoi disabilitarla per confrontare le differenze di rendimento.

Attiva il routing basato sui leader

Puoi utilizzare le librerie client di Spanner per abilitare manualmente il routing basato sui leader.

C++

Usa la struttura RouteToLeaderOption per configurare la tua applicazione client con il routing sensibile ai leader abilitato:

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 sensibile ai leader abilitato:

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

Go

Utilizza ClientConfig per configurare la tua applicazione client con il routing sensibile ai leader 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 sensibile ai leader 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 sensibile ai leader abilitato:

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

PHP

Utilizza routeToLeader per configurare la tua applicazione client con il routing sensibile ai leader 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 sensibile ai leader 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 sensibile ai leader 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 basato sui leader

Puoi utilizzare le librerie client di Spanner per disabilitare il routing basato sui leader.

C++

Usa la struttura RouteToLeaderOption per configurare la tua applicazione client con il routing sensibile ai leader disabilitato:

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 sensibile ai leader disabilitato:

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

Go

Utilizza ClientConfig per configurare la tua applicazione client con il routing sensibile ai leader 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 il routing sensibile ai leader 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 sensibile ai leader disabilitato:

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

PHP

Utilizza routeToLeader per configurare la tua applicazione client con il routing sensibile ai leader 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 sensibile ai leader 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 sensibile ai leader 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