Von DynamoDB zu Cloud Spanner migrieren

In dieser Anleitung wird beschrieben, wie Sie von Amazon DynamoDB zu Cloud Spanner migrieren. Das Dokument richtet sich in erster Linie an Inhaber von Anwendungen, die von einem NoSQL-System zu Cloud Spanner wechseln möchten, einem vollständig relationalen, fehlertoleranten, hoch skalierbaren SQL-Datenbanksystem, das Unterstützung für Transaktionen bietet. Wenn Ihre Amazon DynamoDB-Tabellen in Bezug auf Typen und Layout einheitlich sind, ist die Zuordnung zu Cloud Spanner unkompliziert. Enthalten Ihre Amazon DynamoDB-Tabellen jedoch beliebige Datentypen und Werte, ist es möglicherweise einfacher, auf andere NoSQL-Dienste wie Cloud Datastore oder Firebase umzusteigen.

In dieser Anleitung wird davon ausgegangen, dass Sie mit Datenbankschemas, Datentypen, den Grundlagen von NoSQL und mit relationalen Datenbanksystemen vertraut sind. In dieser Anleitung werden vordefinierte Aufgaben ausgeführt, um eine Beispielmigration vorzunehmen. Wenn Sie die Anleitung abgeschlossen haben, können Sie den bereitgestellten Code und die Schritte an Ihre Umgebung anpassen.

Das folgende Architekturdiagramm enthält eine Übersicht der Komponenten, die in der Anleitung zur Datenmigration verwendet werden:

Architekturdiagramm der Migrationskomponenten

Ziele

  • Daten von Amazon DynamoDB in Cloud Spanner migrieren
  • Cloud Spanner-Datenbank und -Migrationstabelle erstellen
  • NoSQL-Schema einem relationalen Schema zuordnen
  • Beispiel-Dataset, das Amazon DynamoDB verwendet, erstellen und exportieren
  • Daten zwischen Amazon S3 und Cloud Storage übertragen
  • Cloud Dataflow verwenden, um Daten in Cloud Spanner zu laden

Kosten

In dieser Anleitung werden folgende abrechenbare Komponenten der Google Cloud Platform verwendet:

  • GKE
  • Cloud Pub/Sub
  • Cloud Storage
  • Cloud Dataflow

Die Gebühren für Cloud Spanner basieren auf der Anzahl der Knotenstunden und der Menge der Daten, die während des monatlichen Abrechnungszyklus gespeichert werden. Im Rahmen der Anleitung verwenden Sie eine minimale Konfiguration dieser Ressourcen, die am Ende bereinigt werden. In der Praxis müssen Sie Ihre Durchsatz- und Speicheranforderungen abschätzen und dann mithilfe der Dokumentation zu Cloud Spanner-Instanzen ermitteln, wie viele Knoten Sie benötigen.

Neben GCP-Ressourcen werden in dieser Anleitung die folgenden Amazon Web Services-Ressourcen (AWS) verwendet:

  • Amazon EMR
  • AWS Lambda
  • Amazon S3
  • Amazon DynamoDB

Diese Dienste werden nur während der Migration benötigt. Am Ende der Anleitung können Sie die Schritte zum Bereinigen aller Ressourcen ausführen, um unnötige Gebühren zu vermeiden. Mit dem AWS-Preisrechner können Sie diese Kosten schätzen.

Mit dem Preisrechner können Sie die Kosten für Ihre voraussichtliche Nutzung schätzen lassen. Neuen Nutzern der GCP steht unter Umständen eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich in Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, registrieren Sie sich hier für ein neues Konto.

  2. Wählen Sie ein Google Cloud Platform-Projekt aus oder erstellen Sie eines.

    Zur Seite "Ressourcen verwalten"

  3. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud Platform-Projekt aktiviert ist.

    Informationen zum Aktivieren der Abrechnung

  4. Aktivieren Sie die Cloud Spanner, Cloud Pub/Sub, Compute Engine and Cloud Dataflow erforderlichen APIs.

    Aktivieren Sie die APIs.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Umgebung vorbereiten

In dieser Anleitung führen Sie Befehle in Cloud Shell aus. Mit Cloud Shell erhalten Sie Zugriff auf die Befehlszeile in der GCP. Außerdem enthält Cloud Shell das Cloud SDK und weitere Tools, die Sie für die Entwicklung in der GCP benötigen. Die Initialisierung von Cloud Shell kann mehrere Minuten dauern.

  1. Aktivieren Sie Cloud Shell.

    CLOUD SHELL AKTIVIEREN

  2. Legen Sie die Compute Engine-Standardzone fest. Beispiel: us-central1-b.

    gcloud config set compute/zone us-central1-b
    
  3. Klonen Sie das GitHub-Repository mit dem Beispielcode.

    git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
    
  4. Rufen Sie das geklonte Verzeichnis auf.

    cd dynamodb-spanner-migration
    
  5. Erstellen Sie eine virtuelle Python-Umgebung.

    virtualenv --python python2 env
    
  6. Aktivieren Sie die virtuelle Umgebung.

    source env/bin/activate
    
  7. Installieren Sie die erforderlichen Python-Module.

    pip install -r requirements.txt
    

AWS-Zugriff konfigurieren

In dieser Anleitung erstellen und löschen Sie Amazon DynamoDB-Tabellen, Amazon S3-Buckets und andere Ressourcen. Damit Sie auf diese Ressourcen zugreifen können, müssen Sie die erforderlichen AWS IAM-Berechtigungen (Identity and Access Management) erstellen. Sie können ein Test- oder Sandbox-AWS-Konto verwenden, um eine Beeinträchtigung der Produktionsressourcen im selben Konto zu vermeiden.

