Routing con leader

Questa pagina descrive il routing sensibile al leader in Spanner e come utilizzarlo. Spanner utilizza il routing leader-aware per instradare dinamicamente le transazioni di lettura e scrittura in configurazioni di istanze a due e più regioni per ridurre la latenza e migliorare le prestazioni nel database. Il routing sensibile al leader è abilitato per impostazione predefinita.

Routing Spanner per le transazioni di lettura/scrittura

Spanner replica i dati per fornire ulteriori disponibilità e località geografica. Nelle configurazioni di istanze a due e più regioni di Spanner, una regione nella configurazione di istanze a due e più regioni viene designata come regione leader e contiene le repliche leader del database. Quando utilizzi una configurazione di istanze 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 quindi inviata di nuovo alla regione non leader. Pertanto, le transazioni di lettura/scrittura effettuate da un'area geografica non leader richiedono più viaggi di andata e ritorno alla replica leader per essere impegnati correttamente.

Il routing leader-aware è un meccanismo che migliora la latenza per le transazioni di lettura-scrittura instradando queste transazioni in modo intelligente. Se il routing sensibile al leader è abilitato, anche se la scrittura non proviene dalla regione leader, le richieste di creazione di sessioni vengono instradate alla regione leader per allineare Spanner Front End (SpanFE) 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 (in cui si trova l'applicazione client) e la regione leader.

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 è disabilitato, l'applicazione client instrada prima la richiesta a un servizio SpanFE all'interno della regione dell'applicazione client (regione non leader). Quindi, dallo 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 tour di andata e ritorno aggiuntivi sono necessari per supportare indici secondari, i controlli dei vincoli e leggere 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 leader-aware, i seguenti casi d'uso beneficiano di una minore latenza:

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

Limitazioni

Se il deployment dell'applicazione client viene eseguito al di fuori della regione leader e scrivi valori senza leggere i dati ("blind writes"),potresti osservare una regressione della latenza se il routing sensibile al leader è abilitato. Questo perché, quando il routing sensibile al leader è abilitato, sono presenti due viaggi di andata e ritorno tra regioni (beginTransaction e la richiesta commit) tra l'applicazione client nella regione non leader e lo SpanFE nella regione leader. Tuttavia, con il routing sensibile al leader disabilitato, le scritture senza operazioni di lettura richiedono solo un round trip tra regioni per la richiesta commit (beginTransaction viene elaborato nello SpanFE locale). Ad esempio, se carichi collettivamente i dati dei file in una tabella appena creata, è improbabile che le transazioni leggano i dati della tabella. Se esegui spesso il commit di operazioni di scrittura senza leggerle nella tua applicazione, potresti considerare la disattivazione del routing leader-aware. Per maggiori informazioni, vedi Disattivare il routing sensibile al contesto.

Utilizza il routing sensibile al contesto

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

Ti consigliamo di elaborare le richieste di lettura e scrittura con il routing leader-aware abilitato. Puoi disattivarlo per confrontare le differenze di rendimento.

Abilita routing sensibile al contesto

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

C++

Utilizza la struttura RouteToLeaderOption per configurare la tua applicazione client con il routing sensibile al contesto 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 al contesto 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 al contesto 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 al contesto 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 al contesto 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 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 sensibile al contesto 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 al contesto 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 il routing con riconoscimento dei leader.

C++

Utilizza la struttura RouteToLeaderOption per configurare la tua applicazione client con il routing leader-aware disattivato:

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 al 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 al 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 al contesto 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 al 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 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 sensibile al 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 al 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