Questa pagina descrive il routing consapevole del leader in Spanner e come utilizzarlo. Spanner utilizza il routing consapevole del leader per instradare dinamicamente le transazioni di lettura/scrittura nelle configurazioni di istanze a due regioni e multiregionali al fine di ridurre la latenza e migliorare le prestazioni nel database. Il routing che tiene conto del leader è attivo per impostazione predefinita.
Routing di Spanner per le transazioni di lettura/scrittura
Spanner replica i dati per fornire una maggiore disponibilità e località geografica dei dati. In Spanner, le configurazioni di istanze a due regioni e multiregionali, 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 multi-regione e il tuo 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 messe in atto da una regione non leader richiedono più viaggi di andata e ritorno alla replica leader per essere completate correttamente.
Il routing consapevole del leader è un meccanismo che migliora la latenza per le transazioni di lettura/scrittura indirizzandole in modo intelligente. Se è attivato il routing consapevole del leader, anche se la scrittura non proviene dalla regione leader, le richieste di creazione della sessione vengono inoltrate 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 viaggi di andata e ritorno sulla rete richiesti tra la regione non leader (dove si trova l'applicazione client) e la regione leader.
Figura 1. Esempio di routing di Spanner con il routing consapevole del leader abilitato.
Se il routing consapevole del leader è disattivato, l'applicazione client inoltra prima la richiesta a un servizio frontend dell'API Spanner all'interno della regione dell'applicazione client (regione non leader). Quindi, dal frontend dell'API Spanner nella regione dell'applicazione client, vengono eseguiti tre o più viaggi di andata e ritorno al server Spanner (SpanServer) nella regione leader per eseguire il commit della scrittura, aumentando la latenza. Questi viaggi di andata e ritorno aggiuntivi sono necessari per supportare gli indici secondari, i controlli dei vincoli e leggere le scritture.
Figura 2. Esempio di routing di Spanner con il routing consapevole del leader disattivato.
Casi d'uso
Grazie all'utilizzo del routing consapevole del leader, i seguenti casi d'uso beneficiano di una latenza inferiore:
- Aggiornamenti collettivi: esecuzione di importazioni di Dataflow o modifiche in background (ad es. comandi DML batch) da una regione non leader.
- Resilienza ai disastri e maggiore disponibilità: il deployment di applicazioni client sia nelle regioni leader che in quelle non leader per tollerare le interruzioni a livello regionale durante l'avvio delle scritture dalle regioni non leader.
- Applicazione globale: esegui il deployment di applicazioni client a livello globale con località di regioni diffuse che eseguono il commit dei dati.
Limitazioni
Se l'applicazione client viene dispiattata al di fuori della regione leader e scrivi valori senza leggere i dati ("scritture cieche"), potresti osservare una regressione della latenza se è attivato il routing consapevole del leader. Questo accade perché, quando il routing consapevole del leader è abilitato, esistono due viaggi di andata e ritorno interregionali (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 consapevole del leader disattivato, le scritture senza letture richiedono solo un viaggio di andata e ritorno interregionale per la richiesta commit
(beginTransaction
viene elaborata nel frontend dell'API Spanner locale). Ad esempio, se carichi collettivamente i dati del file in una tabella appena creata, è improbabile che le transazioni leggano i dati dalla tabella. Se esegui spesso commit di operazioni di scrittura senza
leggerle nella tua applicazione, ti consigliamo di disattivare
il routing consapevole del leader. Per ulteriori informazioni, vedi Disattivare il routing con consapevolezza del leader.
Utilizzare l'instradamento con conoscenza del leader
Il routing consapevole del leader è abilitato per impostazione predefinita nelle librerie client di Spanner.
Ti consigliamo di elaborare le richieste di lettura/scrittura con il routing consapevole del leader attivo. Puoi disattivarla per confrontare le differenze di rendimento.
Attiva il routing consapevole del leader
Puoi utilizzare le librerie client Spanner per attivare manualmente il routing consapevole del leader.
C++
Utilizza la struttura RouteToLeaderOption
per configurare l'applicazione client con il routing consapevole del 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 consapevole del leader abilitato:
// 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 consapevole del 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 l'applicazione client con il routing consapevole del 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 l'applicazione client con il routing consapevole del leader abilitato:
// 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 consapevole del 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 l'applicazione client con il routing consapevole del 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 l'applicazione client con il routing consapevole del 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 il routing con consapevolezza del leader
Puoi utilizzare le librerie client Spanner per disattivare il routing consapevole del leader.
C++
Utilizza la struttura RouteToLeaderOption
per configurare l'applicazione client con il routing consapevole del 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 l'applicazione client con il routing consapevole del 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 consapevole del 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 consapevole del 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 consapevole del 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 consapevole del 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 consapevole del 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 consapevole del 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
- Scopri di più sulle configurazioni a livello di una o più regioni, a due regioni e più regioni.
- Scopri di più sulla replica.
- Scopri come modificare la regione leader di un database.