Migra estrategias de clave primaria

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 datos STRING(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.
  • 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 datos SERIAL de PostgreSQL y la columna AUTO_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;