Enrutamiento con reconocimiento de líder

En esta página se describe el enrutamiento con reconocimiento de líder en Spanner y cómo usarlo. Spanner usa el enrutamiento consciente del líder para enrutar dinámicamente las transacciones de lectura y escritura en configuraciones de instancias de dos regiones y multirregionales para reducir la latencia y mejorar el rendimiento de tu base de datos. El enrutamiento con reconocimiento de líder está habilitado de forma predeterminada.

Rutas de Spanner para transacciones de lectura y escritura

Spanner replica los datos para proporcionar disponibilidad de datos adicional y localidad geográfica. En las configuraciones de instancias birregionales y multirregionales de Spanner, una de las regiones se designa como región principal y contiene las réplicas principales de la base de datos. Cuando usas una configuración de instancia birregional o multirregional y tu cliente envía una transacción de lectura y escritura a tu base de datos desde una región que no es la principal, la escritura siempre se procesa en la región principal y, a continuación, se envía de vuelta a la región que no es la principal. Por lo tanto, las transacciones de lectura y escritura confirmadas desde una región que no es la principal requieren varios viajes de ida y vuelta a la réplica principal para confirmarse correctamente.

El enrutamiento con reconocimiento de líder es un mecanismo que mejora la latencia de las transacciones de lectura y escritura mediante el enrutamiento inteligente de estas transacciones. Si el enrutamiento con reconocimiento del líder está habilitado, aunque la escritura no se origine en la región líder, las solicitudes de creación de sesiones se enrutan a la región líder para alinear el frontend de la API de Spanner con la región líder. Este mecanismo de enrutamiento mejora la latencia de las transacciones de lectura y escritura, ya que reduce a dos el número de viajes de ida y vuelta de la red necesarios entre la región no principal (donde se encuentra la aplicación cliente) y la región principal.

Captura de pantalla del enrutamiento de Spanner con la opción de enrutamiento con reconocimiento de líder habilitada. Imagen 1. Ejemplo de enrutamiento de Spanner con la opción de enrutamiento consciente del líder habilitada.

Si el enrutamiento con reconocimiento de líder está inhabilitado, la aplicación cliente primero enruta la solicitud a un servicio frontend de la API de Spanner en la región de la aplicación cliente (región no líder). A continuación, desde el frontend de la API de Spanner en la región de la aplicación cliente, se realizan tres o más viajes de ida y vuelta al servidor de Spanner (SpanServer) en la región principal para confirmar la escritura, lo que aumenta la latencia. Estos viajes de ida y vuelta adicionales son necesarios para admitir índices secundarios, comprobaciones de restricciones y lecturas de tus escrituras.

Captura de pantalla del enrutamiento de Spanner con el enrutamiento consciente del líder inhabilitado. Imagen 2. Ejemplo de enrutamiento de Spanner con la función de enrutamiento consciente del líder inhabilitada.

Casos prácticos

Gracias al enrutamiento con reconocimiento del líder, los siguientes casos prácticos se benefician de una latencia más baja:

  • Actualizaciones en bloque: ejecutar importaciones de Dataflow o realizar cambios en segundo plano (por ejemplo, DMLs por lotes) desde una región que no sea la principal.
  • Tolerancia a desastres y mayor disponibilidad: implementa aplicaciones cliente en regiones líderes y no líderes para tolerar las interrupciones regionales mientras inicias escrituras desde regiones no líderes.
  • Aplicación global: despliega aplicaciones cliente a nivel mundial con ubicaciones de regiones generalizadas que confirman datos.

Limitaciones

Si tu aplicación cliente se implementa fuera de la región principal y escribes valores sin leer los datos ("escrituras ciegas"), es posible que observes una regresión de la latencia si el enrutamiento con reconocimiento de la réplica principal está habilitado. Esto se debe a que, cuando se habilita el enrutamiento con reconocimiento del líder, hay dos viajes de ida y vuelta entre regiones (beginTransaction y la solicitud commit) entre la aplicación cliente de la región no líder y el frontend de la API de Spanner de la región líder. Sin embargo, si el enrutamiento con reconocimiento de líder está inhabilitado, las escrituras sin lecturas solo requieren un viaje de ida y vuelta entre regiones para la solicitud commit (beginTransaction se procesa en el frontend de la API de Spanner local). Por ejemplo, si carga datos de un archivo de forma masiva en una tabla recién creada, es poco probable que las transacciones lean datos de la tabla. Si realizas operaciones de escritura con frecuencia sin leerlas en tu aplicación, te recomendamos que desactives el enrutamiento consciente del líder. Para obtener más información, consulta Inhabilitar el enrutamiento con reconocimiento de líder.

Usar el enrutamiento con reconocimiento de líder

El enrutamiento consciente del líder está habilitado de forma predeterminada en las bibliotecas de cliente de Spanner.

Te recomendamos que proceses tus solicitudes de lectura y escritura con el enrutamiento consciente del líder habilitado. Puede inhabilitarlo para comparar las diferencias de rendimiento.

Habilitar el enrutamiento con reconocimiento de líder

Puedes usar las bibliotecas de cliente de Spanner para habilitar el enrutamiento con reconocimiento de líder manualmente.

C++

Usa la estructura RouteToLeaderOption para configurar tu aplicación cliente con el enrutamiento con reconocimiento de líder habilitado:

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#

Usa EnableLeaderRouting para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

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

Go

Usa ClientConfig para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

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

Usa SpannerOptions.Builder para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

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

Node.js

Usa SpannerOptions para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

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

PHP

Usa routeToLeader para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);

Python

Usa route_to_leader_enabled para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

Usa self.new para configurar tu aplicación cliente con el enrutamiento consciente del líder habilitado:

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

Inhabilitar el enrutamiento con reconocimiento de líder

Puedes usar las bibliotecas de cliente de Spanner para inhabilitar el enrutamiento con reconocimiento de líder.

C++

Usa la estructura RouteToLeaderOption para configurar tu aplicación cliente con el enrutamiento con reconocimiento de líder inhabilitado:

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#

Usa EnableLeaderRouting para configurar tu aplicación cliente con el enrutamiento consciente del líder inhabilitado:

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

Go

Usa ClientConfig para configurar tu aplicación cliente con el enrutamiento consciente del líder inhabilitado:

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

Usa SpannerOptions.Builder para crear una conexión a una base de datos de Spanner con el enrutamiento consciente del líder inhabilitado:

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

Node.js

Usa SpannerOptions para configurar tu aplicación cliente con el enrutamiento consciente del líder inhabilitado:

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

PHP

Usa routeToLeader para configurar tu aplicación cliente con el enrutamiento consciente del líder inhabilitado:

// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;

$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);

Python

Usa route_to_leader_enabled para configurar tu aplicación cliente con el enrutamiento consciente del líder inhabilitado:

spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

Ruby

Usa self.new para configurar tu aplicación cliente con el enrutamiento consciente del líder inhabilitado:

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

Siguientes pasos