In dieser Anleitung wird davon ausgegangen, dass Sie mit Datenbankschemas, Datentypen, den Grundlagen von NoSQL und mit relationalen Datenbanksystemen vertraut sind. Es werden vordefinierte Aufgaben ausgeführt, um eine Beispielmigration vorzunehmen. Wenn Sie die Anleitung abgeschlossen haben, können Sie den Code und die Schritte an Ihre Umgebung anpassen.
Das folgende Architekturdiagramm enthält eine Übersicht der Komponenten, die in dieser Anleitung zur Datenmigration verwendet werden:
Ziele
- Daten von Amazon DynamoDB zu Spanner migrieren
- 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
- Mit Dataflow Daten in Spanner laden
Kosten
In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:
- GKE
- Pub/Sub
- Cloud Storage
- Dataflow
Die Gebühren für Spanner beruhen auf der Anzahl der Knotenstunden und der Menge an 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 Spanner-Instanzen ermitteln, wie viele Knoten Sie benötigen.
Neben Google Cloud-Ressourcen werden in dieser Anleitung die folgenden Ressourcen von Amazon Web Services (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 die Kosten für diese Dienste kalkulieren.
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.
Vorbereitung
- Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.
- Spanner, Pub/Sub, Compute Engine, and Dataflow APIs aktivieren.
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 von Google Cloud. Außerdem enthält Cloud Shell das Cloud SDK und weitere Tools, die Sie für die Entwicklung in Google Cloud benötigen. Die Initialisierung von Cloud Shell kann mehrere Minuten dauern.
Aktivieren Sie Cloud Shell.
Legen Sie die Standardzone für Compute Engine fest, z. B.
us-central1-b
.gcloud config set compute/zone us-central1-b
Klonen Sie das GitHub-Repository mit dem Beispielcode.
git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
Rufen Sie das geklonte Verzeichnis auf.
cd dynamodb-spanner-migration
Erstellen Sie eine virtuelle Python-Umgebung.
virtualenv --python python2 env
Aktivieren Sie die virtuelle Umgebung.
source env/bin/activate
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.
- Rufen Sie in der AWS-Konsole den Bereich IAM auf, klicken Sie auf Roles und wählen Sie Create Role aus.
- Klicken Sie unter Choose the service that will use this role auf Lambda und wählen Sie anschließend Next: Permissions aus.
- Geben Sie im Feld Policy Type den Wert
AWSLambdaDynamoDBExecutionRole
ein. - Klicken Sie auf das Kästchen AWSLambdaDynamoDBExecutionRole und dann auf Next: Review.
- Geben Sie im Feld Role name den Wert
dynamodb-spanner-lambda-role
ein und klicken Sie dann auf Create role.
AWS IAM-Nutzer erstellen
In den folgenden Schritten erstellen Sie einen AWS IAM-Nutzer mit programmatischem Zugriff auf AWS-Ressourcen, die in der Anleitung verwendet werden.
- Klicken Sie im Bereich IAM der AWS-Konsole auf Users und wählen Sie Add User aus.
- Geben Sie im Feld User name den Wert
dynamodb-spanner-migration
ein. Klicken Sie unter Access type auf Programmatic access.
Klicken Sie auf Next: Permissions.
Klicken Sie auf Attach existing policies directly und wählen Sie die zwei folgenden Richtlinien aus:
AmazonDynamoDBFullAccesswithDataPipeline
AmazonS3FullAccess
Klicken Sie auf Next: Review (Nächster Schritt: Überprüfen) und dann auf Create user (Nutzer erstellen).
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
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 denSECRET ACCESS KEY
des AWS IAM-Kontos ein, das Sie erstellt haben. - Geben Sie im Feld Default region name den Wert
us-west-2
ein. Übernehmen Sie die Standardwerte der restlichen Felder.
- Geben Sie die
Schließen Sie das Fenster der AWS IAM-Konsole.
Informationen zum Datenmodell
Im folgenden Abschnitt sind die Ähnlichkeiten und Unterschiede zwischen Datentypen, Schlüsseln und Indexen für Amazon DynamoDB und Spanner beschrieben.
Datentypen
Spanner verwendet Standard-SQL-Datentypen. In der folgenden Tabelle ist die Zuordnung von Datentypen in Amazon DynamoDB zu Datentypen in Spanner beschrieben.
Amazon DynamoDB | 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 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 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 Spanner-Tabelle erstellen können. Dies wird in einem späteren Abschnitt dieser Anleitung behandelt.
Beispieltabelle
Zur Vereinfachung dieser Anleitung migrieren Sie die folgende Beispieltabelle von Amazon DynamoDB zu Spanner:
Amazon DynamoDB | 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.
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
Prüfen Sie, ob der Tabellenstatus
ACTIVE
lautet.aws dynamodb describe-table --table-name Migration \ --query 'Table.TableStatus'
Füllen Sie die Tabelle mit Beispieldaten.
python make-fake-data.py --table Migration --items 25000
Spanner-Datenbank erstellen
Sie erstellen eine Instanz mit einem 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 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.
Erstellen Sie eine Spanner-Instanz in derselben Region, in der Sie die Compute Engine-Standardzone festgelegt haben. z. B.
us-central1
gcloud spanner instances create spanner-migration \ --config=regional-us-central1 --nodes=1 \ --description="Migration Demo"
Erstellen Sie zusammen mit der Beispieltabelle eine Datenbank in der 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 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 Pub/Sub streamen
Zum Streamen von Datenbankänderungen an Pub/Sub verwenden Sie eine AWS Lambda-Funktion.
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
Richten Sie ein 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].
Erstellen Sie ein IAM-Dienstkonto, um Tabellenaktualisierungen an das Pub/Sub-Thema per Push 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].
Erstellen Sie eine IAM-Richtlinienbindung, damit das Dienstkonto die Berechtigung zum Veröffentlichen in Pub/Sub hat. Ersetzen Sie
GOOGLE_CLOUD_PROJECT
durch den Namen des Google Cloud-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.publisherErstellen 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]Bereiten Sie die AWS Lambda-Funktion vor und verpacken Sie sie, um Änderungen in Amazon DynamoDB-Tabellen an 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.pyErstellen 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)
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...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)
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
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
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
Erstellen Sie einen Amazon S3-Bucket, in den der DynamoDB-Export kopiert werden soll.
aws s3 mb s3://$BUCKET
Klicken Sie in der AWS Management Console auf Data Pipeline.
Klicken Sie auf Create new pipeline, um den Exportjob zu definieren.
Geben Sie im Feld Name Export to Amazon S3 ein.
Wählen Sie für Source folgende Optionen aus:
- Build using a template
- Export DynamoDB table to Amazon S3
Nehmen Sie im Abschnitt Parameters folgende Einstellungen vor:
- Geben Sie im Feld Source DynamoDB table name
Migration
ein. - Klicken Sie im Feld Output S3 folder 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 Google Cloud-Projekt-ID. - Geben Sie im Feld DynamoDB read throughput ratio den Wert
1
ein, um während des Exports die gesamte verfügbare Lesekapazität zu nutzen. In einer Produktionsumgebung passen Sie den Wert so an, dass Live-Vorgänge ungehindert durchgeführt werden. - Geben Sie im Feld Region of your DynamoDB table den Namen der Region ein, z. B.
us-west-2
.
- Geben Sie im Feld Source DynamoDB table name
Damit die Sicherungsjobs sofort gestartet werden, klicken Sie im Abschnitt Schedule für Run auf On pipeline activation.
Geben Sie unter Pipeline Configuration 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.Klicken Sie auf Activate, um die Sicherung zu starten.
Wenn Sie aufgefordert werden, auf Validierungswarnungen zu reagieren, klicken Sie auf Activate. In einer Produktionssituation legen Sie eine maximale Dauer für den Job fest und aktivieren die Logging-Funktion.
Klicken Sie auf Refresh, 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 Pub/Sub-Bereitstellung wurde eingerichtet und Sie können alle nach dem Export vorgenommenen Tabellenänderungen verarbeiten.
Exportierte Tabelle in Cloud Storage kopieren
Erstellen Sie in Cloud Shell einen Cloud Storage-Bucket, in den die exportierten Dateien von Amazon S3 kopiert werden sollen.
gsutil mb gs://$BUCKET
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
Führen Sie einen Cloud Dataflow-Job mit Apache Beam-Beispielcode aus, um die Daten aus den exportierten Dateien in die 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"
Gehen Sie in der Cloud Console auf Dataflow, um den Fortschritt des Importjobs zu beobachten.
Während der Job ausgeführt wird, können Sie sich das Ausführungsdiagramm ansehen, um die Logs zu prüfen. Klicken Sie auf den Job mit dem Status "Wird ausgeführt".
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.
Die Anzahl der Einträge in der 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
Ü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
Fragen Sie die Amazon DynamoDB-Tabelle mit demselben
Username
ab, der im vorherigen Schritt von der 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 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 Spanner zu schreiben. Sie abonnieren die Ereignisse über Pub/Sub und schreiben sie in Spanner.
Die von Ihnen erstellte Lambda-Funktion ist dazu konfiguriert, Änderungen in der Amazon DynamoDB-Quelltabelle zu erfassen und in Pub/Sub zu veröffentlichen.
Erstellen Sie ein Abo für das 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].
Führen Sie den Dataflow-Job in Cloud Shell aus, um die an Pub/Sub gesendeten Änderungen in die 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"
Wie beim Laden im Batchverfahren gehen Sie in der Cloud Console auf Dataflow, um den Fortschritt des Importjobs zu beobachten.
Klicken Sie auf den Job mit dem Status Wird ausgeführt.
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 Spanner-Tabelle angezeigt werden.
Der 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 Dataflow-Job verwendet 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 Dataflow-Job in diesem Schritt soll aktiv bleiben, damit er beim Abschluss nicht beendet wird. Der Dataflow-Streamingjob behält den Status Wird ausgeführt bei, statt zu Erfolgreich zu wechseln.
Replikation prüfen
Wenn Sie ein paar Änderungen an der Quelltabelle vornehmen, können Sie verifizieren, ob die Änderungen in die Spanner-Tabelle repliziert werden.
Führen Sie eine Abfrage für eine nicht vorhandene Zeile in Spanner durch.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration --sql=\ "SELECT * FROM Migration WHERE Username='my-test-username'"
Erstellen Sie in Amazon DynamoDB einen Eintrag mit demselben Schlüssel, den Sie in der 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}}'
Führen Sie die ursprüngliche Abfrage noch einmal aus, um zu prüfen, ob sich die Zeile jetzt in 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Ä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 } } }
Prüfen Sie, ob die Änderungen in die 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 TrueLöschen Sie das Testelement aus der Amazon DynamoDB-Quelltabelle.
aws dynamodb delete-item \ --table-name Migration \ --key '{"Username": {"S":"my-test-username"}}'
Prüfen Sie, ob die entsprechende Zeile aus der 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
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.
Sekundäre Indexe anwenden
Als Best Practice wird empfohlen, sekundäre Indexe auf 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 Spanner-Tabellen sind sekundäre 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.
Rufen Sie Spanner auf.
Klicken Sie auf Abfrage.
Geben Sie in das Feld Abfrage den folgenden Wert ein und klicken Sie auf 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 Erklärung und vergleichen Gescannte Zeilen mit Zurückgegebene Zeilen. Ohne Index scannt Spanner die gesamte Tabelle, um eine kleine Teilmenge von Daten zurückzugeben, die der Abfrage entsprechen.
Wenn diese Abfrage regelmäßig ausgeführt wird, sollten Sie einen zusammengesetzten Index für die Spalten "Subscribed" und "ReminderDate" erstellen. Klicken Sie in der Spanner-Konsole auf Index erstellen.
Aktivieren Sie Als Text bearbeiten mit einem Klick.
Geben Sie in das Feld DDL-Anweisungen die Indexdefinition ein.
CREATE INDEX SubscribedDate ON Migration ( Subscribed, ReminderDate )
Klicken Sie auf Erstellen, um den Erstellvorgang der Datenbank im Hintergrund zu starten.
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.
Verschränkte Indexe
Sie können in 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.
Verwenden Sie GSON, um eingehende JSON-Dateien zu parsen und Mutationen zu erstellen. Passen Sie die JSON-Definition an Ihre Daten an.
Passen Sie die entsprechende JSON-Zuordnung an.
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, -schemas und -indexe Ihrer Spanner-Zieldatenbank anpassen.
Bereinigen
Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder behalten Sie das Projekt und löschen Sie die einzelnen Ressourcen.
Projekt löschen
- Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.
- Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
- Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (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:
- Löschen Sie die DynamoDB-Tabelle namens Migration.
- Löschen Sie den Amazon S3-Bucket und die Lambda-Funktion, die Sie bei den Migrationsschritten erstellt haben.
- Löschen Sie zuletzt den für diese Anleitung erstellten AWS IAM-Nutzer.