Live-Datenmigration von MySQL

In diesem Dokument wird beschrieben, wie Sie eine Live-Datenmigration von einer MySQL-Quellinstanz zu Spanner mit minimaler Ausfallzeit durchführen. Dazu verwenden Sie Terraform, um Dataflow und Datastream bereitzustellen.

Nachdem Sie die Live-Datenmigration durchgeführt haben und sicher sind, dass alle Daten übertragen wurden, Sie Ihren Code und Ihre Abhängigkeiten migriert und die Tests abgeschlossen haben, können Sie Ihre Anwendung so umstellen, dass sie Spanner anstelle Ihrer MySQL-Quelldatenbank verwendet.

Sie können eine Live-Datenmigration durchführen, nachdem Sie Ihre Ziel-Spanner-Datenbank erstellt haben. Sie müssen ein kompatibles Schema in Ihrer Zieldatenbank erstellen, bevor Sie Daten migrieren.

Funktionsweise

Die Live-Datenmigration besteht aus den folgenden zwei Phasen:

  • Backfill-Migration:

    • Bei der Backfill-Migration liest Dataflow vorhandene Daten aus Ihrer MySQL-Quelldatenbank und migriert sie in die Spanner-Zieldatenbank. Sie müssen eine Dataflow-Vorlage für die Bulk-Migration verwenden, um die Daten aus Ihrer MySQL-Quellinstanz in Spanner zu verschieben.
    • Wenn bei der Backfill-Migration eine Zeile nicht in Spanner geschrieben werden kann, wird sie in ein Verzeichnis für unzustellbare Nachrichten in einem Cloud Storage-Bucket geschrieben. Sie können die Backfill-Migration so konfigurieren, dass das Schreiben dieser Zeilen in Spanner noch einmal versucht wird.
  • Migration von Change Data Capture (CDC):

    • Diese Phase läuft parallel zur Backfill-Migration und erfasst Änderungen, die in der MySQL-Quellinstanz in Echtzeit auftreten. Diese Änderungen werden dann auf Spanner angewendet, nachdem die Backfill-Migration abgeschlossen ist.
    • Sie müssen Datastream verwenden, um Änderungen in Ihrer MySQL-Quellinstanz in Echtzeit zu erfassen und in einen Cloud Storage-Bucket zu schreiben.
    • Nach Abschluss der Backfill-Migration müssen Sie Dataflow verwenden, um die CDC-Daten aus dem Cloud Storage-Bucket nach Spanner zu verschieben. Wenn Dataflow aus irgendeinem Grund eine Zeile nicht in Spanner schreiben kann, wird diese Zeile in ein Warteschlangenverzeichnis für unzustellbare Nachrichten in einem anderen Cloud Storage-Bucket geschrieben. Bei der CDC-Migration wird automatisch versucht, die Zeilen aus dem Dead-Letter-Warteschlangenverzeichnis in Spanner zu schreiben.

Live-Datenmigration planen

Sie müssen die Netzwerkinfrastruktur konfigurieren, die erforderlich ist, damit Daten zwischen Ihrer MySQL-Quellinstanz, Datastream, Dataflow, Cloud Storage-Buckets und der Spanner-Zieldatenbank übertragen werden können. Wir empfehlen, private Netzwerkverbindungen für eine sichere Migration zu konfigurieren. Je nach den Compliance-Anforderungen Ihrer Organisation müssen Sie möglicherweise öffentliche oder private Netzwerkverbindungen konfigurieren. Weitere Informationen zur Datastream-Verbindung finden Sie unter Optionen für die Netzwerkverbindung.

Für die Planung der Live-Datenmigration muss der Netzwerkadministrator Ihrer Organisation möglicherweise die folgenden Aufgaben ausführen:

  • Verwenden Sie die Standard-VPC oder erstellen Sie eine neue VPC in Ihrem Projekt, die die folgenden Anforderungen erfüllt:
    • Die MySQL-Quellinstanz muss in dieser VPC verfügbar sein. Möglicherweise müssen Sie eine Firewallregel für ausgehenden Traffic für diese VPC und eine Firewallregel für eingehenden Traffic für die VPC erstellen, in der sich die MySQL-Quellinstanz befindet.
    • Datastream, Dataflow, Cloud Storage-Buckets und die Spanner-Zieldatenbank müssen in dieser VPC verfügbar sein.
    • Sie müssen eine Zulassungsliste für Ihre MySQL-Quellinstanz erstellen, um Verbindungen von der VPC zuzulassen.
  • Legen Sie einen IP-Adressbereich in der VPC fest und weisen Sie ihn zu, den Datastream verwenden kann.
  • Erstellen Sie in der VPC ein Subnetzwerk, das von Dataflow für die Backfill-Migration verwendet werden soll.
  • Erstellen Sie ein Subnetzwerk in der VPC für Dataflow, das später für die CDC-Migration verwendet werden soll.

