Routing consapevole del leader

Questa pagina descrive il routing con riconoscimento della replica leader in Spanner e come utilizzarlo. Spanner utilizza il routing con riconoscimento della replica leader per instradare dinamicamente le transazioni di lettura/scrittura nelle configurazioni di istanze a due regioni e multiregionali per ridurre la latenza e migliorare il rendimento del database. Il routing con riconoscimento della replica leader è attivato per impostazione predefinita.

Routing di Spanner per le transazioni di lettura/scrittura

Spanner replica i dati per fornire maggiore disponibilità dei dati e località geografica. Nelle configurazioni di istanze a due regioni e multiregionali di Spanner , una regione nella configurazione di istanze a due regioni e multiregionali è designata come regione leader e contiene le repliche leader del database. Quando utilizzi una configurazione di istanze a due regioni o multiregionali e il client emette una transazione di lettura/scrittura nel database da una regione non leader, la scrittura viene sempre elaborata nella regione leader e poi inviata di nuovo alla regione non leader. Pertanto, le transazioni di lettura/scrittura di cui è stato eseguito il commit da una regione non leader richiedono più round trip alla replica leader per essere eseguite correttamente.

Il routing con riconoscimento della replica leader è un meccanismo che migliora la latenza per le transazioni di lettura/scrittura instradando in modo intelligente queste transazioni. Se il routing con riconoscimento della replica leader è attivato, anche se la scrittura non ha origine dalla regione leader, le richieste di creazione della sessione vengono instradate alla regione leader per allineare il frontend dell'API Spanner 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 necessari tra la regione non leader (in cui si trova l'applicazione client) e la regione leader.

Screenshot del routing Spanner con il routing leader-aware-routing abilitato. Figura 1. Esempio di routing di Spanner con il routing con riconoscimento della replica leader attivato.

Se il routing con riconoscimento della replica leader è disattivato, l'applicazione client instrada prima la richiesta a un servizio frontend dell'API Spanner all'interno della regione dell'applicazione client (regione non leader). Poi, dal frontend dell'API Spanner 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 round trip aggiuntivi sono necessari per supportare gli indici secondari, i controlli dei vincoli e la lettura delle scritture.

Screenshot del routing Spanner con il routing leader-aware disattivato. Figura 2. Esempio di routing di Spanner con il routing con riconoscimento della replica leader disattivato.

Casi d'uso

Grazie all'utilizzo del routing con riconoscimento della replica leader, i seguenti casi d'uso beneficiano di una latenza inferiore:

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

Limitazioni

Se l'applicazione client viene eseguita al di fuori della regione leader e scrivi valori senza leggere i dati ("scritture cieche"), potresti osservare una regressione della latenza se il routing con riconoscimento della replica leader è attivato. Questo perché, quando il routing con riconoscimento della replica leader è attivato, ci sono due round trip tra regioni (beginTransaction e la richiesta commit) tra l'applicazione client nella regione non leader e il frontend dell'API Spanner nella regione leader. Tuttavia, con il routing con riconoscimento della replica leader disattivato, le scritture senza letture richiedono un solo round trip tra regioni per la richiesta commit (beginTransaction viene elaborata nel frontend dell'API Spanner locale). Ad esempio, se carichi collettivamente i dati in una tabella appena creata, è improbabile che le transazioni leggano i dati dalla tabella. Se esegui spesso il commit delle operazioni di scrittura senza leggerle nell'applicazione, potresti prendere in considerazione la possibilità di disattivare il routing con riconoscimento della replica leader. Per ulteriori informazioni, consulta Disattivare il routing con riconoscimento della replica leader.

Utilizzare il routing con riconoscimento della replica leader

Il routing con riconoscimento della replica leader è attivato per impostazione predefinita nelle librerie client di Spanner.

Ti consigliamo di elaborare le richieste di lettura/scrittura con il routing con riconoscimento della replica leader attivato. Puoi disattivarlo per confrontare le differenze di rendimento.

Attivare il routing con riconoscimento della replica leader

Puoi utilizzare le librerie client di Spanner per attivare manualmente il routing con riconoscimento della replica leader.

C++

Utilizza la RouteToLeaderOption struttura per configurare l'applicazione client con il routing con riconoscimento della replica leader 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 l'applicazione client con il routing con riconoscimento della replica leader attivato:

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

Vai

Utilizza ClientConfig per configurare l'applicazione client con il routing con riconoscimento della replica leader attivato:

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 l'applicazione client con il routing con riconoscimento della replica leader attivato:

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

Node.js

Utilizza SpannerOptions per configurare l'applicazione client con il routing con riconoscimento della replica leader attivato:

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

PHP

Utilizza routeToLeader per configurare l'applicazione client con il routing con riconoscimento della replica leader attivato:

// 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 l'applicazione client con il routing con riconoscimento della replica leader attivato:

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 l'applicazione client con il routing con riconoscimento della replica leader attivato:

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

Disattivare il routing con riconoscimento della replica leader

Puoi utilizzare le librerie client di Spanner per disattivare il routing con riconoscimento della replica leader.

C++

Utilizza la RouteToLeaderOption struttura per configurare l'applicazione client con il routing con riconoscimento della replica leader 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 l'applicazione client con il routing con riconoscimento della replica leader disattivato:

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

Vai

Utilizza ClientConfig per configurare l'applicazione client con il routing con riconoscimento della replica leader disattivato:

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 con riconoscimento della replica leader disattivato:

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

Node.js

Utilizza SpannerOptions per configurare l'applicazione client con il routing con riconoscimento della replica leader disattivato:

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

PHP

Utilizza routeToLeader per configurare l'applicazione client con il routing con riconoscimento della replica leader disattivato:

// 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 l'applicazione client con il routing con riconoscimento della replica leader disattivato:

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 l'applicazione client con il routing con riconoscimento della replica leader disattivato:

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