Cette page décrit le routage avec détection des leaders dans Spanner et comment l'utiliser. Spanner utilise le routage basé sur les leaders pour acheminer de manière dynamique les transactions en lecture/écriture dans des configurations d'instances birégionales et multirégionales afin de réduire la latence et d'améliorer les performances de votre base de données. Le routage basé sur les leaders est activé par défaut.
Routage Spanner pour les transactions en lecture/écriture
Spanner réplique les données pour fournir une disponibilité des données et une localité géographique supplémentaires. Dans les configurations d'instances birégionales et multirégionales Spanner, une région est désignée comme région principale et contient les instances dupliquées principales de la base de données. Lorsque vous utilisez une configuration d'instance birégionale ou multirégionale et que votre client envoie une transaction en lecture/écriture à votre base de données à partir d'une région non principale, l'écriture est toujours traitée dans la région principale, puis renvoyée à la région non principale. Par conséquent, les transactions en lecture/écriture validées à partir d'une région non principale nécessitent que plusieurs allers-retours vers l'instance répliquée principale soient validées.
Le routage basé sur les variantes est un mécanisme qui améliore la latence des transactions en lecture-écriture en acheminant intelligemment ces transactions. Si le routage basé sur la variante optimale est activé, même si l'écriture ne provient pas de la région principale, les requêtes de création de session sont acheminées vers la région principale pour aligner Spanner Front End (SpanFE) sur la région principale. Ce mécanisme de routage améliore la latence des transactions en lecture-écriture en réduisant à deux le nombre d'allers-retours sur le réseau requis entre la région non principale (où se trouve l'application cliente) et la région principale.
Figure 1. Exemple de routage Spanner avec le routage basé sur les dirigeants activé.
Si le routage basé sur les variantes principales est désactivé, l'application cliente achemine d'abord la requête vers un service SpanFE dans la région de l'application cliente (région non principale). Ensuite, à partir du SpanFE dans la région de l'application cliente, trois allers-retours ou plus sont effectués vers le serveur Spanner (SpanServer) dans la région principale pour valider l'écriture, ce qui augmente la latence. Ces allers-retours supplémentaires sont nécessaires pour prendre en charge les index secondaires, les vérifications des contraintes et la lecture de vos écritures.
Figure 2. Exemple de routage Spanner avec le routage basé sur les responsables désactivé
Cas d'utilisation
Grâce au routage basé sur les leaders, les cas d'utilisation suivants bénéficient d'une latence plus faible:
- Mises à jour groupées: exécution d'importations Dataflow ou de modifications en arrière-plan (par exemple, des LMD par lot) à partir d'une région non principale.
- Tolérance aux sinistres et disponibilité accrue: déploiement d'applications clientes dans les régions principales et non principales pour tolérer des pannes régionales, tout en lançant des écritures à partir de régions non principales.
- Application mondiale: déploiement d'applications clientes dans le monde entier avec des emplacements régionaux très étendus qui valident des données.
Limites
Si votre application cliente est déployée en dehors de la région principale et que vous écrivez des valeurs sans lire les données ("écritures à l'aveugle"),vous pouvez observer une régression de la latence si le routage basé sur la variante optimale est activé. En effet, lorsque le routage basé sur la variante optimale est activé, il y a deux allers-retours interrégionaux (beginTransaction
et la requête commit
) entre l'application cliente dans la région non principale et le SpanFE dans la région principale. Toutefois, lorsque le routage basé sur les leaders est désactivé, les opérations d'écriture sans lecture ne nécessitent qu'un aller-retour interrégional pour la requête commit
(beginTransaction
est traité dans le segment SpanFE local). Par exemple, si vous chargez des données de fichier de manière groupée dans une table nouvellement créée, il est peu probable que les transactions lisent les données de la table. Si vous validez fréquemment des opérations d'écriture sans les lire dans votre application, vous pouvez envisager de désactiver le routage avec détection des leaders. Pour en savoir plus, consultez la section Désactiver le routage basé sur les responsables.
Utiliser le routage basé sur les responsables
Le routage basé sur les variantes est activé par défaut dans les bibliothèques clientes Spanner.
Nous vous recommandons d'activer le routage basé sur les responsables pour traiter vos requêtes en lecture/écriture. Vous pouvez la désactiver pour comparer les différences de performances.
Activer le routage basé sur les dirigeants
Vous pouvez utiliser les bibliothèques clientes Spanner pour activer manuellement le routage basé sur les leaders.
C++
Utilisez la structure RouteToLeaderOption
pour configurer votre application cliente avec le routage basé sur les leaders:
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#
Utilisez EnableLeaderRouting
pour configurer votre application cliente avec le routage basé sur les responsables activé:
// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;
Go
Utilisez ClientConfig
pour configurer votre application cliente avec le routage basé sur les responsables activé:
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
Utilisez SpannerOptions.Builder
pour configurer votre application cliente avec le routage basé sur les responsables activé:
SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
Utilisez SpannerOptions
pour configurer votre application cliente avec le routage basé sur les responsables activé:
// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});
PHP
Utilisez routeToLeader
pour configurer votre application cliente avec le routage basé sur les responsables activé:
// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);
Python
Utilisez route_to_leader_enabled
pour configurer votre application cliente avec le routage basé sur les responsables activé:
spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
Utilisez self.new
pour configurer votre application cliente avec le routage basé sur les responsables activé:
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
Désactiver le routage basé sur les leaders
Vous pouvez utiliser les bibliothèques clientes Spanner pour désactiver le routage basé sur les responsables.
C++
Utilisez la structure RouteToLeaderOption
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
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#
Utilisez EnableLeaderRouting
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;
Go
Utilisez ClientConfig
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
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
Utilisez SpannerOptions.Builder
pour créer une connexion à une base de données Spanner en désactivant le routage basé sur les leaders:
SpannerOptions options = SpannerOptions.newBuilder().disableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
Utilisez SpannerOptions
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});
PHP
Utilisez routeToLeader
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);
Python
Utilisez route_to_leader_enabled
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
Utilisez self.new
pour configurer votre application cliente en désactivant le routage basé sur les responsables:
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
Étapes suivantes
- Découvrez les configurations régionales, birégionales et multirégionales.
- Apprenez-en plus sur la réplication.
- Découvrez comment modifier la région principale d'une base de données.