Routage basé sur la variante optimale

Cette page décrit le routage basé sur la variante optimale dans Spanner et explique comment l'utiliser. Spanner utilise le routage compatible avec les instances principales pour acheminer de manière dynamique les transactions en lecture-écriture dans des configurations d'instances multirégionales afin de réduire la latence et d'améliorer les performances de votre base de données. Le routage tenant compte de la variante optimale est activé par défaut.

Routage Spanner pour les transactions en lecture-écriture

Spanner réplique les données pour fournir davantage de disponibilité et de localité géographique des données. Dans les configurations d'instances multirégionales Spanner, une région est désignée comme région principale et contient les instances répliquées principales de la base de données. Lorsque vous utilisez une configuration d'instance multirégionale et que votre client émet une transaction en lecture-écriture sur 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 vers cette région. Par conséquent, les transactions en lecture-écriture validées à partir d'une région non principale nécessitent plusieurs allers-retours vers l'instance répliquée principale pour être validées.

Le routage tenant compte de la variante optimale est un mécanisme qui améliore la latence des transactions en lecture/écriture en acheminant intelligemment ces transactions. Si le routage tenant compte de 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 cette région afin d'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 réseau requis entre la région non principale (où se trouve l'application cliente) et la région principale.

Capture d'écran du routage Spanner avec le routage tenant compte de l'instance principale activé.Figure 1. Exemple de routage Spanner avec le routage prenant en compte l'origine activée.

Si le routage tenant compte du nœud principal est désactivé, l'application cliente achemine d'abord la requête vers un service SpanFE dans la région de l'application cliente (autre que la région principale). Ensuite, à partir du SpanFE de 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.

Capture d'écran du routage Spanner avec le routage compatible avec les instances principales désactivé.Figure 2. Exemple de routage Spanner avec le routage compatible avec l'instance principale désactivé.

Cas d'utilisation

Grâce à l'utilisation du routage basé sur la variante optimale, les cas d'utilisation suivants bénéficient d'une latence plus faible:

  • Mises à jour groupées: exécuter des importations Dataflow ou des 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 les pannes régionales tout en lançant des écritures depuis des régions non principales.
  • Application mondiale: déploiement à l'échelle mondiale d'applications clientes avec des emplacements régionaux étendus qui valident les 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 risquez d'observer une régression de la latence si le routage tenant compte de la variante optimale est activé. En effet, lorsque le routage tenant compte de 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 le responsable est désactivé, les écritures sans lecture ne nécessitent qu'un aller-retour interrégional pour la requête commit (beginTransaction est traité dans le SpanFE local). Par exemple, si vous chargez des données de fichiers de manière groupée dans une nouvelle table, 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 basé sur la variante optimale. Pour en savoir plus, consultez la section Désactiver le routage basé sur la variante optimale.

Utiliser le routage basé sur la variante optimale

Le routage tenant compte de la variante optimale est activé par défaut dans les bibliothèques clientes Spanner.

Nous vous recommandons de traiter vos requêtes en lecture/écriture en activant le routage basé sur l'instance principale. Vous pouvez le désactiver pour comparer les différences de performances.

Activer le routage basé sur la variante optimale

Vous pouvez utiliser les bibliothèques clientes Spanner pour activer manuellement le routage basé sur l'instance leader.

C++

Utilisez la structure RouteToLeaderOption pour configurer votre application cliente avec le routage basé sur la variante optimale:

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 la variante optimale:

// 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 la variante optimale:

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 la variante optimale:

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 la variante optimale:

// 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 la variante optimale:

// 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 la variante optimale:

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 la variante optimale:

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 la variante optimale

Vous pouvez utiliser les bibliothèques clientes Spanner pour désactiver le routage basé sur l'instance leader.

C++

Utilisez la structure RouteToLeaderOption pour configurer votre application cliente en désactivant le routage basé sur la variante optimale:

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 la variante optimale:

// 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 la variante optimale:

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 sensible:

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 la variante optimale:

// 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 l'instance principale:

// 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 la variante optimale:

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 la variante optimale:

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