En este documento, se describen estrategias para migrar claves primarias de tu base de datos a Spanner para evitar problemas de generación de hotspots. Un hotspot es un concentración de operaciones en un solo nodo, lo que reduce la capacidad de procesamiento de escritura a la capacidad del nodo en lugar de beneficiarse del balanceo de cargas de todas las escrituras entre los nodos de Spanner. El uso de monótonamente creciente o disminuir la cantidad de columnas como la primera parte de la clave primaria (por ejemplo, secuencias regulares o marcas de tiempo) es la causa más común de los hotspots.
Estrategias generales
En Spanner, cada tabla que debe almacenar más de una fila debe Tener una clave primaria compuesta por una o más columnas de la tabla La tabla la clave primaria identifica de manera única cada fila de una tabla, y Spanner usa la clave primaria para ordenar las filas de la tabla. Dado que Spanner es altamente distribuidas, puedes usar las siguientes técnicas para generar modelos los valores de clave primaria y reducir el riesgo de tener hotspots:
- Usar una función de clave generada automáticamente a prueba de hotspot que Spanner
admite (más detalles se describen en la sección Cómo migrar los datos
claves):
- Usa la función
GENERATE_UUID()
(GoogleSQL, PostgreSQL) para generar valores de identificador único universal (versión 4 de UUID) con el tipo de datosSTRING(36)
. RFC 4122 define el formato versión 4 de UUID. - Usa una secuencia positiva inversa de bits (GoogleSQL, PostgreSQL). Esa secuencia genera valores positivos con bits de orden superior ya invertido, de modo que se distribuyan de manera uniforme en la red positiva de 64 bits espacio numérico.
- Usa la función
- Cambia el orden de las claves para que la columna que contiene los valores monótonamente crecientes o decrecientes no es la primera parte clave.
- Genera un hash de la clave única y distribuye las escrituras en fragmentos lógicos creando una columna que contenga el hash de la clave única luego, usa la columna de hash (o la columna de hash y las columnas de la clave única) juntas) como clave primaria. Este enfoque ayuda a evitar los puntos problemáticos porque las filas nuevas se distribuyen de manera más uniforme en el espacio de claves.
Después de designar tu clave primaria para la tabla, no podrás cambiarla más adelante sin borrar ni volver a crear la tabla. Para obtener más información sobre cómo designar la clave primaria, consulta Esquema y modelo de datos: Claves primarias.
El siguiente es un ejemplo de instrucción DDL que crea una tabla para una base de datos de música pistas:
GoogleSQL
CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), BirthDate DATE, ) PRIMARY KEY(SingerId);
PostgreSQL
CREATE TABLE Singers ( SingerId bigint NOT NULL, FirstName varchar(1024), LastName varchar(1024), SingerInfo bytea, BirthDate date, PRIMARY KEY(SingerId) );
Cómo migrar claves generadas automáticamente
En esta sección, se describen las estrategias y los ejemplos para las siguientes situaciones en el que la tabla de origen ya usa un atributo de clave generado automáticamente:
- Migra desde una tabla de origen que usa una clave primaria de UUID.
- Migra desde una tabla de origen que usa un número entero secuencial generado automáticamente
. Los ejemplos incluyen, entre otros, secuencias (que varios
compatibilidad con bases de datos),
IDENTITY
columnas (que admiten varias bases de datos), Tipos de datosSERIAL
de PostgreSQL y la columnaAUTO_INCREMENT
de MySQL . - Migración desde una tabla de origen que usa una clave de inversión de bits. Quizás la fuente es Spanner, donde puedes crear pares clave-valor con la guía revertir bits de valores secuenciales.
Cabe destacar que, en todas las estrategias, Spanner no y los datos que migra desde una base de datos de origen. Solo cambiarás el método para generar datos nuevos.
Migra las columnas de claves de UUID
Si tu tabla de origen usa una columna de UUID, puedes convertirla a
STRING, convierte los valores en minúsculas según el
RFC 4122 y usa el
función GENERATE_UUID()
(GoogleSQL,
PostgreSQL) como valor predeterminado de la columna. Por ejemplo:
GoogleSQL
CREATE TABLE UserAccessLog ( UserId STRING(36) DEFAULT (GENERATE_UUID()), ... ) PRIMARY KEY (UserId);
PostgreSQL
CREATE TABLE UserAccessLog ( UserId varchar(36) DEFAULT SPANNER.GENERATE_UUID(), ... PRIMARY KEY (UserId) );
Migra columnas de claves secuenciales
Si el sistema de la base de datos de origen genera valores secuenciales para una columna de clave, puedes usar una secuencia positiva con inversión de bits (GoogleSQL, PostgreSQL). en tu esquema de Spanner para generar valores que se distribuyan de manera uniforme el espacio numérico positivo de 64 bits. Para evitar que el servidor de de salida genera un valor que se superpone con un valor migrado, puedes definir un rango omitido para ella. Por ejemplo, puedes omitir el varían de 1 a 4,294,967,296 (2^32) para los siguientes dos secuenciales, si sabes que la base de datos de origen solo genera números enteros de 32 bits:
GoogleSQL
CREATE SEQUENCE MyFirstSequence OPTIONS ( sequence_kind = "bit_reversed_positive", skip_range_min = 1, skip_range_max = 4294967296 ); ALTER SEQUENCE MySecondSequence SET OPTIONS ( skip_range_min = 1, skip_range_max = 4294967296 );
PostgreSQL
CREATE SEQUENCE MyFirstSequence BIT_REVERSED_POSITIVE SKIP RANGE 1 4294967296; ALTER SEQUENCE MySecondSequence SKIP RANGE 1 4294967296;
Migra columnas de claves con inversión de bits
Si ya revirtió los bits de sus valores clave para evitar problemas de hotspots de la base de datos de origen, también puedes usar un valor secuencia (GoogleSQL, PostgreSQL). para seguir generando esos valores. Para evitar generar valores duplicados, puedes configurar la secuencia para que inicie su contador desde un número personalizado.
Por ejemplo, si revirtieras números del 1 al 1,000 para generar una clave primaria valores, la secuencia de Spanner puede iniciar su desde cualquier número superior a 10,000. Si lo deseas, puedes elegir un número alto para dejar un búfer para las nuevas escrituras que se producen en la base de datos de origen después de que los datos migración. En el siguiente ejemplo, los contadores comienzan en 11,000:
GoogleSQL
CREATE SEQUENCE MyFirstSequence OPTIONS ( sequence_kind = "bit_reversed_positive", start_with_counter = 11000 ); ALTER SEQUENCE MySecondSequence SET OPTIONS ( start_with_counter = 11000 );
PostgreSQL
CREATE SEQUENCE MyFirstSequence BIT_REVERSED_POSITIVE START COUNTER 11000; ALTER SEQUENCE MySecondSequence RESTART COUNTER 11000;