En esta página, se describe el enrutamiento consciente del líder en Spanner y cómo usarlo. Spanner usa el enrutamiento adaptado al líder para enrutar de forma dinámica las transacciones de lectura y escritura en configuraciones de instancias multirregionales y birregionales para reducir la latencia y mejorar el rendimiento de tu base de datos. El enrutamiento con conocimiento del líder está habilitado de forma predeterminada.
Enrutamiento de Spanner para transacciones de lectura y escritura
Spanner replica los datos para proporcionar disponibilidad de datos y localidad geográfica adicionales. En las configuraciones de instancias multirregionales y birregionales de Spanner, una región en la configuración de instancias multirregionales y birregionales 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 instancia de región doble o multirregional y tu cliente emite una transacción de lectura y escritura a tu base de datos desde una región que no es líder, la operación de escritura siempre se procesa en la región líder y luego se vuelve a enviar a la región que no es líder. Por lo tanto, las transacciones de lectura y escritura confirmadas desde una región que no es líder requieren varios viajes de ida y vuelta a la réplica líder para confirmarse correctamente.
El enrutamiento consciente del líder es un mecanismo que mejora la latencia de las transacciones de lectura y escritura enrutándolas de forma inteligente. Si está habilitado el enrutamiento consciente del líder, incluso si la operación de escritura no se origina en la región líder, las solicitudes de creación de sesión 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 la cantidad de idas y vueltas de red requeridas entre la región que no es 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 consciente del líder habilitado.
Si se inhabilita el enrutamiento consciente del líder, la aplicación cliente primero enruta la solicitud a un servicio de frontend de la API de Spanner dentro de la región de la aplicación cliente (región no líder). Luego, desde el frontend de la API de Spanner en la región de la aplicación cliente, se realizan tres o más ida y vuelta al servidor de Spanner (SpanServer) en la región líder para confirmar la operación de escritura, lo que aumenta la latencia. Estos viajes de ida y vuelta adicionales son necesarios para admitir índices secundarios, verificaciones de restricciones y leer tus operaciones de escritura.
Figura 2. Ejemplo de enrutamiento de Spanner con el enrutamiento consciente del líder inhabilitado.
Casos de uso
Como resultado del uso del enrutamiento consciente del 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 que no es líder
- Tolerancia a desastres y mayor disponibilidad: Implementa aplicaciones cliente en regiones líderes y no líderes para tolerar interrupciones regionales mientras se inician operaciones de escritura desde regiones no líderes.
- Aplicación global: Implementa aplicaciones cliente a nivel global con ubicaciones de regiones extendidas que confirman los datos.
Limitaciones
Si tu aplicación cliente se implementa fuera de la región líder y escribes valores sin leer los datos ("escrituras ciegas"), es posible que observes una regresión de latencia si está habilitado el enrutamiento consciente del líder. Esto se debe a que, cuando se habilita el enrutamiento consciente del líder, hay dos viajes de ida y vuelta entre regiones (beginTransaction
y la solicitud commit
) entre la aplicación cliente en la región que no es líder y el frontend de la API de Spanner en la región líder.
Sin embargo, con el enrutamiento consciente del líder inhabilitado, las operaciones de escritura sin operaciones de lectura solo requieren un recorrido 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 cargas datos de archivos de forma masiva en una tabla recién creada, es probable que las transacciones no lean datos de la tabla. Si confirmas operaciones de escritura con frecuencia sin leerlas en tu aplicación, te recomendamos que inhabilites el enrutamiento consciente del líder. Para obtener más información, consulta Cómo inhabilitar el enrutamiento consciente del líder.
Usa el enrutamiento con reconocimiento de líder
El enrutamiento consciente del líder está habilitado de forma predeterminada en las bibliotecas cliente de Spanner.
Te recomendamos que proceses tus solicitudes de lectura y escritura con el enrutamiento consciente del líder habilitado. Puedes inhabilitarlo para comparar las diferencias de rendimiento.
Habilita el enrutamiento consciente del líder
Puedes usar las bibliotecas cliente de Spanner para habilitar el enrutamiento consciente del líder manualmente.
C++
Usa la estructura RouteToLeaderOption
para configurar tu aplicación cliente con el enrutamiento consciente del 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
Inhabilita el enrutamiento consciente de los líderes
Puedes usar las bibliotecas cliente de Spanner para inhabilitar el enrutamiento consciente del líder.
C++
Usa la estructura RouteToLeaderOption
para configurar tu aplicación cliente con el enrutamiento consciente del 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
¿Qué sigue?
- Obtén información sobre las configuraciones regionales, birregionales y multirregionales.
- Obtén más información sobre la replicación.
- Obtén información para modificar la región líder de una base de datos.