AWS IAM-Rolle für AWS Lambda erstellen

In diesem Abschnitt erstellen Sie eine AWS IAM-Rolle, die in einem späteren Anleitungsschritt in AWS Lambda verwendet wird.

  1. Gehen Sie in der AWS-Konsole auf den Abschnitt IAM, klicken Sie auf Roles (Rollen) und wählen Sie Create Role (Rolle erstellen) aus.
  2. Klicken Sie unter Choose the service that will use this role (Dienst auswählen, der diese Rolle verwenden soll) auf Lambda und wählen Sie anschließend Next: Permissions (Nächster Schritt: Berechtigungen) aus.
  3. Geben Sie im Feld Policy Type (Richtlinientyp) den Wert AWSLambdaDynamoDBExecutionRole ein.
  4. Klicken Sie auf das Kästchen AWSLambdaDynamoDBExecutionRole und dann auf Next: Review (Nächster Schritt: Überprüfen).
  5. Geben Sie im Feld Role name (Name der Rolle) den Wert dynamodb-spanner-lambda-role ein und klicken Sie auf Create Role (Rolle erstellen).

AWS IAM-Nutzer erstellen

Mit den folgenden Schritten erstellen Sie einen AWS IAM-Nutzer mit programmatischem Zugriff auf AWS-Ressourcen, die in der Anleitung verwendet werden.

  1. Klicken Sie im Abschnitt IAM der AWS-Konsole auf Users (Nutzer) und wählen Add User (Nutzer hinzufügen) aus.
  2. Geben Sie im Feld User name (Nutzername) die Bezeichnung dynamodb-spanner-migration ein.
  3. Klicken Sie unter Access type (Zugriffstyp) auf Programmatic access (Programmatischer Zugriff).

  4. Klicken Sie auf Next: Permissions (Nächster Schritt: Berechtigungen).

  5. Klicken Sie auf Attach existing policies directly (Vorhandene Richtlinien direkt anhängen) und wählen Sie die zwei folgenden Richtlinien aus:

    • AmazonDynamoDBFullAccesswithDataPipeline
    • AmazonS3FullAccess
  6. Klicken Sie auf Next: Review (Nächster Schritt: Überprüfen) und dann auf Create user (Nutzer erstellen).

  7. Klicken Sie auf Show (Anzeigen), um die Anmeldedaten aufzurufen. Die Zugriffsschlüssel-ID und der geheime Zugriffsschlüssel für den neu erstellten Nutzer werden angezeigt. Lassen Sie dieses Fenster vorerst geöffnet, da Sie die Anmeldedaten im nächsten Abschnitt benötigen. Sie sollten diese Anmeldedaten an einem sicheren Ort aufbewahren, da Sie damit Änderungen an Ihrem Konto vornehmen können, die sich ggf. auf die Umgebung auswirken. Am Ende dieser Anleitung können Sie den IAM-Nutzer löschen.

AWS-Befehlszeilenschnittstelle konfigurieren

  1. Konfigurieren Sie die AWS-Befehlszeilenschnittstelle in Cloud Shell.

    aws configure
    

    Die Ausgabe sieht so aus:

    $ aws configure
    AWS Access Key ID [None]: PASTE_YOUR_ACCESS_KEY_ID
    AWS Secret Access Key [None]: PASTE_YOUR_SECRET_ACCESS_KEY
    Default region name [None]: us-west-2
    Default output format [None]:
    user@project:~/dynamodb-spanner$
    
    • Geben Sie die ACCESS KEY ID und den SECRET ACCESS KEY des AWS IAM-Kontos ein, das Sie erstellt haben.
    • Geben Sie im Feld Default region name (Standardregionsname) den Wert us-west-2 ein. Übernehmen Sie die Standardwerte der restlichen Felder.
  2. Schließen Sie das Fenster der AWS IAM-Konsole.

Informationen zum Datenmodell

Im folgenden Abschnitt werden die Ähnlichkeiten und Unterschiede zwischen Datentypen, Schlüsseln und Indexen für Amazon DynamoDB und Cloud Spanner beschrieben.

Datentypen

Cloud Spanner verwendet Standard-SQL-Datentypen. In der folgenden Tabelle wird die Zuordnung von Datentypen in Amazon DynamoDB zu Datentypen in Cloud Spanner beschrieben.

Amazon DynamoDB Cloud Spanner
Number Je nach Genauigkeit oder beabsichtigter Verwendung kann dieser Datentyp den Typen INT64, FLOAT64, TIMESTAMP oder DATE zugeordnet werden.
String String
Boolean BOOL
Null Kein expliziter Typ. Spalten können Nullwerte enthalten.
Binary Byte
Sets Array
Map und List Struct, wenn die Struktur konsistent ist und mithilfe der Tabellen-DDL-Syntax beschrieben werden kann.

Primärschlüssel

Ein Amazon DynamoDB-Primärschlüssel sorgt für Eindeutigkeit und kann entweder ein Hash-Schlüssel oder eine Kombination aus Hash-Schlüssel und Bereichsschlüssel sein. In dieser Anleitung wird zuerst die Migration einer Amazon DynamoDB-Tabelle modelliert, deren Primärschlüssel ein Hash-Schlüssel ist. Dieser Hash-Schlüssel wird zum Primärschlüssel Ihrer Cloud Spanner-Tabelle. Im Abschnitt zu verschränkten Tabellen modellieren Sie später eine Situation, in der eine Amazon DynamoDB-Tabelle einen Primärschlüssel verwendet, der sich aus einem Hash-Schlüssel und einem Bereichsschlüssel zusammensetzt.

Sekundäre Indexe

