En esta página, se describe el enrutamiento adaptado al líder en Spanner y cómo usarlo. Spanner usa el enrutamiento adaptado a líderes para enrutar de forma dinámica las transacciones de lectura y escritura en la configuración de instancias multirregionales a fin de reducir la latencia y mejorar el rendimiento de la base de datos. El enrutamiento adaptado a líderes está habilitado de forma predeterminada.
Enrutamiento de Spanner para transacciones de lectura y escritura
Spanner replica los datos para proporcionar disponibilidad de datos adicionales y localidad geográfica. En los parámetros de configuración de instancias multirregionales de Spanner, una región en la configuración de instancias multirregional se designa como la región líder y contiene las réplicas líderes de la base de datos. Cuando usas una configuración de instancias multirregional y tu cliente emite una transacción de lectura y escritura a tu base de datos desde una región no líder, la escritura siempre se procesa en la región líder y, luego, se envía de vuelta a la región no líder. Por lo tanto, las transacciones de lectura y escritura confirmadas desde una región no líder requieren que varios recorridos de ida y vuelta a la réplica líder se confirmen de forma correcta.
El enrutamiento adaptado al 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 adaptado a líderes está habilitado, incluso si la escritura no se origina 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 Spanner (SpanFE) con la región líder. Este mecanismo de enrutamiento mejora la latencia para las transacciones de lectura y escritura, ya que reduce a dos la cantidad de recorridos de ida y vuelta de la red necesarios entre la región no líder (donde se encuentra la aplicación cliente) y la región líder.
Figura 1. Ejemplo de enrutamiento de Spanner con el enrutamiento adaptado al líder habilitado.
Si el enrutamiento adaptado al líder está inhabilitado, la aplicación cliente primero enruta la solicitud a un servicio de SpanFE dentro de la región de la aplicación cliente (región no líder). Luego, desde SpanFE en la región de la aplicación cliente, se realizan tres o más recorridos de ida y vuelta al servidor de Spanner (SpanServer) en la región líder para confirmar la escritura, lo que aumenta la latencia. Estos recorridos de ida y vuelta adicionales son necesarios para admitir índices secundarios, verificaciones de restricciones y leer tus escrituras.
Figura 2. Ejemplo de enrutamiento de Spanner con el enrutamiento adaptado al líder inhabilitado.
Casos de uso
Como resultado del enrutamiento adaptado al líder, los siguientes casos de uso se benefician de una latencia más baja:
- Actualizaciones masivas: Ejecutar importaciones de Dataflow o cambios en segundo plano (por ejemplo, DML por lotes) desde una región no líder
- Tolerancia a desastres y mayor disponibilidad: Se implementan aplicaciones cliente en regiones líderes y no líderes para tolerar interrupciones regionales y, al mismo tiempo, iniciar operaciones de escritura desde regiones no líderes.
- Aplicación global: Implementación de aplicaciones cliente a nivel global con ubicaciones regionales generalizadas que confirman datos.
Limitaciones
Si tu aplicación cliente se implementa fuera de la región líder y escribes valores sin leer los datos ("escrituras ocultas"),es posible que observes una regresión de latencia si el enrutamiento adaptado al líder está habilitado. Esto se debe a que, cuando se habilita el enrutamiento adaptado a líderes, hay dos viajes de ida y vuelta entre regiones (beginTransaction
y la solicitud commit
) entre la aplicación cliente en la región no líder y el SpanFE en la región líder. Sin embargo, con el enrutamiento adaptado al líder inhabilitado, las operaciones de escritura sin lecturas solo requieren un recorrido de ida y vuelta entre regiones para la solicitud commit
(beginTransaction
se procesa en el SpanFE local). Por ejemplo, si cargas datos de archivos de forma masiva en una tabla recién creada, es poco probable que las transacciones lean los datos de la tabla. Si con frecuencia confirmas operaciones de escritura sin leerlas en tu aplicación, te recomendamos que consideres inhabilitar el enrutamiento adaptado al líder. Para obtener más información, consulta Inhabilita el enrutamiento adaptado al líder.
Usa el enrutamiento adaptado al líder
El enrutamiento adaptado a líderes está habilitado de forma predeterminada en las bibliotecas cliente de Spanner.
Recomendamos procesar tus solicitudes de lectura y escritura con el enrutamiento adaptado al líder habilitado. Puedes inhabilitarla para comparar las diferencias de rendimiento.
Habilitar el enrutamiento adaptado al líder
Puedes usar las bibliotecas cliente de Spanner para habilitar el enrutamiento adaptado al líder de forma manual.
C++
Usa la estructura RouteToLeaderOption
para configurar la aplicación cliente con el enrutamiento adaptado al 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 adaptado al 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 adaptado al 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 adaptado al 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 adaptado al 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 adaptado al 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 adaptado al líder habilitado:
spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Rita
Usa self.new
para configurar tu aplicación cliente con el enrutamiento adaptado al 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 adaptado al líder
Puedes usar las bibliotecas cliente de Spanner para inhabilitar el enrutamiento adaptado al líder.
C++
Usa la estructura RouteToLeaderOption
para configurar la aplicación cliente con el enrutamiento adaptado al 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 la aplicación cliente con el enrutamiento adaptado al líder inhabilitado:
// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;
Go
Usa ClientConfig
para configurar la aplicación cliente con el enrutamiento adaptado al 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 adaptado al 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 la aplicación cliente con el enrutamiento adaptado al 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 adaptado al 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 la aplicación cliente con el enrutamiento adaptado al líder inhabilitado:
spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Rita
Usa self.new
para configurar la aplicación cliente con el enrutamiento adaptado al 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
¿Qué sigue?
- Obtén más información sobre la configuración regional y multirregional.
- Obtén más información sobre la replicación.
- Obtén más información para modificar la región líder de una base de datos.