Descripción general de la división previa

Este documento contiene información que te ayudará a dividir previamente tu base de datos.

Spanner administra las divisiones de bases de datos y 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 rangos más pequeños y redistribuye las divisiones resultantes sobre otros recursos disponibles en la instancia. Spanner combina la división cuando esta recibe menos tráfico de manera constante.

La división no es instantánea. Si la división y el rebalanceo no pueden seguir el ritmo del tráfico, es posible que una división consuma todos sus recursos de procesamiento y memoria disponibles. Cuando esto sucede, el programador de trabajo de Spanner pone en cola las solicitudes adicionales, lo que aumenta la latencia y puede dar lugar a tiempos de espera agotados y transacciones anuladas.

Mediante la división previa de la base de datos, Spanner puede estar listo para un aumento de tráfico predecible. Puedes dividir previamente la base de datos mediante la creación de puntos de división.

Considera dividir previamente tu base de datos en las siguientes situaciones:

  • Subirás un conjunto de datos grande a índices y tablas nuevos en una base de datos de Spanner por primera vez, como una carga masiva única.
  • Esperas un aumento de la carga de tráfico en una base de datos existente de Spanner en un futuro cercano. Por ejemplo, es posible que debas admitir un evento de tráfico grande, como el lanzamiento de un producto o una campaña de ventas.

Determina el recuento de divisiones

Recomendamos crear 10 puntos de división por nodo. Debido a que Spanner puede dividirse y ajustarse al tráfico con rapidez para instancias más pequeñas, no necesitas dividir con anterioridad instancias más pequeñas.

Determinar puntos de división

Ten en cuenta lo siguiente cuando determines los puntos de división de tu base de datos:

  • Si tu tráfico se distribuye de manera uniforme en el rango de claves, como cuando se usan UUID o claves de secuencia con inversión de bits, elige puntos de división que dividan el espacio de claves posterior al tráfico de manera uniforme.

  • Si tu tráfico se concentra en un conjunto de rangos de claves conocidos, divídelos y aíslalos.

  • Si esperas tráfico en tus índices, usa puntos de división en el índice correspondiente.

  • Las tablas intercaladas se dividen si se agregan puntos de división a la tabla superior. Si esperas un tráfico mayor en la tabla intercalada, asegúrate de usar puntos de división en la tabla intercalada correspondiente.

  • Puedes asignar los puntos de división a los objetos del esquema de forma proporcional al aumento de tráfico.

Flujo de trabajo de muestra para determinar los puntos de división

Supongamos que tu base de datos tiene las estructuras de tablas 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 de forma aleatoria en el espacio INT64, y debes agregar 100 puntos de división para distribuir de manera uniforme el aumento anticipado en el tráfico en la tabla UserInfo y sus tablas intercaladas. Debido a que los puntos de división están distribuidos de manera uniforme, debes encontrar el número de filas o offset entre cada punto de división:

offset = el valor máximo del rango UserId / 99

Luego, 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).

Debido a que 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 una UserId, según el prefijo de la string LocationId, puedes determinar las divisiones para colocar la tabla UserLocationInfo de UserId en 3 países y 3 divisiones diferentes:

  • Punto de división 1: (1000, "CN")
  • Punto de división 2: (1000, "FR")
  • Punto de división 3: (1000, "EE.UU.")

Puedes agregar nuevos puntos de división solo con un prefijo y no es necesario que coincida con el formato especificado para 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 deseas dividir el índice UsersByLocation, puedes distribuir de manera uniforme los puntos de división en la columna LocationId o aislar algunos valores de columna LocationId que se espera que reciban más tráfico:

  • Punto de división 1: "CN"
  • Punto de división 2: "EE.UU."
  • Punto de división 3: "US_NYC"

Puedes dividir aún más el índice con las partes clave de la tabla indexada para las ubicaciones que reciben aún más tráfico. Por ejemplo, si esperas que la ubicación CN reciba más tráfico, puedes ingresar 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")

Vencimiento del punto de división

Puedes establecer un tiempo de vencimiento para cada punto de división. Según tu caso de uso, configura los puntos de división para que venzan después de que disminuya el aumento anticipado.

El tiempo de vencimiento predeterminado es de 10 días a partir de la fecha en que se crea o actualiza la división. El tiempo de vencimiento máximo permitido es de 30 días a partir del momento en que creas o actualizas la división.

Una vez que vence la división, Spanner se encarga de administrarla y ya no puedes verla. Spanner puede combinar la división según el tráfico.