Sowohl Amazon DynamoDB als auch Cloud Spanner unterstützen die Erstellung eines Index für ein Attribut, das kein Primärschlüssel ist. Notieren Sie sich alle sekundären Indexe in Ihrer Amazon DynamoDB-Tabelle, damit Sie sie in der Cloud Spanner-Tabelle erstellen können, die in einem späteren Abschnitt dieser Anleitung behandelt wird.

Beispieltabelle

Zur Vereinfachung dieser Anleitung migrieren Sie die folgende Beispieltabelle von Amazon DynamoDB in Cloud Spanner:

Amazon DynamoDB Cloud Spanner
Tabellenname Migration Migration
Primärschlüssel "Username" : String "Username" : STRING(1024)
Schlüsseltyp Hash
Sonstige Felder Zipcode: Number Subscribed: Boolean ReminderDate: String PointsEarned: Number Zipcode: INT64 Subscribed: BOOL ReminderDate: DATE PointsEarned: INT64

Amazon DynamoDB-Tabelle vorbereiten

Im folgenden Abschnitt erstellen Sie eine Amazon DynamoDB-Quelltabelle und füllen diese mit Daten.

  1. Erstellen Sie in Cloud Shell eine Amazon DynamoDB-Tabelle mit den Attributen der Beispieltabelle.

    aws dynamodb create-table --table-name Migration \
        --attribute-definitions AttributeName=Username,AttributeType=S \
        --key-schema AttributeName=Username,KeyType=HASH \
        --provisioned-throughput ReadCapacityUnits=75,WriteCapacityUnits=75
    
  2. Prüfen Sie, ob der Tabellenstatus ACTIVE lautet.

    aws dynamodb describe-table --table-name Migration \
        --query 'Table.TableStatus'
    
  3. Füllen Sie die Tabelle mit Beispieldaten.

    python make-fake-data.py --table Migration --items 25000
    

Cloud Spanner-Datenbank erstellen

Sie erstellen eine Instanz mit einem einzelnen Knoten, die für Tests und den Umfang dieser Anleitung ausreichend ist. In einer Produktionsbereitstellung werden weitere Knoten benötigt. Informationen zur Ermittlung der geeigneten Anzahl von Knoten, die den Leistungsanforderungen Ihrer Datenbank entspricht, finden Sie in der Dokumentation zu Cloud Spanner-Instanzen.

In diesem Beispiel erstellen Sie gleichzeitig mit der Datenbank ein Tabellenschema. Außerdem ist es möglich und üblich, Schemaaktualisierungen durchzuführen, nachdem Sie die Datenbank erstellt haben.

  1. Erstellen Sie eine Cloud Spanner-Instanz in derselben Region, in der Sie die Compute Engine-Standardzone festgelegt haben. Beispiel: us-central1.

    gcloud spanner instances create spanner-migration \
        --config=regional-us-central1 --nodes=1 \
        --description="Migration Demo"
    
  2. Erstellen Sie zusammen mit der Beispieltabelle eine Datenbank in der Cloud Spanner-Instanz.

    gcloud spanner databases create migrationdb \
        --instance=spanner-migration \
        --ddl "CREATE TABLE Migration ( \
                Username STRING(1024) NOT NULL, \
                PointsEarned INT64, \
                ReminderDate DATE, \
                Subscribed BOOL, \
                Zipcode INT64, \
             ) PRIMARY KEY (Username)"
    

Datenbank pausieren

In den nächsten Abschnitten erfahren Sie, wie Sie die Amazon DynamoDB-Quelltabelle exportieren und die Cloud Pub/Sub-Replikation so einstellen, dass während des Exports auftretende Änderungen an der Datenbank erfasst werden. Wenn die Änderungen an der Datenbank nicht idempotent sind, ist es nicht sicher, dieselben Daten mehrmals zu schreiben. In diesen Fällen sollten die unten beschriebenen Schritte vorzugsweise während eines Wartungszeitraums ausgeführt werden, da Sie die von der Anwendung an der Tabelle vorgenommenen Änderungen unterbrechen können.

Änderungen an Cloud Pub/Sub streamen

