Primärschlüsselstrategien migrieren

In diesem Dokument werden Strategien zum Migrieren von Primärschlüsseln aus Ihrer Datenbank beschrieben. Tabellen in Spanner übertragen, um Heißlaufensprobleme zu vermeiden. Ein Hotspot ist ein Konzentration der Vorgänge auf einem einzelnen Knoten, wodurch der Schreibdurchsatz reduziert wird auf die Knotenkapazität erhöhen, anstatt vom Load-Balancing für alle Schreibvorgänge zwischen den Spanner-Knoten. Die Verwendung eines kontinuierlich steigenden absteigende Spalten als den ersten Teil Ihres Primärschlüssels ein (z. B. reguläre Sequenzen oder Zeitstempel) ist die häufigste Ursache für Hotspots.

Gesamtstrategien

In Spanner muss jede Tabelle, die mehr als eine Zeile speichern muss, einen Primärschlüssel haben, der aus einer oder mehreren Spalten der Tabelle besteht. Die Primärschlüssel identifiziert jede Zeile in einer Tabelle eindeutig und Spanner verwendet den Primärschlüssel zum Sortieren der Tabellenzeilen. Da Spanner stark verteilt sind, können Sie mit den folgenden Methoden eindeutige Primärschlüsselwerte und das Risiko von Hotspots reduzieren:

  • Verwenden Sie ein automatisch generiertes, Hotspot-sicheres Schlüsselfeature, das Spanner unterstützt. Weitere Informationen hierzu finden Sie im Abschnitt Automatisch generierte Schlüssel): <ph type="x-smartling-placeholder">
      </ph>
    • Verwenden Sie die Funktion GENERATE_UUID() (GoogleSQL, PostgreSQL) zum Generieren von universell eindeutigen Kennzeichnungen (UUID Version 4) mit STRING(36). RFC 4122 definiert das UUID-Format Version 4.
    • Verwenden Sie eine bitumgekehrte positive Sequenz (GoogleSQL, PostgreSQL). Eine solche Sequenz erzeugt positive Werte mit Bits höherer Ordnung die umgekehrt sind, sodass sie gleichmäßig über die positiven 64-Bit- Zahlenraum.
  • Reihenfolge der Schlüssel vertauschen sodass die Spalte mit den monoton zu- oder abnehmenden "value" ist nicht der erste Schlüsselteil.
  • Eindeutigen Schlüssel hashen und Schreibvorgänge auf logische Shards verteilen indem Sie eine Spalte erstellen, die den Hash des eindeutigen Schlüssels enthält, und Verwenden Sie dann die Hash-Spalte (oder die Hash-Spalte und die Spalten zusammen) als Primärschlüssel verwenden. Mit diesem Ansatz können Sie Hotspots vermeiden, da neue Zeilen gleichmäßiger über den Schlüsselbereich verteilt werden.

Nachdem Sie den Primärschlüssel für die Tabelle festgelegt haben, können Sie ihn später nicht mehr ändern ohne die Tabelle zu löschen und neu zu erstellen. Weitere Informationen zum Zuweisen des Primärschlüssels finden Sie unter Schema und Datenmodell – Primärschlüssel.

Das folgende Beispiel zeigt eine DDL-Anweisung, mit der eine Tabelle für eine Musikdatenbank erstellt wird Titel:

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)
);

Automatisch generierte Schlüssel migrieren

In diesem Abschnitt werden die Strategien und Beispiele für die folgenden Szenarien beschrieben. Dabei verwendet die Quelltabelle bereits ein automatisch generiertes Schlüsselfeature:

  • Migration von einer Quelltabelle, die einen UUID-Primärschlüssel verwendet
  • Migration von einer Quelltabelle, die eine sequenzielle, automatisch generierte Ganzzahl verwendet . Beispiele hierfür sind unter anderem Sequenzen (die von verschiedenen Datenbanken unterstützen), IDENTITY Spalten (die von verschiedenen Datenbanken unterstützt werden), PostgreSQL-SERIAL-Datentypen und die MySQL-AUTO_INCREMENT-Spalte .
  • Migration von einer Quelltabelle, die einen Bit-Umkehrschlüssel verwendet. Vielleicht wurde die Quelle Spanner, wo Sie mithilfe der Anleitung Bit-Umkehrungen für sequenzielle Werte.

Es ist wichtig zu beachten, dass Spanner bei allen Strategien die aus einer Quelldatenbank migriert werden, zu ändern. Sie ändern lediglich die Methode um neue Daten zu generieren.

Spalten mit UUID-Schlüssel migrieren

Wenn Ihre Quelltabelle eine UUID-Spalte verwendet, können Sie die Spalte in Typ STRING, setzen Sie die Werte nach dem RFC 4122-Spezifikation und verwenden Sie GENERATE_UUID()-Funktion (GoogleSQL, PostgreSQL) als Standardwert für die Spalte. Beispiel:

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)
);

Sequenzielle Schlüsselspalten migrieren

Wenn Ihr Quelldatenbanksystem sequenzielle Werte für eine Schlüsselspalte generiert, können Sie eine bit-umgekehrte positive Sequenz (GoogleSQL, PostgreSQL) in Ihrem Spanner-Schema, um Werte zu generieren, die gleichmäßig auf den positiven 64-Bit-Ganzzahlraum. Um zu verhindern, dass Spanner aus einem Wert, der sich mit einem migrierten Wert überschneidet, einen Bereich für das Überspringen festzulegen. Sie können beispielsweise die 1 bis 4.294.967.296 (2^32) für die folgenden beiden Sequenzen hinzufügen, wenn Sie wissen, dass die Quelldatenbank nur 32-Bit-Ganzzahlen generiert:

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;

Bitumkehrte Schlüsselspalten migrieren

Wenn Sie Ihre Schlüssel/Wert-Paare bereits Bitumkehren durchgeführt haben, Ihrer Quelldatenbank spezifiziert, können Sie auch eine Bitumkehrung Sequenz (GoogleSQL, PostgreSQL) um diese Werte weiter zu generieren. Um doppelte Werte zu vermeiden, kann die Sequenz so konfigurieren, dass der Zähler mit einer benutzerdefinierten Zahl beginnt.

Wenn Sie z. B. Zahlen von 1 in 1.000 umgekehrt haben, um einen Primärschlüssel zu generieren, kann die Spanner-Sequenz ihren Zähler starten. von jeder Zahl größer als 10.000. Optional können Sie eine hohe Zahl auswählen, um Lassen Sie einen Puffer für neue Schreibvorgänge, die nach Daten in der Quelldatenbank auftreten. Migration. Im folgenden Beispiel beginnen die Zähler bei 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;