También puedes actualizar el tiempo de vencimiento de un punto de división antes de que venza. Por ejemplo, si el aumento de tráfico no disminuyó, puedes aumentar el tiempo de vencimiento de la división. Si ya no necesitas un punto de división, puedes configurarlo para que venza de inmediato. Para aprender a configurar el tiempo de vencimiento de los puntos de división, consulta Cómo vencer un punto de división.

Resultados de la división previa de tu base de datos

Es probable que los siguientes resultados aparezcan después de agregar puntos de división:

  • Cambios de latencia: Agregar puntos de división es una forma de simular aumentos en el 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 más participantes de transacciones y divisiones de consultas. También es posible que aumente el uso de procesamiento y consultas por solicitud de lectura o escritura.

  • Eficacia del punto de división: Para determinar si los puntos de división agregados son beneficiosos, supervisa el perfil de latencia para obtener cambios mínimos y el visualizador clave para los hotspots. Si observas hotspots, puedes hacer que los puntos de división caduquen de inmediato y crear otros nuevos. Para obtener más información sobre el vencimiento de los puntos de división, consulta Cómo vencer un punto de división. Considera ingresar una cantidad menor de divisiones en la próxima iteración de agregar divisiones y observar el perfil de latencia.

  • Comportamiento de los puntos de división después del aumento del tráfico: Los puntos de división agregados se deben quitar después de que se estabilice el aumento del tráfico. Es posible que la distribución dividida no converja en la ubicación en la que estaba antes de que aumentara la carga. La base de datos puede establecerse en un perfil de latencia diferente debido al cambio de tráfico y la división que se requiere para admitir el tráfico.

Ejemplo de caso de uso

Considera que eres administrador de base de datos en una empresa de videojuegos y prevés un aumento de tráfico para el lanzamiento de un juego nuevo. El tráfico en tablas nuevas que están vacías

Debes asegurarte de que no haya interrupciones en el servicio cuando llegue el tráfico para que no haya un impacto observable en la latencia o las tasas de error.

Considera la siguiente estrategia de división previa de alto nivel para este caso de uso:

  1. Identifica la cantidad de nodos que necesita la instancia para soportar el aumento del tráfico. Para obtener información sobre cómo identificar el recuento de nodos, consulta Descripción general del rendimiento. Si usas el escalador automático, establece el parámetro de límite máximo en el recuento de nodos que identificaste. Además, establece el parámetro de límite mínimo en (recuento de nodos que identificaste / 5).

  2. Identifica las tablas y los índices que tienen más tráfico y pueden beneficiarse más con el uso de puntos de división. Analiza los datos actuales y elige entre usar puntos de división personalizados o distribuidos de manera uniforme.

  3. Crea los puntos de división a más tardar los siete días y no más de 12 horas antes del aumento de tráfico previsto.

  4. Verifica que se hayan creado las divisiones. Para ver los puntos de división creados en una instancia, consulta Cómo ver los puntos de división.

Advertencias

Ten en cuenta las siguientes advertencias cuando crees puntos de división:

  • Eliminación de tablas, índices y bases de datos: Antes de borrar una tabla, un índice o una base de datos, debes asegurarte de que todos los puntos de división agregados correspondientes venzan. Para ello, configura la fecha de vencimiento de la división en la hora actual. Esto es necesario para que se reclame la cuota de nivel de instancia. Para obtener más información sobre el vencimiento de los puntos de división, consulta este artículo.

  • Copia de seguridad y restablecimiento de bases de datos: No se crea una copia de seguridad de las divisiones agregadas. Debes crear divisiones en una base de datos restablecida.

  • Ajuste de escala automático asimétrico: Si usas el ajuste de escala automático asimétrico, el recuento de nodos que se usa para determinar el recuento del punto de división es el recuento mínimo de nodos en todas las regiones.

  • Aumento temporal en las métricas de uso del almacenamiento: Agregar puntos de división aumenta de forma temporal la métrica de almacenamiento total de la base de datos hasta que Spanner completa la compactación. Para obtener más información, consulta Uso del almacenamiento. Esto solo sucede cuando los rangos de claves existentes se dividen aún más, y no cuando se dividen los rangos de claves nuevos.

  • Debes crear puntos de división a más tardar siete días y no más de 12 horas antes del aumento de tráfico esperado.

Límites previos a la división

La división previa de tu base de datos tiene las siguientes limitaciones:

  • No puedes dividir previamente los índices de búsqueda. Solo necesitas dividir previamente la tabla base. Para obtener más información, consulta Fragmentación del índice de la búsqueda.

  • No se pueden dividir previamente los índices vectoriales. Para obtener más información sobre los índices vectoriales, consulta Índice vectorial.

  • Para obtener más información sobre las cuotas de los puntos de división, consulta Cuotas y límites.

Próximos pasos