Zum Streamen von Datenbankänderungen an Cloud Pub/Sub verwenden Sie eine AWS Lambda-Funktion.

  1. Aktivieren Sie Amazon DynamoDB-Streams für Ihre Quelltabelle in Cloud Shell.

    aws dynamodb update-table --table-name Migration \
        --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
    
  2. Richten Sie ein Cloud Pub/Sub-Thema ein, das die Änderungen empfangen soll.

    gcloud pubsub topics create spanner-migration
    

    Die Ausgabe sieht so aus:

    $ gcloud pubsub topics create spanner-migration
    Created topic [projects/your-project/topics/spanner-migration].
    
  3. Erstellen Sie ein Cloud IAM-Dienstkonto, um Tabellenaktualisierungen an das Cloud Pub/Sub-Thema zu übertragen.

    gcloud iam service-accounts create spanner-migration \
        --display-name="Spanner Migration"
    

    Die Ausgabe sieht so aus:

    $ gcloud iam service-accounts create spanner-migration --display-name="Spanner Migration"
    Created service account [spanner-migration].
    
  4. Erstellen Sie eine Cloud IAM-Richtlinienbindung, sodass das Dienstkonto die Berechtigung hat, Inhalte im Cloud Pub/Sub zu veröffentlichen. Ersetzen Sie GOOGLE_CLOUD_PROJECT durch den Namen Ihres GCP-Projekts.

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --role roles/pubsub.publisher \
        --member serviceAccount:spanner-migration@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    

    Die Ausgabe sieht so aus:

    $ gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
      --role roles/pubsub.publisher \
      --member serviceAccount:spanner-migration@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    bindings: (...truncated...) - members: - serviceAccount:spanner-migration@solution-z.iam.gserviceaccount.com role: roles/pubsub.publisher
  5. Erstellen Sie Anmeldedaten für das Dienstkonto.

    gcloud iam service-accounts keys create credentials.json \
        --iam-account spanner-migration@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    

    Die Ausgabe sieht so aus:

    $ gcloud iam service-accounts keys create credentials.json --iam-account spanner-migration@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.iam.gserviceaccount.com]
  6. Bereiten Sie die AWS Lambda-Funktion vor und verpacken Sie sie, um Änderungen in Amazon DynamoDB-Tabellen an das Cloud Pub/Sub-Thema zu übertragen.

    pip install --ignore-installed --target=lambda-deps google-cloud-pubsub==0.35
    cd lambda-deps; zip -r9 ../pubsub-lambda.zip *; cd -
    zip -g pubsub-lambda.zip ddbpubsub.py
  7. Erstellen Sie eine Variable, um den Amazon Resource Name (ARN) der zuvor erstellten Lambda-Ausführungsrolle zu erfassen.

    LAMBDA_ROLE=$(aws iam list-roles \
        --query 'Roles[?RoleName==`dynamodb-spanner-lambda-role`].[Arn]' \
        --output text)
    
  8. Verwenden Sie das Paket pubsub-lambda.zip, um die AWS Lambda-Funktion zu erstellen.

    aws lambda create-function --function-name dynamodb-spanner-lambda \
        --runtime python2.7 --role $LAMBDA_ROLE \
        --handler ddbpubsub.lambda_handler --zip fileb://pubsub-lambda.zip \
        --environment Variables="{SVCACCT=$(base64 -w 0 credentials.json),PROJECT=$GOOGLE_CLOUD_PROJECT,TOPIC=spanner-migration}"
    

    Die Ausgabe sieht so aus:

    $ aws lambda create-function --function-name dynamodb-spanner-lambda \
    >   --runtime python2.7 --role $LAMBDA_ROLE \
    >   --handler ddbpubsub.lambda_handler --zip fileb://pubsub-lambda.zip \
    >   --environment Variables="{SVCACCT=$(base64 -w 0 credentials.json),PROJECT=$GOOGLE_CLOUD_PROJECT,TOPIC=spanner-migration}"
    {
        "FunctionName": "dynamodb-spanner-lambda",
        "LastModified": "2018-07-07T12:53:58.670+0000",
        "RevisionId": "e58e8408-cd3a-4155-a184-4efc0da80bfb",
        "MemorySize": 128,
    ... truncated output...
  9. Erstellen Sie eine Variable, um den ARN des Amazon DynamoDB-Streams für Ihre Tabelle zu erfassen.

    STREAMARN=$(aws dynamodb describe-table \
        --table-name Migration \
        --query "Table.LatestStreamArn" \
        --output text)
    
  10. Verknüpfen Sie die Lambda-Funktion mit der Amazon DynamoDB-Tabelle.

    aws lambda create-event-source-mapping --event-source $STREAMARN \
        --function-name dynamodb-spanner-lambda --enabled \
        --starting-position TRIM_HORIZON
    
  11. Zum Optimieren der Reaktionszeit beim Testen fügen Sie am Ende des vorherigen Befehls --batch-size 1 hinzu. Dadurch wird die Funktion jedes Mal ausgelöst, wenn Sie ein Element erstellen, aktualisieren oder löschen.

    Die Ausgabe sieht so aus:

    $ aws lambda create-event-source-mapping --event-source $STREAMARN \
    >     --function-name dynamodb-spanner-lambda --enabled --starting-position TRIM_HORIZON
    {
        "UUID": "44e4c2bf-493a-4ba2-9859-cde0ae5c5e92",
        "StateTransitionReason": "User action",
        "LastModified": 1530662205.549,
        "BatchSize": 100,
        "EventSourceArn": "arn:aws:dynamodb:us-west-2:accountid:table/Migration/stream/2018-07-03T15:09:57.725",
        "FunctionArn": "arn:aws:lambda:us-west-2:accountid:function:dynamodb-spanner-lambda",
        "State": "Creating",
        "LastProcessingResult": "No records processed"
    }
    

Amazon DynamoDB-Tabelle nach Amazon S3 exportieren

  1. Erstellen Sie in Cloud Shell eine Variable für einen Bucket-Namen, den Sie in den folgenden Abschnitten verwenden.

    BUCKET=$DEVSHELL_PROJECT_ID-dynamodb-spanner-export
    
  2. Erstellen Sie einen Amazon S3-Bucket, in den der DynamoDB-Export kopiert werden soll.

    aws s3 mb s3://$BUCKET
    
  3. Klicken Sie in der AWS Management Console auf Data Pipeline (Datenpipeline).

  4. Klicken Sie auf Create new pipeline (Neue Pipeline erstellen), um den Exportjob zu definieren.

  5. Geben Sie im Feld Name Export to Amazon S3 (Export nach Amazon S3) ein.

  6. Wählen Sie für Source (Quelle) folgende Optionen aus:

    • Build using a template (Mit einer Vorlage erstellen)
    • Export DynamoDB table to Amazon S3 (Amazon DynamoDB-Tabelle nach Amazon S3 exportieren)
  7. Nehmen Sie im Abschnitt Parameters (Parameter) folgende Einstellungen vor:

    1. Geben Sie im Feld Source DynamoDB table name (Name der DynamoDB-Quelltabelle) Migration ein.
    2. Klicken Sie im Feld Output S3 folder (S3-Ausgabeordner) auf das Ordnersymbol und wählen Sie den soeben erstellten Amazon S3-Bucket [Your-Project-ID]-dynamodb-spanner-export aus. Dabei steht [YOUR-PROJECT-ID] für Ihre GCP-Projekt-ID.
    3. Geben Sie im Feld DynamoDB read throughput ratio (DynamoDB-Lesedurchsatzrate) den Wert 1 ein, um die gesamte verfügbare Lesekapazität während des Exports zu nutzen. In einer Produktionsumgebung passen Sie den Wert so an, dass Live-Vorgänge ungehindert durchgeführt werden.
    4. Geben Sie im Feld Region of your DynamoDB table (Region der DynamoDB-Tabelle) den Namen der Region ein, z. B. us-west-2.
  8. Damit die Sicherungsjobs sofort gestartet werden, klicken Sie im Abschnitt Schedule (Zeitplan) für Run (Ausführen) auf On pipeline activation (Bei Aktivierung der Pipeline).

  9. Geben Sie unter Pipeline Configuration (Pipelinekonfiguration) im Feld Logging den Wert Disabled ein. Wenn Sie sich zum Migrieren einer Produktionstabelle an diese Anleitung halten, sollten Sie diese Option aktiviert lassen und den Verweis auf einen separaten Amazon S3-Bucket für Logs übernehmen. Das erleichtert Ihnen die Fehlerbehebung. Übernehmen Sie alle anderen Standardparameter.

  10. Klicken Sie auf Activate (Aktivieren), um die Sicherung zu starten.

  11. Wenn Sie aufgefordert werden, Validierungswarnungen zu bearbeiten, klicken Sie auf Activate (Aktivieren). In einer Produktionssituation legen Sie eine maximale Dauer für den Job fest und aktivieren die Logging-Funktion.

  12. Klicken Sie auf Refresh (Aktualisieren), um den Status des Sicherungsvorgangs zu aktualisieren. Das Erstellen der Ressourcen und das Beenden des Exports dauert mehrere Minuten. In einer Produktionsumgebung können Sie diesen Prozess beschleunigen, indem Sie den Jobs der Datenpipeline mehr EMR-Ressourcen zur Verfügung stellen.

    Wenn der Prozess beendet wurde, sehen Sie sich den Ausgabe-Bucket an.

    aws s3 ls --recursive s3://$BUCKET
    

    Der Exportjob ist abgeschlossen, wenn eine Datei mit dem Namen _SUCCESS vorliegt.

    $ aws s3 ls --recursive s3://$BUCKET
    
    2018-06-30 13:08:11 3736518 2018-06-30-20-01-21/76b53eea-46d1-4293-ba51-11759f5c65fa
    2018-06-30 13:08:20       0 2018-06-30-20-01-21/_SUCCESS
    2018-06-30 13:08:20     178 2018-06-30-20-01-21/manifest
    

Datenbank öffnen

Wenn Sie Schreibvorgänge in die Datenbank vor dem Export angehalten haben, müssen Sie sie jetzt wieder aktivieren. Die Cloud Pub/Sub-Bereitstellung wurde eingerichtet und Sie können alle nach dem Export vorgenommenen Tabellenänderungen verarbeiten.

Exportierte Tabelle in Cloud Storage kopieren

  1. Erstellen Sie in Cloud Shell einen Cloud Storage-Bucket, in den die exportierten Dateien von Amazon S3 kopiert werden sollen.

    gsutil mb gs://$BUCKET
    
  2. Synchronisieren Sie die Dateien von Amazon S3 nach Cloud Storage. Für die meisten Kopiervorgänge können Sie den Befehl rsync verwenden. Wenn die Exportdateien groß sind (ab mehreren GB), können Sie die Übertragung mit dem Cloud Storage Transfer Service im Hintergrund durchführen.

    gsutil rsync -d -r s3://$BUCKET gs://$BUCKET
    

    Die Ausgabe sieht so aus:

    $ gsutil rsync -d -r s3://$BUCKET gs://$BUCKET
    Building synchronization state...
    Starting synchronization...
    Copying s3://project-dynamodb-spanner-export/2018-06-30-20-01-21/76b53eea-46d1-4293-ba51-11759f5c65fa [Content-Type=binary/octet-stream]...
    Copying s3://project-dynamodb-spanner-export/2018-06-30-20-01-21/_SUCCESS [Content-Type=binary/octet-stream]...
    Copying s3://project-dynamodb-spanner-export/2018-06-30-20-01-21/manifest [Content-Type=binary/octet-stream]...
    / [3 files][  3.6 MiB/  3.6 MiB]
    Operation completed over 3 objects/3.6 MiB.
    

Batch-Import der Daten

  1. Führen Sie einen Cloud Dataflow-Job mit Apache Beam-Beispielcode aus, um die Daten aus den exportierten Dateien in die Cloud Spanner-Tabelle zu schreiben.

    cd dataflow
    mvn compile
    mvn exec:java \
        -Dexec.mainClass=com.example.spanner_migration.SpannerBulkWrite \
        -Dexec.args="--project=$GOOGLE_CLOUD_PROJECT \
                     --instanceId=spanner-migration \
                     --databaseId=migrationdb \
                     --table=Migration \
                     --importBucket=$BUCKET \
                     --runner=dataflow"
    
    1. Gehen Sie in der GCP Console auf Cloud Dataflow, um den Fortschritt des Importjobs zu beobachten.

      Weiter zu Cloud Dataflow

    2. Während der Job ausgeführt wird, können Sie sich das Ausführungsdiagramm ansehen, um die Logs zu überprüfen. Klicken Sie auf den Job mit dem Status "Wird ausgeführt".

      Importjob ausführen

  2. Klicken Sie auf die einzelnen Phasen, um zu sehen, wie viele Elemente schon verarbeitet wurden. Der Import ist abgeschlossen, wenn für alle Phasen der Status Erfolgreich angezeigt wird. In jeder Phase wird die gleiche Anzahl von Elementen angezeigt, die in Ihrer Amazon DynamoDB-Tabelle erstellt wurden.

    Erfolgsstufen des Importjobs

  3. Die Anzahl der Einträge in der Cloud Spanner-Zieltabelle muss der Anzahl der Elemente in der Amazon DynamoDB-Tabelle entsprechen.

    aws dynamodb describe-table --table-name Migration --query Table.ItemCount
    gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration --sql="select count(*) from Migration"

    Die Ausgabe sieht so aus:

    $ aws dynamodb describe-table --table-name Migration --query Table.ItemCount
    25000
    $ gcloud spanner databases execute-sql migrationdb --instance=spanner-migration --sql="select count(*) from Migration"
    25000
    
  4. Überprüfen Sie zufällig ausgewählte Einträge in jeder Tabelle auf Konsistenz.

    gcloud spanner databases execute-sql migrationdb \
        --instance=spanner-migration \
        --sql="select * from Migration limit 1"
    

    Die Ausgabe sieht so aus:

    $ gcloud spanner databases execute-sql migrationdb --instance=spanner-migration --sql="select * from Migration limit 1"
    Username    PointsEarned  ReminderDate  Subscribed  Zipcode
    aallen2538  1606          2018-06-18    False       17303
    
  5. Fragen Sie die Amazon DynamoDB-Tabelle mit demselben Username ab, der im vorherigen Schritt von der Cloud Spanner-Abfrage zurückgegeben wurde. Beispiel: aallen2538. Sie müssen einen spezifischen Wert aus Ihrer Datenbank auswählen.

    aws dynamodb get-item --table-name Migration \
        --key '{"Username": {"S": "aallen2538"}}'
    

    Die Werte der anderen Felder sollten den Werten der Cloud Spanner-Ausgabe entsprechen. Die Ausgabe sieht so aus:

    $ aws dynamodb get-item --table-name Migration --key '{"Username": {"S": "aallen2538"}}'
    {
        "Item": {
            "Username": {
                "S": "aallen2538"
            },
            "ReminderDate": {
                "S": "2018-06-18"
            },
            "PointsEarned": {
                "N": "1606"
            },
            "Zipcode": {
                "N": "17303"
            },
            "Subscribed": {
                "BOOL": false
            }
        }
    }
    

Neue Änderungen replizieren

Wenn der Batch-Importjob abgeschlossen ist, richten Sie einen Streamingjob ein, um aktive Aktualisierungen aus der Quelltabelle in Cloud Spanner zu schreiben. Sie abonnieren die Ereignisse über Cloud Pub/Sub und schreiben sie in Cloud Spanner.

Die von Ihnen erstellte Lambda-Funktion ist dazu konfiguriert, Änderungen in der Amazon DynamoDB-Quelltabelle zu erfassen und in Cloud Pub/Sub zu veröffentlichen.

  1. Erstellen Sie ein Abonnement für das Cloud Pub/Sub-Thema, an das AWS Lambda Ereignisse sendet.

    gcloud pubsub subscriptions create spanner-migration \
        --topic spanner-migration
    

    Die Ausgabe sieht so aus:

    $ gcloud pubsub subscriptions create spanner-migration --topic spanner-migration
    Created subscription [projects/your-project/subscriptions/spanner-migration].
    
  2. Führen Sie den Cloud Dataflow-Job in Cloud Shell aus, um die an Cloud Pub/Sub gesendeten Änderungen in die Cloud Spanner-Tabelle zu schreiben.

    cd ~/dynamodb-spanner-migration/dataflow
    mvn exec:java \
        -Dexec.mainClass=com.example.spanner_migration.SpannerStreamingWrite \
        -Dexec.args="--project=$GOOGLE_CLOUD_PROJECT \
                     --instanceId=spanner-migration \
                     --databaseId=migrationdb \
                     --table=Migration \
                     --experiments=allow_non_updatable_job \
        --subscription=projects/$GOOGLE_CLOUD_PROJECT/subscriptions/spanner-migration"
    
    1. Wie beim Laden im Batchverfahren gehen Sie in der GCP Console auf Cloud Dataflow, um den Fortschritt des Importjobs zu beobachten.

      Weiter zu Cloud Dataflow

    2. Klicken Sie auf den Job mit dem Status "Wird ausgeführt".

      Job ausführen

      Im Verarbeitungsdiagramm wird eine ähnliche Ausgabe wie vorher angezeigt, aber jedes verarbeitete Element wird im Statusfenster gezählt. Die Systemverzögerungszeit ist eine grobe Schätzung der voraussichtlichen Verzögerung, bis Änderungen in der Cloud Spanner-Tabelle angezeigt werden.

      Prozesse aufgrund von Verzögerungszeiten ausführen

Der Cloud Dataflow-Job, den Sie in der Batch-Ladephase ausgeführt haben, bestand aus einem endlichen Eingabe-Dataset. Dies wird auch als begrenztes Dataset bezeichnet. Dieser Cloud Dataflow-Job verwendet Cloud Pub/Sub als Streamingquelle und gilt als unbegrenzt. Weitere Informationen zu diesen beiden Quelltypen finden Sie im Programmierleitfaden für Apache Beam im Abschnitt zu PCollections. Der Cloud Dataflow-Job in diesem Schritt soll aktiv bleiben, damit er beim Abschluss nicht beendet wird. Der Cloud Dataflow-Streamingjob behält den Status Wird ausgeführt bei, statt zu Erfolgreich zu wechseln.

Replikation überprüfen

Wenn Sie ein paar Änderungen an der Quelltabelle vornehmen, können Sie verifizieren, ob die Änderungen in die Cloud Spanner-Tabelle repliziert werden.

  1. Führen Sie eine Abfrage für eine nicht vorhandene Zeile in Cloud Spanner durch.

    gcloud spanner databases execute-sql migrationdb \
        --instance=spanner-migration --sql=\
        "SELECT * FROM Migration WHERE Username='my-test-username'"
    
  2. Erstellen Sie in Amazon DynamoDB einen Eintrag mit demselben Schlüssel, den Sie in der Cloud Spanner-Abfrage verwendet haben. Wenn der Befehl erfolgreich ausgeführt wird, erfolgt keine Ausgabe.

    aws dynamodb put-item \
        --table-name Migration \
        --item '{"Username" : {"S" : "my-test-username"}, "Subscribed" : {"BOOL" : false}}'
    
  3. Führen Sie die ursprüngliche Abfrage noch einmal aus, um zu überprüfen, ob sich die Zeile jetzt in Cloud Spanner befindet.

    gcloud spanner databases execute-sql migrationdb \
        --instance=spanner-migration \
        --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
    

    In der Ausgabe wird die eingefügte Zeile angezeigt:

    $ gcloud spanner databases execute-sql migrationdb --instance=spanner-migration --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
    Username PointsEarned ReminderDate Subscribed Zipcode my-test-username None None False
  4. Ändern Sie ein paar Attribute im ursprünglichen Element und aktualisieren Sie die Amazon DynamoDB-Tabelle.

    aws dynamodb update-item \
        --table-name Migration \
        --key '{"Username": {"S":"my-test-username"}}' \
        --update-expression "SET PointsEarned = :pts, Subscribed = :sub" \
        --expression-attribute-values '{":pts": {"N":"4500"}, ":sub": {"BOOL":true}}'\
        --return-values ALL_NEW
    

    Die Ausgabe sieht so aus:

    $ aws dynamodb update-item \
    >   --table-name Migration \
    >   --key '{"Username": {"S":"my-test-username"}}' \
    >   --update-expression "SET PointsEarned = :pts, Subscribed = :sub" \
    >   --expression-attribute-values '{":pts": {"N":"4500"}, ":sub": {"BOOL":true}}'\
    >   --return-values ALL_NEW
    {
        "Attributes": {
            "Username": {
                "S": "my-test-username"
            },
            "PointsEarned": {
                "N": "4500"
            },
            "Subscribed": {
                "BOOL": true
            }
        }
    }
    
  5. Überprüfen Sie, ob die Änderungen in die Cloud Spanner-Tabelle übernommen wurden.

    gcloud spanner databases execute-sql migrationdb \
        --instance=spanner-migration \
        --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
    

    Die Ausgabe sieht so aus:

    $ gcloud spanner databases execute-sql migrationdb --instance=spanner-migration --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
    Username PointsEarned ReminderDate Subscribed Zipcode my-test-username 4500 None True
  6. Löschen Sie das Testelement aus der Amazon DynamoDB-Quelltabelle.

    aws dynamodb delete-item \
        --table-name Migration \
        --key '{"Username": {"S":"my-test-username"}}'
    
  7. Überprüfen Sie, ob die entsprechende Zeile aus der Cloud Spanner-Tabelle gelöscht wurde. Wenn die Änderung übernommen wurde, gibt der folgende Befehl keine Zeilen zurück:

    gcloud spanner databases execute-sql migrationdb \
        --instance=spanner-migration \
        --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
    

Verschränkte Tabellen verwenden

Cloud Spanner unterstützt das Konzept der verschränkten Tabellen. Dies ist ein Entwurfsmodell, bei dem ein Element der obersten Ebene mehrere verschachtelte Elemente enthält, die sich auf das Element der obersten Ebene beziehen. Beispiel: Ein Kunde und seine Bestellungen oder ein Spieler und seine Spielergebnisse. Wenn Ihre Amazon DynamoDB-Quelltabelle einen Primärschlüssel verwendet, der sich aus einem Hash-Schlüssel und einem Bereichsschlüssel zusammensetzt, können Sie ein verschränktes Tabellenschema modellieren, wie im folgenden Diagramm dargestellt. Mit dieser Struktur können Sie für die verschränkte Tabelle effiziente Abfragen durchführen, während Sie Felder in der übergeordneten Tabelle zusammenführen.

Nutzertabelle verglichen mit Bestellungstabelle

Sekundäre Indexe anwenden

Als Best Practice wird empfohlen, sekundäre Indexe auf Cloud Spanner-Tabellen anzuwenden, nachdem die Daten geladen wurden. Da die Replikation jetzt funktioniert, können Sie einen sekundären Index einrichten, um Abfragen zu beschleunigen. Wie Cloud Spanner-Tabellen sind sekundäre Cloud Spanner-Indexe vollständig konsistent. Sie sind nicht letztendlich konsistent, wie es in vielen NoSQL-Datenbanken üblich ist. Diese Funktion kann die Entwicklung Ihrer Anwendung vereinfachen.

Führen Sie eine Abfrage aus, die keine Indexe verwendet. Dabei suchen Sie nach den obersten n Treffern für einen bestimmten Spaltenwert. Dies ist eine gängige Abfrage zur Verbesserung der Datenbankeffizienz in Amazon DynamoDB.

  1. Rufen Sie Cloud Spanner auf.

    Weiter zu Cloud Spanner

  2. Klicken Sie auf ABFRAGE.

    Schaltfläche "Abfrage"

  3. Geben Sie in das Feld Query (Abfrage) den folgenden Wert ein und klicken Sie auf Run query (Abfrage ausführen).

    SELECT Username,PointsEarned FROM Migration
      WHERE Subscribed=true AND
      ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 3 DAY)
    

    Nachdem die Abfrage ausgeführt wurde, klicken Sie auf Explanation (Erklärung) und vergleichen Rows scanned (gescannte Zeilen) mit Rows returned (zurückgegebene Zeilen). Ohne Index scannt Cloud Spanner die gesamte Tabelle, um eine kleine Teilmenge von Daten zurückzugeben, die der Abfrage entsprechen.

    Gescannte Zeilen verglichen mit zurückgegebenen Zeilen

  4. Wenn diese Abfrage regelmäßig ausgeführt wird, sollten Sie einen zusammengesetzten Index für die Spalten "Subscribed" (Abonniert) und "ReminderDate" (Erinnerungsdatum) erstellen. Klicken Sie in der Cloud Spanner-Konsole auf Index erstellen.

  5. Aktivieren Sie Als Text bearbeiten mit einem Klick.

  6. Geben Sie in das Feld DDL-Anweisungen die Indexdefinition ein.

    CREATE INDEX SubscribedDate
    ON Migration (
      Subscribed,
      ReminderDate
    )
    
  7. Klicken Sie auf Erstellen, um den Erstellvorgang der Datenbank im Hintergrund zu starten.

    Schemaaktualisierung wird durchgeführt

  8. Nachdem der Index erstellt wurde, führen Sie die Abfrage noch einmal aus und fügen den Index hinzu.

    SELECT Username,PointsEarned FROM
    Migration@{FORCE_INDEX=SubscribedDate}
      WHERE Subscribed=true AND
      ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 3 DAY)
    

    Untersuchen Sie noch einmal die Erklärung der Abfrage. Die Anzahl der gescannten Zeilen (Rows scanned) ist weniger geworden. Die Anzahl der in jedem Schritt zurückgegebenen Zeilen (Rows returned) entspricht dem von der Abfrage zurückgegebenen Wert.

    Erklärung der Abfrage