So führen Sie die Live-Datenmigration durch:

  1. CDC-Migration einrichten
  2. Backfill-Migration ausführen
  3. CDC-Migration nach Abschluss der Backfill-Migration abschließen

Für die Live-Datenmigration müssen eine beträchtliche Anzahl von Ressourcen bereitgestellt und verwaltet werden. Spanner bietet für jede Phase der Live-Datenmigration zwei Beispiel-Terraform-Vorlagen.

Die CDC-Migration mit der Live-Migrationsvorlage erfolgt in zwei Phasen:

  • CDC-Migration zu einem Cloud Storage-Bucket mit Datastream einrichten Sie können eine Terraform-Variable verwenden, um zu verhindern, dass mit der Vorlage die Dataflow-Jobs erstellt werden.
  • Migrieren Sie die CDC-Daten aus dem Cloud Storage-Bucket mit Dataflow zu Spanner. Sie müssen diese Phase erst ausführen, nachdem das Terraform-Template für die Backfill-Migration abgeschlossen ist.

Mit der Terraform-Vorlage für die Backfill-Migration wird die Backfill-Migration von Ihrer MySQL-Quellinstanz zu Spanner durchgeführt.

Hinweise

  • Prüfen Sie, ob Terraform in Ihrer lokalen Shell installiert ist.
  • Erstellen Sie ein Dienstkonto, um die Migration von Live-Daten auszuführen. Weitere Informationen zum Erstellen eines Dienstkontos finden Sie unter Dienstkonten erstellen.
  • Bitten Sie Ihren Administrator, dem Dienstkonto die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, damit das Dienstkonto die erforderlichen Berechtigungen zum Ausführen der Live-Migration hat:

    Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

    Diese vordefinierten Rollen enthalten die Berechtigungen, die für die Live-Migration erforderlich sind. Erweitern Sie den Abschnitt Erforderliche Berechtigungen, um die erforderlichen Berechtigungen anzuzeigen:

    Erforderliche Berechtigungen

    Die folgenden Berechtigungen sind für die Live-Migration erforderlich:

    • compute.globalAddresses.create
    • compute.globalAddresses.createInternal
    • compute.globalAddresses.createInternal
    • compute.globalAddresses.delete
    • compute.globalAddresses.deleteInternal
    • compute.globalAddresses.get
    • compute.globalOperations.get
    • compute.networks.addPeering
    • compute.networks.get
    • compute.networks.listPeeringRoutes
    • compute.networks.removePeering
    • compute.networks.use
    • compute.routes.get
    • compute.routes.list
    • compute.subnetworks.get
    • compute.subnetworks.list
    • dataflow.jobs.cancel
    • dataflow.jobs.create
    • dataflow.jobs.updateContents
    • datastream.connectionProfiles.create
    • datastream.connectionProfiles.delete
    • datastream.privateConnections.create
    • datastream.privateConnections.delete
    • datastream.streams.create
    • datastream.streams.delete
    • datastream.streams.update
    • iam.roles.get
    • iam.serviceAccounts.actAs
    • pubsub.subscriptions.create
    • pubsub.subscriptions.delete
    • pubsub.topics.attachSubscription
    • pubsub.topics.create
    • pubsub.topics.delete
    • pubsub.topics.getIamPolicy
    • pubsub.topics.setIamPolicy
    • resourcemanager.projects.setIamPolicy
    • storage.buckets.create
    • storage.buckets.delete
    • storage.buckets.update
    • storage.objects.delete

    Ihr Administrator kann dem Dienstkonto möglicherweise auch diese Berechtigungen mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erteilen.

CDC-Migration einrichten

