Este documento contiene información que te ayudará a dividir tu base de datos antes de tiempo.
Spanner gestiona las divisiones de la base de datos y se escala en respuesta a los cambios de carga y tamaño. La división y la combinación son dinámicas y se basan en el tráfico. A medida que una división recibe más tráfico, Spanner la subdivide en intervalos más pequeños y redistribuye las divisiones resultantes entre otros recursos disponibles de la instancia. Spanner combina las divisiones cuando reciben constantemente menos tráfico.
La división no es inmediata. Si la división y el reequilibrio no pueden seguir el ritmo del tráfico, una división puede agotar sus recursos de computación y memoria disponibles. Cuando esto ocurre, el programador de trabajo de Spanner pone en cola más solicitudes, lo que aumenta la latencia y puede provocar que se agote el tiempo de espera y que se aborten las transacciones.
Al pre-dividir la base de datos, Spanner puede prepararse para un aumento predecible del tráfico. Puedes dividir previamente tu base de datos creando puntos de división.
Te recomendamos que dividas tu base de datos previamente en los siguientes casos:
- Estás cargando un conjunto de datos de gran tamaño en tablas e índices nuevos de una base de datos de Spanner por primera vez, como una carga masiva única.
- Prevé un aumento de la carga de tráfico en una base de datos de Spanner en un futuro próximo. Por ejemplo, puede que necesites dar soporte a un evento con mucho tráfico, como el lanzamiento de un producto o una campaña de ventas.
Determinar el número de divisiones
Te recomendamos que crees 10 puntos de división por nodo. Como Spanner puede dividir y adaptarse al tráfico rápidamente en el caso de las instancias más pequeñas, no es necesario predividir estas instancias.
Determinar los puntos de división
Ten en cuenta lo siguiente al determinar los puntos de división de tu base de datos:
Si el tráfico se distribuye de forma uniforme en todo el intervalo de claves, como cuando se usan UUIDs o claves de secuencia invertidas por bits, elige puntos de división que dividan el espacio de claves de tráfico posterior de forma uniforme.
Si tu tráfico se concentra en un conjunto de intervalos de claves conocidos, divide y aísla esos intervalos.
Si esperas tráfico en tus índices, usa puntos de división en el índice correspondiente.
Las tablas intercaladas se dividen si se añaden puntos de división a la tabla principal. Si esperas un mayor tráfico en la tabla intercalada, asegúrate de usar puntos de división en la tabla intercalada correspondiente.
Puede asignar los puntos de división a los objetos de esquema de forma proporcional al aumento del tráfico.
Flujo de trabajo de ejemplo para determinar los puntos de división
Supongamos que tu base de datos tiene las estructuras de tabla definidas por el siguiente DDL:
CREATE TABLE UserInfo (
UserId INT64 NOT NULL,
Info BYTES(MAX),
) PRIMARY KEY (UserId);
CREATE TABLE UserLocationInfo (
UserId INT64 NOT NULL,
LocationId STRING(MAX) NOT NULL,
ActivityData BYTES(MAX),
) PRIMARY KEY (UserId, LocationId), INTERLEAVE IN PARENT UserInfo ON DELETE CASCADE;
CREATE INDEX UsersByLocation ON UserLocationInfo(LocationId);
UserId
es un hash generado aleatoriamente en el espacio INT64
y debes añadir 100 puntos de división para distribuir de forma uniforme el aumento previsto del tráfico en la tabla UserInfo
y sus tablas intercaladas. Como los puntos de división están distribuidos de forma uniforme, debes encontrar el número de filas o offset
entre cada punto de división:
offset
= valor máximo del intervalo UserId
/ 99
A continuación, los puntos de división de la tabla UserInfo
se determinan a partir de la primera fila de UserId
o UserId_first
. Para determinar el punto de división enésimo, usa el siguiente cálculo:
Punto de división N: UserId_first
+ (offset
* (N-1))
Por ejemplo, el primer punto de división es UserId_first
+ (offset
* 0) y el tercer punto de división es UserId_first
+ (offset
* 2).
Como la tabla UserLocationInfo
es una tabla intercalada de la tabla UserInfo
, también se divide en los límites de UserId
. También puedes crear puntos de división en la tabla UserLocationInfo
de la columna LocationId
.
Ten en cuenta que LocationId
sigue el formato $COUNTRY_$STATE_$CITY_$BLOCK_$NUMBER
, por ejemplo, US_CA_SVL_MTL_1100_7
.
En el caso de UserId
, en función del prefijo de la cadena LocationId
, puedes determinar las divisiones para colocar la tabla UserLocationInfo
de UserId
en 3 países diferentes en 3 divisiones distintas:
- Punto de división 1: (1000, "CN")
- Punto de división 2: (1000, "FR")
- Punto de división 3: (1000, "US")
Puedes añadir nuevos puntos de división usando solo un prefijo, sin necesidad de que coincidan con el formato especificado de una columna o un índice. En este ejemplo, los puntos de división no coinciden con el formato especificado para LocationId
y solo usan $COUNTRY
como prefijo.
Si quieres dividir el índice UsersByLocation
, puedes distribuir los puntos de división de forma uniforme en la columna LocationId
o aislar algunos valores de la columna LocationId
que creas que van a recibir más tráfico:
- Punto de división 1: "CN"
- Punto de división 2: "US"
- Punto de división 3: "US_NYC"
Puedes dividir aún más el índice usando las partes clave de la tabla indexada para las ubicaciones que reciben un aumento aún mayor del tráfico. Por ejemplo, si prevé que la ubicación CN
reciba más tráfico, puede introducir los siguientes puntos de división:
- Punto de división 1: "CN" y TableKey: (1000, "CN")
- Punto de división 2: "CN" y TableKey: (2000, "CN")
- Punto de división 3: "CN" y TableKey: (3000, "CN")
Caducidad de los puntos de división
Puedes definir un tiempo de vencimiento para cada punto de división. En función de tu caso práctico, configura los puntos de división para que caduquen cuando haya disminuido el aumento del tráfico previsto.
El tiempo de caducidad predeterminado es de 10 días a partir de la fecha en que se crea o actualiza la división. El tiempo de caducidad máximo permitido es de 30 días a partir de la fecha en la que crees o actualices la división.
Una vez que caduca la división, Spanner se encarga de gestionarla y ya no puedes verla. Spanner puede combinar la división en función del tráfico.
También puedes actualizar la hora de vencimiento de un punto de división antes de que caduque. Por ejemplo, si el aumento del tráfico no ha disminuido, puedes aumentar el tiempo de vencimiento de la división. Si ya no necesitas un punto de división, puedes hacer que caduque inmediatamente. Para saber cómo definir el tiempo de vencimiento de los puntos de división, consulta Cómo hacer que venza un punto de división.
Resultados de dividir la base de datos antes
Es probable que se produzcan los siguientes resultados después de añadir puntos de división:
Cambios en la latencia: añadir puntos de división es una forma de simular aumentos del tráfico en la base de datos. Cuando una base de datos tiene más divisiones, puede haber aumentos permanentes en la latencia de lectura y escritura debido a que hay más participantes en las transacciones y divisiones de consultas. También se espera un aumento del uso de recursos de computación y de consultas por cada solicitud de lectura o escritura.
Eficacia de los puntos de división: para determinar si los puntos de división añadidos son útiles, monitoriza el perfil de latencia para detectar cambios mínimos y el visualizador de claves para identificar los puntos de acceso. Si detecta puntos de acceso, puede hacer que los puntos de división caduquen inmediatamente y crear otros nuevos. Para obtener más información sobre los puntos de división que caducan, consulta Cómo hacer que caduque un punto de división. En la siguiente iteración de la adición de divisiones, prueba a introducir un número menor de divisiones y observa el perfil de latencia.
Comportamiento de los puntos de división después del aumento del tráfico: los puntos de división añadidos deben eliminarse una vez que se estabilice el aumento del tráfico. Es posible que la distribución dividida no converja en el punto en el que estaba antes del aumento de la carga. Es posible que la base de datos se adapte a un perfil de latencia diferente debido al cambio en el tráfico y a la división necesaria para admitirlo.
Caso práctico de ejemplo
Supongamos que eres administrador de bases de datos en una empresa de videojuegos y prevés un aumento del tráfico debido al lanzamiento de un nuevo juego. Esperas el tráfico de las nuevas tablas que están vacías.
Debes asegurarte de que no haya interrupciones en el servicio cuando llegue el tráfico para que no se produzcan efectos observables en la latencia ni en las tasas de error.
En este caso práctico, se puede seguir la siguiente estrategia general de presegmentación:
Identifica el número de nodos que necesita la instancia para admitir el aumento del tráfico. Para saber cómo identificar el número de nodos, consulta Vista general del rendimiento. Si usas el escalador automático, define el parámetro de límite máximo en el número de nodos que hayas identificado. Además, asigna al parámetro de límite mínimo el valor (número de nodos que has identificado / 5).
Identifica las tablas y los índices que tienen más tráfico y que pueden beneficiarse más de los puntos de división. Analiza los datos actuales y elige entre usar puntos de división personalizados o puntos de división distribuidos uniformemente.
Crea los puntos de división al menos siete días antes y como máximo 12 horas antes del aumento del tráfico previsto.
Verifica que se hayan creado las divisiones. Para ver los puntos de división creados en una instancia, consulta Ver puntos de división.
Advertencias
Ten en cuenta las siguientes advertencias al crear puntos de división:
Eliminación de tablas, índices y bases de datos: antes de eliminar una tabla, un índice o una base de datos, debes asegurarte de que todos los puntos de división correspondientes que hayas añadido hayan caducado. Para ello, define la fecha de vencimiento de la división como la hora actual. Esto es necesario para recuperar la cuota a nivel de instancia. Para obtener más información sobre los puntos de división que caducan, consulta Cómo hacer que caduque un punto de división.
Crear copias de seguridad y restaurar bases de datos: las divisiones añadidas no se incluyen en las copias de seguridad. Necesitas crear divisiones en una base de datos restaurada.
Autoescalado asimétrico: si usas el autoescalado asimétrico, el número de nodos que se utiliza para determinar el número de puntos de división es el número mínimo de nodos de todas las regiones.
Aumento temporal de las métricas de uso del almacenamiento: al añadir puntos de división, la métrica Almacenamiento total en bases de datos aumenta temporalmente hasta que Spanner completa la compactación. Para obtener más información, consulta Uso del almacenamiento. Esto solo ocurre cuando los intervalos de claves se dividen aún más, no cuando se dividen intervalos de claves nuevos.
Debes crear puntos de división al menos siete días y como máximo 12 horas antes del aumento de tráfico previsto.
Límites de división previa
La división previa de la base de datos tiene las siguientes limitaciones:
No puedes dividir previamente los índices de búsqueda. Solo tienes que dividir previamente la tabla base. Para obtener más información, consulta Fragmentación del índice de búsqueda.
No puedes dividir previamente los índices vectoriales. Para obtener más información sobre los índices vectoriales, consulta Índice vectorial.
Para obtener información sobre las cuotas de los puntos de división, consulta Cuotas y límites.