Verschränkte Indexe

Sie können in Cloud Spanner verschränkte Indexe einrichten. Die im vorherigen Abschnitt beschriebenen sekundären Indexe befinden sich auf der Stammebene der Datenbankhierarchie und nutzen Indexe genauso wie eine herkömmliche Datenbank. Ein verschränkter Index befindet sich im Kontext seiner verschränkten Zeile. Weitere Informationen dazu, wo Sie verschränkte Indexe anwenden können, finden Sie unter Indexoptionen.

An ein Datenmodell anpassen

Wenn Sie den Migrationsteil dieser Anleitung auf Ihre eigene Situation anwenden möchten, müssen Sie die Apache Beam-Quelldateien anpassen. Das Quellschema sollte jedoch nicht während des eigentlichen Migrationsfensters geändert werden, da sonst möglicherweise Daten verloren gehen.

  1. Verwenden Sie GSON, um eingehende JSON-Dateien zu parsen und Mutationen zu erstellen. Passen Sie die JSON-Definition an Ihre Daten an.

    public static class Item implements Serializable {
        private Username Username;
        private PointsEarned PointsEarned;
        private Subscribed Subscribed;
        private ReminderDate ReminderDate;
        private Zipcode Zipcode;
    
    }
    
    public static class Username implements Serializable {
        private String s;
    
    }
    
    public static class PointsEarned implements Serializable {
        private String n;
    
    }
    
    public static class Subscribed implements Serializable {
        private String bOOL;
    
    }
    
    public static class ReminderDate implements Serializable {
        private String s;
    
    }
    
    public static class Zipcode implements Serializable {
        private String n;
    
    }
  2. Passen Sie die entsprechende JSON-Zuordnung an.

    mutation.set("Username").to(item.Username.s);
    
    Optional.ofNullable(item.Zipcode).ifPresent(x->{
        mutation.set("Zipcode").to(Integer.parseInt(x.n));
    });
    
    Optional.ofNullable(item.Subscribed).ifPresent(x->{
        mutation.set("Subscribed").to(Boolean.parseBoolean(x.bOOL));
    });
    
    Optional.ofNullable(item.ReminderDate).ifPresent(x->{
        mutation.set("ReminderDate").to(Date.parseDate(x.s));
    });
    
    Optional.ofNullable(item.PointsEarned).ifPresent(x->{
        mutation.set("PointsEarned").to(Integer.parseInt(x.n));
    });

In den vorherigen Schritten haben Sie den Apache Beam-Quellcode für den Bulk-Import geändert. Der Quellcode für den Streamingteil der Pipeline muss auf ähnliche Weise geändert werden. Abschließend müssen Sie die Tabellenerstellungsskripts, -schemata und -indexe Ihrer Cloud Spanner-Zieldatenbank anpassen.

Bereinigen

So vermeiden Sie, dass Ihr Google Cloud Platform-Konto für die in dieser Anleitung genutzten Ressourcen unnötig mit Gebühren belastet wird:

Projekt löschen

  1. Rufen Sie in der GCP Console die Seite Projekte auf.

    Zur Seite Projekte

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie auf Löschen delete.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

AWS-Ressourcen löschen

Wenn das AWS-Konto nicht nur für diese Anleitung verwendet wird, sollten Sie beim Löschen der folgenden Ressourcen vorsichtig vorgehen:

  1. Löschen Sie die DynamoDB-Tabelle namens Migration.
  2. Löschen Sie den Amazon S3-Bucket und die Lambda-Funktion, die Sie bei den Migrationsschritten erstellt haben.
  3. Löschen Sie zuletzt den für diese Anleitung erstellten AWS IAM-Nutzer.

Weitere Informationen

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...