Spanner bietet eine Terraform-Vorlage, mit der die CDC eingerichtet und später die CDC-Migration abgeschlossen wird. Sie können eine Terraform-Variable verwenden, um zu verhindern, dass mit der Vorlage Dataflow-Jobs erstellt werden. Mit der Terraform-Vorlage werden die folgenden Ressourcen bereitgestellt und verwaltet, um die CDC-Migration einzurichten:

  • Private Datastream-Verbindung: Eine private Datastream-Verbindung wird in Ihrer konfigurierten VPC bereitgestellt.

  • Datastream-Quellverbindungsprofil: Ein Verbindungsprofil, mit dem Datastream eine Verbindung zu Ihrer MySQL-Quellinstanz herstellen kann.

  • Cloud Storage-Bucket: Ein Cloud Storage-Bucket, in den Datastream die Daten schreibt.

  • Datastream-Zielverbindungsprofil: Mit diesem Verbindungsprofil kann Datastream eine Verbindung zum Cloud Storage-Bucket herstellen und Daten in den Bucket schreiben.

  • Datastream-Stream: Ein Datastream-Stream, der Daten aus Ihrer MySQL-Quellinstanz liest und in den Cloud Storage-Bucket schreibt, wie in den Verbindungsprofilen definiert.

  • Pub/Sub-Thema und ‑Abo: Der Cloud Storage-Bucket sendet Objektbenachrichtigungen an das Pub/Sub-Thema und Dataflow nutzt das Pub/Sub-Abo, um Daten in Spanner zu schreiben.

  • Cloud Storage-Bucket-Benachrichtigungen: eine Cloud Storage-Bucket-Benachrichtigung, die im Pub/Sub-Thema veröffentlicht wird.

CDC-Terraform-Konfiguration vorbereiten

Sie können die Terraform-Vorlage so vorbereiten, dass sie Dataflow-Variablenkonfigurationen enthält, die Erstellung von Dataflow-Jobs aber deaktiviert ist:

    common_params = {
      project = "PROJECT_ID"
      region  = "GCP_REGION"
    }
    datastream_params = {
      mysql_host = "MYSQL_HOST_IP_ADDRESS"
      mysql_username = "MYSQL_USERNAME"
      mysql_password = "MYSQL_PASSWORD"
      mysql_port     = 3306
      mysql_database = {
        database = "DATABASE_NAME"
      }
      private_connectivity = {
        vpc_name = "VPC_NAME"
        range = "RESERVED_RANGE"
      }
    }
    dataflow_params = {
      skip_dataflow = false
      enable_backfill = false
      template_params = {
        spanner_database_id = "SPANNER_DATABASE_ID"
        spanner_instance_id = "SPANNER_INSTANCE_ID"
      }
      runner_params = {
        max_workers = 10
        num_workers = 4
        on_delete   = "cancel"
        network     = "VPC_NETWORK"
        subnetwork  = "SUBNETWORK_NAME"
      }
    }
  

Die Terraform-Variablen werden in der folgenden Liste beschrieben:

  • project: die Google Cloud Projekt-ID.
  • region: die Google Cloud Region.
  • mysql_host: die IP-Adresse Ihrer MySQL-Quellinstanz.
  • mysql_username: Der Nutzername für Ihre MySQL-Quellinstanz.
  • mysql_password: Das Passwort für Ihre MySQL-Quellinstanz.
  • mysql_port: die Portnummer der MySQL-Quellinstanz.
  • database: Der Name Ihrer MySQL-Quelldatenbank in der Instanz.
  • vpc_name: der Name einer vorhandenen VPC, die von Datastream verwendet wird.
  • range: Der IP-Bereich in der VPC, den Sie für die Verwendung durch Datastream reserviert haben.
  • skip_dataflow: Legen Sie diesen Wert auf true fest, um zu verhindern, dass Dataflow Dataflow-Jobs erstellt.
  • enable_backfill: Setzen Sie diesen Wert auf false, um zu verhindern, dass mit der Terraform-Vorlage Dataflow-Jobs erstellt werden.
  • spanner_database_id: Die ID der Spanner-Zieldatenbank.
  • spanner_instance_id: Die ID der Ziel-Spanner-Instanz.
  • max_workers: Legt die maximale Anzahl von Workern fest, die von Dataflow erstellt werden.
  • min_workers: Legt die maximale Anzahl von Workern fest, die von Dataflow erstellt werden.
  • network: Der Name einer vorhandenen VPC, die von Dataflow verwendet wird.
  • subnetwork: der Name des zugewiesenen Subnetzwerks in der VPC, in dem Dataflow Worker erstellen kann.

