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.
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.
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
- Consulta información sobre las configuraciones regionales, birregionales y multirregionales.
- Consulta información sobre la replicación.
- Consulte cómo modificar la región líder de una base de datos.