CDC-Terraform-Vorlage ausführen

Für die CDC-Migration müssen Sie die Terraform-Vorlage ausführen:

  1. Initialisieren Sie Terraform mit dem folgenden Befehl:

      terraform init
    

  2. Validieren Sie die Terraform-Dateien mit dem folgenden Befehl:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Führen Sie die Terraform-Konfiguration mit dem folgenden Befehl aus:

      terraform apply --var-file=terraform_simple.tfvars
    

    Die Terraform-Konfiguration erzeugt eine Ausgabe, die etwa so aussieht:

    Outputs:
    resource_ids = {
      "datastream_source_connection_profile" = "source-mysql-thorough-wombat"
      "datastream_stream" = "mysql-stream-thorough-wombat"
      "datastream_target_connection_profile" = "target-gcs-thorough-wombat"
      "gcs_bucket" = "live-migration-thorough-wombat"
      "pubsub_subscription" = "live-migration-thorough-wombat-sub"
      "pubsub_topic" = "live-migration-thorough-wombat"
    }
    resource_urls = {
      "datastream_source_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/source-mysql-thorough-wombat?project=your-project-here"
      "datastream_stream" = "https://console.cloud.google.com/datastream/streams/locations/us-central1/instances/mysql-stream-thorough-wombat?project=your-project-here"
      "datastream_target_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/target-gcs-thorough-wombat?project=your-project-here"
      "gcs_bucket" = "https://console.cloud.google.com/storage/browser/live-migration-thorough-wombat?project=your-project-here"
      "pubsub_subscription" = "https://console.cloud.google.com/cloudpubsub/subscription/detail/live-migration-thorough-wombat-sub?project=your-project-here"
      "pubsub_topic" = "https://console.cloud.google.com/cloudpubsub/topic/detail/live-migration-thorough-wombat?project=your-project-here"
    }
    

Datastream streamt die CDC jetzt in einen Cloud Storage-Bucket. Sie müssen die Backfill-Migration durchführen und die CDC-Migration später abschließen.

Backfill-Migration durchführen

Spanner bietet eine Terraform-Vorlage für die Backfill-Migration. Mit der Terraform-Vorlage wird die folgende Ressource bereitgestellt und verwaltet:

  • Dataflow-Job: Der Dataflow-Job, der aus der MySQL-Quellinstanz liest und in die Spanner-Zieldatenbank schreibt.

Terraform-Konfiguration für die Backfill-Migration vorbereiten

    job_name = "JOB_NAME"
    project = "PROJECT_ID"
    region = "GCP_REGION"
    working_directory_bucket = "WORKING_DIRECTORY_BUCKET"
    working_directory_prefix = "WORKING_DIRECTORY_PREFIX"
    source_config_url = "SOURCE_CONFIG_URL"
    username = "USERNAME"
    password = "PASSWORD"
    instance_id = "SPANNER_INSTANCE_ID"
    database_id  = "SPANNER_DATABASE_ID"
    spanner_project_id = "SPANNER_PROJECT_ID"
  

Die Terraform-Variablen werden in der folgenden Liste beschrieben:

  • job_name: der Name des Dataflow-Jobs.
  • project: die Google Cloud Projekt-ID, in der der Dataflow-Job ausgeführt werden muss.
  • region: die Google Cloud Region.
  • working_directory_bucket: Der Cloud Storage-Bucket zum Hochladen der Sitzungsdatei und zum Erstellen des Ausgabeverzeichnisses.
  • working_directory_prefix: Das Cloud Storage-Bucket-Präfix für das Dataflow-Arbeitsverzeichnis.
  • source_config_url: die IP-Adresse Ihrer MySQL-Quellinstanz.
  • username: Der Nutzername für Ihre MySQL-Quellinstanz.
  • password: Das Passwort für Ihre MySQL-Quellinstanz.
  • instance_id: Die ID der Ziel-Spanner-Instanz.
  • database_id: Die ID der Spanner-Zieldatenbank.
  • spanner_project_id: die Projekt-ID, in der sich Ihre Spanner-Instanz befindet. Diese Projekt-ID kann sich von dem Projekt unterscheiden, in dem Sie Dataflow ausführen.

Terraform-Vorlage für die Backfill-Migration ausführen

So führen Sie die Backfill-Migration durch:

  1. Initialisieren Sie Terraform mit dem folgenden Befehl:

      terraform init
    

  2. Validieren Sie die Terraform-Dateien mit dem folgenden Befehl:

      terraform plan --var-file=terraform_simple.tfvars
    

  3. Führen Sie die Terraform-Konfiguration mit dem folgenden Befehl aus:

      terraform apply --var-file=terraform_simple.tfvars
    

    Die Terraform-Konfiguration erzeugt eine Ausgabe, die etwa so aussieht:

    Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
    Outputs:
    dataflow_job_id = [
      "2024-06-05_00_41_11-4759981257849547781",
    ]
    dataflow_job_url = [
      "https://console.cloud.google.com/dataflow/jobs/gcp-region/2024-06-05_00_41_11-4759981257849547781",
    ]
    

Wenn bei der Backfill-Migration eine Zeile nicht in Spanner geschrieben werden kann, wird sie in ein Verzeichnis für unzustellbare Nachrichten in einem Cloud Storage-Bucket geschrieben.

Sie können versuchen, diese Zeilen aus dem Dead-Letter-Warteschlangenverzeichnis in Spanner zu schreiben, bevor Sie die CDC-Migration abschließen.

Wenn Sie versuchen möchten, diese Zeilen aus dem Verzeichnis für unzustellbare Nachrichten in Spanner zu schreiben, bevor Sie die CDC-Migration abschließen, führen Sie den folgenden Befehl aus:

gcloud dataflow flex-template run JOB_NAME \
--region=GCP_REGION \
--template-file-gcs-location=gs://dataflow-templates/latest/flex/Cloud_Datastream_to_Spanner \
--additional-experiments=use_runner_v2 \
--parameters inputFilePattern=inputFilePattern,streamName="ignore", \
--datastreamSourceType=SOURCE_TYPE\
instanceId=INSTANCE_ID,databaseId=DATABASE_ID,sessionFilePath=SESSION_FILE_PATH, \
deadLetterQueueDirectory=DLQ_DIRECTORY,runMode="retryDLQ"

Die Variablen für gcloud CLI-Befehle werden in der folgenden Liste beschrieben:

  • job_name: der Name des Dataflow-Jobs.
  • region: die Google Cloud Region.
  • inputFilePattern: Der Cloud Storage-Bucket-Speicherort des Eingabedateimusters.
  • datastreamSourceType: Der Quelltyp, z. B. MySQL.
  • instanceId: Die ID der Ziel-Spanner-Instanz.
  • databaseId: Die ID der Spanner-Zieldatenbank.
  • sessionFilePath: der Cloud Storage-Bucket-Pfad zur Sitzungsdatei.
  • deadLetterQueueDirectory: der Cloud Storage-Bucket-Pfad zum DLQ-Verzeichnis.

CDC-Migration abschließen

Nach Abschluss der Backfill-Migration können Sie Dataflow verwenden, um die CDC-Daten zu Spanner zu migrieren. Der Dataflow-Job übernimmt die Änderungsereignisse aus dem Cloud Storage-Bucket und schreibt sie in Spanner.

Nachdem fast alle Daten aus dem Cloud Storage-Bucket in Spanner geschrieben wurden, beenden Sie die Schreibvorgänge in die MySQL-Quellinstanz, damit die verbleibenden Änderungen in Spanner geschrieben werden können.

Dies führt zu einer kurzen Ausfallzeit, während Spanner die MySQL-Quellinstanz einholt. Nachdem alle Änderungen in Spanner geschrieben wurden, kann Ihre Anwendung Spanner als Datenbank verwenden.

Um die CDC-Migration abzuschließen, ändern Sie den Wert des Terraform-Parameters skip_dataflow in false und führen Sie die Terraform-Vorlage für die Live-Migration noch einmal aus.

Führen Sie die Terraform-Konfiguration mit dem folgenden Befehl aus:

      terraform apply --var-file=terraform_simple.tfvars
    

Nächste Schritte