Esegui la migrazione da DynamoDB a Spanner

Questo tutorial descrive come eseguire la migrazione da Amazon DynamoDB a Spanner. È destinato principalmente ai proprietari di app che vogliono passare da un sistema NoSQL a Spanner, un'interfaccia SQL completamente relazionale, a tolleranza di errore e a scalabilità elevata che supporta le transazioni. Se hai una distribuzione coerente di Amazon Utilizzo della tabella DynamoDB, in termini di tipi e layout, mappatura a Spanner è semplice. Se le tue tabelle Amazon DynamoDB contengono tipi di dati e valori arbitrari, potrebbe essere più semplice passare ad altre come i servizi NoSQL, Datastore o Firestore.

Questo tutorial presuppone che tu abbia familiarità con gli schemi, i tipi di dati e le basi di NoSQL e dei sistemi di database relazionale. Il tutorial si basa sull'esecuzione di attività predefinite per una migrazione di esempio. Dopo il puoi modificare il codice e i passaggi forniti per in base al tuo ambiente.

Il seguente diagramma dell'architettura illustra i componenti utilizzati nel tutorial per eseguire la migrazione dei dati:

Diagramma dell'architettura dei componenti della migrazione

Obiettivi

  • Esegui la migrazione dei dati da Amazon DynamoDB a Spanner.
  • Creare un database Spanner e una tabella di migrazione.
  • Mappare uno schema NoSQL a uno schema relazionale.
  • Creare ed esportare un set di dati di esempio che utilizza Amazon DynamoDB.
  • Trasferisci dati tra Amazon S3 e Cloud Storage.
  • Usa Dataflow per caricare i dati in Spanner.

Costi

Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:

I costi di Spanner si basano sulla quantità di capacità di calcolo in dell'istanza e la quantità di dati archiviati durante il ciclo di fatturazione mensile. Durante il tutorial, utilizzerai una configurazione minima di queste risorse, che sono ripulito alla fine. Per scenari reali, stima il tuo i requisiti di velocità effettiva e di archiviazione Documentazione sulle istanze di Spanner per determinare la quantità di capacità di calcolo necessaria.

Oltre alle risorse Google Cloud, questo tutorial utilizza i seguenti Risorse di Amazon Web Services (AWS):

  • AWS Lambda
  • Amazon S3
  • Amazon DynamoDB

Questi servizi sono necessari solo durante il processo di migrazione. Alla fine segui le istruzioni per eseguire la pulizia di tutte le risorse ed evitare inutili. Utilizza il Calcolatore prezzi AWS per stimare questi costi.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza i prezzi calcolatrice.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Spanner, Pub/Sub, Compute Engine, and Dataflow.

    Abilita le API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  7. Abilita le API Spanner, Pub/Sub, Compute Engine, and Dataflow.

    Abilita le API

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

prepara l'ambiente

In questo tutorial eseguirai i comandi in Cloud Shell. Cloud Shell offre per accedere alla riga di comando in Google Cloud e include Google Cloud CLI e altri strumenti necessari per lo sviluppo in Google Cloud. L'inizializzazione di Cloud Shell può richiedere diversi minuti.

  1. Nella console Google Cloud, attiva Cloud Shell.

    Attiva Cloud Shell

    Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.

  2. Imposta la zona Compute Engine predefinita. Ad esempio, us-central1-b. gcloud config set compute/zone us-central1-b
  3. Clona il repository GitHub contenente il codice campione. git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
  4. Vai alla directory clonata. cd dynamodb-spanner-migration
  5. Crea un ambiente virtuale Python. pip3 installa virtualenv env virtualenv
  6. Attiva l'ambiente virtuale: source env/bin/activate
  7. Installare i moduli Python richiesti. pip3 install -r requirements.txt

Configura l'accesso AWS

In questo tutorial imparerai a creare ed eliminare tabelle Amazon DynamoDB, bucket Amazon S3 e altre risorse. Per accedere a queste risorse, devi prima devi creare le risorse AWS Identity and Access Management (IAM) richieste autorizzazioni aggiuntive. Puoi usare un account AWS di prova o sandbox per evitare problemi nello stesso account risorse di produzione.

Crea un ruolo AWS IAM per AWS Lambda

In questa sezione creerai un ruolo AWS IAM che AWS Lambda utilizzerà in un passaggio successivo. nel tutorial.

  1. Nella console AWS, vai alla sezione IAM, fai clic su Ruoli e quindi seleziona Crea ruolo.
  2. In Tipo di entità attendibile, assicurati che sia selezionato Servizio AWS.
  3. In Caso d'uso, seleziona Lambda, e poi fai clic su Avanti.
  4. Nella casella del filtro Criteri di autorizzazione, inserisci AWSLambdaDynamoDBExecutionRole. e premi Return per cercare.
  5. Seleziona la casella di controllo AWSLambdaDynamoDBExecutionRole e fai clic su Avanti.
  6. Nella casella Nome ruolo, inserisci dynamodb-spanner-lambda-role, quindi Fai clic su Crea ruolo.

Crea un utente AWS IAM

Segui questi passaggi per creare un utente AWS IAM con accesso programmatico ad AWS usate nel tutorial.

  1. Mentre ti trovi nella sezione IAM della console AWS, fai clic su Utenti, quindi seleziona Aggiungi utenti.
  2. Nella casella Nome utente, inserisci dynamodb-spanner-migration.
  3. In Tipo di accesso, seleziona la casella di controllo a sinistra di Chiave di accesso - Accesso programmatico

  4. Fai clic su Successivo: Autorizzazioni.

  5. Fai clic su Collega direttamente i criteri esistenti e utilizza la casella Cerca per filtrare. seleziona la casella di controllo accanto a ognuna delle seguenti tre norme:

    • AmazonDynamoDBFullAccess
    • AmazonS3FullAccess
    • AWSLambda_FullAccess
  6. Fai clic su Successivo: Tag, quindi su Successivo: esamina, quindi fai clic su Crea utente.

  7. Fai clic su Mostra per visualizzare le credenziali. ID e secret della chiave di accesso vengono visualizzate per l'utente appena creato. Lascia aperta questa finestra per il momento perché le credenziali sono necessarie nella sezione seguente. In tutta sicurezza memorizzare le credenziali, che consentono di apportare modifiche e influire sull'ambiente. Al termine di questo tutorial, eliminare l'utente IAM.

Configura l'interfaccia a riga di comando AWS

  1. In Cloud Shell, configura l'interfaccia a riga di comando (CLI) di AWS.

    aws configure
    

    Viene visualizzato il seguente output:

    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]:
    
    • Inserisci ACCESS KEY ID e SECRET ACCESS KEY da AWS l'account IAM che hai creato.
    • Nel campo Nome regione predefinito, inserisci us-west-2. Esci agli altri campi con i valori predefiniti.
  2. Chiudi la finestra della console AWS IAM.

Comprendere il modello dei dati

La seguente sezione illustra le somiglianze e le differenze tra i dati tipi, chiavi e indici per Amazon DynamoDB e Spanner.

Tipi di dati

Spanner utilizza tipi di dati GoogleSQL. La tabella seguente come funziona Amazon DynamoDB tipi di dati mappato a Spanner tipi di dati.

Amazon DynamoDB Spanner
Numero A seconda della precisione o dell'uso previsto, potrebbe essere mappato a INT64, FLOAT64, TIMESTAMP o DATE.
Stringa Stringa
Booleano BOOL
Null Nessun tipo esplicito. Le colonne possono contenere valori nulli.
Binario Byte
Set Array
Mappa ed elenco Stabilisci se la struttura è coerente e può essere descritta utilizzando una tabella Sintassi DDL.

Chiave primaria

Una chiave primaria Amazon DynamoDB stabilisce l'univocità e può essere una chiave hash o una combinazione di una chiave hash più una chiave intervallo. Questo tutorial inizia mostrando la migrazione di una tabella Amazon DynamoDB la cui chiave primaria è una chiave hash. Questa chiave hash diventa la chiave primaria della tua tabella Spanner. Più avanti, nel sezione sulle tabelle con interleaving, modelli una situazione in cui una tabella Amazon DynamoDB utilizza una chiave primaria composta da un chiave hash e una chiave di intervallo.

Indici secondari

Sia Amazon DynamoDB che Spanner supportano la creazione di un indice su un chiave non primaria. Prendi nota di eventuali indici secondari nella tua Amazon DynamoDB in modo da poterli creare nella tabella Spanner, ed è trattato in più avanti di questo tutorial.

Tabella di esempio

Per facilitare questo tutorial, esegui la migrazione della seguente tabella di esempio da Da Amazon DynamoDB a Spanner:

Amazon DynamoDB Spanner
Nome tabella Migration Migration
Chiave primaria "Username" : String "Username" : STRING(1024)
Tipo di chiave Hash n/a
Altri campi Zipcode: Number Subscribed: Boolean ReminderDate: String PointsEarned: Number Zipcode: INT64 Subscribed: BOOL ReminderDate: DATE PointsEarned: INT64

prepara la tabella Amazon DynamoDB

Nella sezione seguente, creerai una tabella di origine Amazon DynamoDB e la completerai con i dati.

  1. In Cloud Shell, crea una tabella Amazon DynamoDB che utilizza tabella di esempio attributi.

    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. Verifica che lo stato della tabella sia ACTIVE.

    aws dynamodb describe-table --table-name Migration \
        --query 'Table.TableStatus'
    
  3. Compila la tabella con dati di esempio.

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

Creazione di un database Spanner

Crei un'istanza Spanner con il minor numero di risorse di calcolo possibile capacità: 100 unità di elaborazione. Questa capacità di calcolo è sufficiente per nell'ambito di questo tutorial. Per un deployment di produzione, consulta la documentazione Istanze di Spanner per determinare la capacità di calcolo adeguata per le prestazioni del tuo database i tuoi requisiti.

In questo esempio, viene creato uno schema della tabella in contemporanea con il database. it è anche possibile, e comune, effettuare aggiornamenti dello schema dopo aver creato il database.

  1. Crea un'istanza Spanner nella stessa regione in cui imposta la zona Compute Engine predefinita. Ad esempio, us-central1.

    gcloud beta spanner instances create spanner-migration \
        --config=regional-us-central1 --processing-units=100 \
        --description="Migration Demo"
    
  2. Crea un database nell'istanza Spanner insieme a la tabella di esempio.

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

Prepara la migrazione

Le sezioni successive mostrano come esportare la tabella di origine Amazon DynamoDB imposta la replica Pub/Sub per acquisire eventuali modifiche al database che si verificano durante l'esportazione.

Trasmetti modifiche in Pub/Sub

Usi una funzione AWS Lambda per trasmettere in flusso le modifiche al database in Pub/Sub.

  1. In Cloud Shell, abilita i flussi Amazon DynamoDB nella tabella di origine.

    aws dynamodb update-table --table-name Migration \
        --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
    
  2. Configura un argomento Pub/Sub per ricevere le modifiche.

    gcloud pubsub topics create spanner-migration
    

    Viene visualizzato il seguente output:

    Created topic [projects/your-project/topics/spanner-migration].
    
  3. Crea un account di servizio IAM per eseguire il push degli aggiornamenti delle tabelle al Pub/Sub.

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

    Viene visualizzato il seguente output:

    Created service account [spanner-migration].
    
  4. Creare un'associazione di criteri IAM in modo che l'account di servizio dispone dell'autorizzazione per pubblicare in Pub/Sub. Sostituisci GOOGLE_CLOUD_PROJECT con il nome del tuo progetto Google Cloud.

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

    Viene visualizzato il seguente output:

    bindings:
    (...truncated...)
    - members:
      - serviceAccount:spanner-migration@solution-z.iam.gserviceaccount.com
      role: roles/pubsub.publisher
    
  5. Crea le credenziali per l'account di servizio.

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

    Viene visualizzato il seguente output:

    created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.iam.gserviceaccount.com]
    
  6. Prepara la funzione AWS Lambda e pacchettizzala per eseguire il push della tabella Amazon DynamoDB modifiche apportate all'argomento Pub/Sub.

    pip3 install --ignore-installed --target=lambda-deps google-cloud-pubsub
    cd lambda-deps; zip -r9 ../pubsub-lambda.zip *; cd -
    zip -g pubsub-lambda.zip ddbpubsub.py
  7. Crea una variabile per acquisire il nome risorsa Amazon (ARN) di Lambda ruolo di esecuzione creato in precedenza.

    LAMBDA_ROLE=$(aws iam list-roles \
        --query 'Roles[?RoleName==`dynamodb-spanner-lambda-role`].[Arn]' \
        --output text)
    
  8. Utilizza il pacchetto pubsub-lambda.zip per creare la funzione AWS Lambda.

    aws lambda create-function --function-name dynamodb-spanner-lambda \
        --runtime python3.9 --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}"
    

    Viene visualizzato il seguente output:

    {
        "FunctionName": "dynamodb-spanner-lambda",
        "LastModified": "2022-03-17T23:45:26.445+0000",
        "RevisionId": "e58e8408-cd3a-4155-a184-4efc0da80bfb",
        "MemorySize": 128,
    ... truncated output... "PackageType": "Zip", "Architectures": [ "x86_64" ] }

  9. Create a variable to capture the ARN of the Amazon DynamoDB stream for your table.

    STREAMARN=$(aws dynamodb describe-table \
        --table-name Migration \
        --query "Table.LatestStreamArn" \
        --output text)
    

  10. Collega la funzione Lambda alla tabella Amazon DynamoDB.

    aws lambda create-event-source-mapping --event-source ${STREAMARN} \
        --function-name dynamodb-spanner-lambda --enabled \
        --starting-position TRIM_HORIZON
    
  11. Per ottimizzare la reattività durante i test, aggiungi --batch-size 1 alla alla fine del comando precedente, che attiva la funzione ogni volta creare, aggiornare o eliminare un elemento.

    Verrà visualizzato un output simile al seguente:

    {
        "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"
    ... truncated output...
    

Esporta la tabella Amazon DynamoDB in Amazon S3

  1. In Cloud Shell, crea una variabile per il nome di un bucket che utilizzi in molte delle sezioni seguenti.

    BUCKET=${DEVSHELL_PROJECT_ID}-dynamodb-spanner-export
    
  2. Crea un bucket Amazon S3 per ricevere l'esportazione di DynamoDB.

    aws s3 mb s3://${BUCKET}
    
  3. Nella console di gestione AWS, vai a DynamoDB e fai clic su Tables.

  4. Fai clic sulla tabella Migration.

  5. Nella scheda Esportazioni e stream, fai clic su Esporta in S3.

  6. Se richiesto, abilita point-in-time-recovery (PITR).

  7. Fai clic su Sfoglia S3 per scegliere il bucket S3 che hai creato in precedenza.

  8. Fai clic su Esporta.

  9. Fai clic sull'icona Aggiorna per aggiornare lo stato del job di esportazione. Il lavoro richiede diversi minuti per completare l'esportazione.

    Al termine del processo, esamina il bucket di output.

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

    Questo passaggio richiede circa 5 minuti. Al termine, vedrai un output come il seguente:

    2022-02-17 04:41:46          0 AWSDynamoDB/01645072900758-ee1232a3/_started
    2022-02-17 04:46:04     500441 AWSDynamoDB/01645072900758-ee1232a3/data/xygt7i2gje4w7jtdw5652s43pa.json.gz
    2022-02-17 04:46:17        199 AWSDynamoDB/01645072900758-ee1232a3/manifest-files.json
    2022-02-17 04:46:17         24 AWSDynamoDB/01645072900758-ee1232a3/manifest-files.md5
    2022-02-17 04:46:17        639 AWSDynamoDB/01645072900758-ee1232a3/manifest-summary.json
    2022-02-17 04:46:18         24 AWSDynamoDB/01645072900758-ee1232a3/manifest-summary.md5
    

Eseguire la migrazione

Ora che la consegna Pub/Sub è attiva, puoi eseguire il push di qualsiasi modifica apportata alla tabella dopo l'esportazione.

Copia la tabella esportata in Cloud Storage

  1. In Cloud Shell, crea un bucket Cloud Storage riceveranno i file esportati da Amazon S3.

    gsutil mb gs://${BUCKET}
    
  2. Sincronizza i file da Amazon S3 in Cloud Storage. Per la maggior parte dei testi operazioni, il comando rsync diventa efficace. Se i file di esportazione sono grandi (diversi GB o più), utilizza Servizio di trasferimento Cloud Storage per gestire il trasferimento in background.

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

Importa i dati in batch

  1. Per scrivere i dati dai file esportati nell'istanza Spanner, esegui un job Dataflow con un esempio del codice Apache Beam.

    cd dataflow
    mvn compile
    mvn exec:java \
    -Dexec.mainClass=com.example.spanner_migration.SpannerBulkWrite \
    -Pdataflow-runner \
    -Dexec.args="--project=GOOGLE_CLOUD_PROJECT \
                 --instanceId=spanner-migration \
                 --databaseId=migrationdb \
                 --table=Migration \
                 --importBucket=$BUCKET \
                 --runner=DataflowRunner \
                 --region=us-central1"
    
    1. Per controllare l'avanzamento del job di importazione, nella console Google Cloud: e vai a Dataflow.

      Vai a Dataflow

    2. Mentre il job è in esecuzione, puoi osservare il grafico di esecuzione per esaminare i log. Fai clic sul job che mostra lo stato In esecuzione.

      Esecuzione del job di importazione

  2. Fai clic su ogni fase per vedere quanti elementi sono stati elaborati. La L'importazione è completata quando tutte le fasi riportano la dicitura Riuscito. Lo stesso numero di gli elementi creati nella tabella Amazon DynamoDB vengono visualizzati come elaborati in ogni fase.

    Fasi di successo del job di importazione

  3. Verifica che il numero di record nella destinazione La tabella Spanner corrisponde al numero di elementi in Amazon Tabella DynamoDB.

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

    Viene visualizzato il seguente output:

    $ 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. Campiona voci casuali in ogni tabella per garantire la coerenza dei dati.

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

    Viene visualizzato il seguente output:

     Username: aadams4495
     PointsEarned: 5247
     ReminderDate: 2022-03-14
     Subscribed: True
     Zipcode: 58057
    
  5. Esegui una query sulla tabella Amazon DynamoDB con lo stesso Username restituito dalla query Spanner nel passaggio precedente. Ad esempio: aallen2538. Il valore è specifico per i dati campione per configurare un database.

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

    I valori degli altri campi devono corrispondere a quelli della Output Spanner. Viene visualizzato il seguente output:

    {
        "Item": {
            "Username": {
                "S": "aadams4495"
            },
            "ReminderDate": {
                "S": "2018-06-18"
            },
            "PointsEarned": {
                "N": "1606"
            },
            "Zipcode": {
                "N": "17303"
            },
            "Subscribed": {
                "BOOL": false
            }
        }
    }
    

Replica le nuove modifiche

Una volta completato il job di importazione batch, devi configurare un job in modalità flusso per scrivere e gli aggiornamenti continui dalla tabella di origine in Spanner. Tu iscriviti agli eventi da Pub/Sub e scriverli Spanner

La funzione Lambda che hai creato è configurata per acquisire le modifiche all'origine la tabella Amazon DynamoDB e pubblicale in Pub/Sub.

  1. crea una sottoscrizione all'argomento Pub/Sub che AWS Lambda a cui invia gli eventi.

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

    Viene visualizzato il seguente output:

    Created subscription [projects/your-project/subscriptions/spanner-migration].
    
  2. Invio di flussi di modifiche in arrivo in Pub/Sub in cui scrivere la tabella Spanner, esegui il job Dataflow in Cloud Shell.

    mvn exec:java \
    -Dexec.mainClass=com.example.spanner_migration.SpannerStreamingWrite \
    -Pdataflow-runner \
    -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 \
    --runner=DataflowRunner \
    --region=us-central1"
    
    1. Simile al caricamento in gruppo passaggio, per osservare l'avanzamento del job nella console Google Cloud e vai a Dataflow.

      Vai a Dataflow

    2. Fai clic sul job il cui stato è In esecuzione.

      Job in esecuzione

      Il grafico di elaborazione mostra un output simile a quello di prima, ma ogni l'elemento elaborato viene conteggiato nella finestra di stato. Il tempo di attesa del sistema è stima approssimativa del ritardo previsto prima che le modifiche vengano visualizzate nel Spanner.

      Processi in esecuzione a causa del tempo di attesa

Il job Dataflow che hai eseguito nella fase di caricamento batch è stato insieme finito di input, noto anche come set di dati delimitato. Questo Il job Dataflow utilizza Pub/Sub come origine di flusso e è considerata illimitata. Per ulteriori informazioni su questi due tipi di fonti, consulta la sezione su PCollection Guida alla programmazione di Apache Beam. Il job Dataflow in questo passaggio deve rimanere attivo, quindi non termina al termine dell'operazione. Job Dataflow in modalità flusso rimane nello stato In esecuzione anziché nello stato Riuscito.

Verifica replica

Apporta alcune modifiche alla tabella di origine per verificare che siano replicati nella tabella Spanner.

  1. Esegui una query su una riga inesistente in Spanner.

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

    L'operazione non restituirà alcun risultato.

  2. Crea un record in Amazon DynamoDB con la stessa chiave che hai utilizzato nella Query Spanner. Se il comando viene eseguito correttamente, come output.

    aws dynamodb put-item \
        --table-name Migration \
        --item '{"Username" : {"S" : "my-test-username"}, "Subscribed" : {"BOOL" : false}}'
    
  3. Esegui di nuovo la stessa query per verificare che la riga sia ora in Spanner.

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

    L'output mostra la riga inserita:

    Username: my-test-username
    PointsEarned: None
    ReminderDate: None
    Subscribed: False
    Zipcode:
    
  4. Modifica alcuni attributi nell'elemento originale e aggiorna Amazon DynamoDB .

    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
    

    Verrà visualizzato un output simile al seguente:

    {
        "Attributes": {
            "Username": {
                "S": "my-test-username"
            },
            "PointsEarned": {
                "N": "4500"
            },
            "Subscribed": {
                "BOOL": true
            }
        }
    }
    
  5. Verifica che le modifiche vengano propagate a Spanner .

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

    L'output viene visualizzato come segue:

    Username          PointsEarned  ReminderDate  Subscribed  Zipcode
    my-test-username  4500          None          True
    
  6. Elimina l'elemento di test dalla tabella di origine Amazon DynamoDB.

    aws dynamodb delete-item \
        --table-name Migration \
        --key '{"Username": {"S":"my-test-username"}}'
    
  7. Verifica che la riga corrispondente venga eliminata dalla Spanner. Quando la modifica viene propagata, viene applicato quanto segue il comando restituisce zero righe:

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

Utilizza tabelle con interleaving

Spanner supporta il concetto di tavole interseche. Si tratta di un modello di progettazione in cui un elemento di primo livello ha diversi elementi nidificati che riguardano quell'elemento di primo livello, come un cliente e i suoi ordini oppure un player e i punteggi delle loro partite. Se la tabella di origine Amazon DynamoDB utilizza una chiave primaria composta da una chiave hash e una chiave di intervallo, puoi modellare una tabella con interleaving come mostrato nel diagramma seguente. Questa struttura consente di eseguire una query sulla tabella con interleaving durante l'unione dei campi nella tabella padre.

Tabella degli utenti a confronto con la tabella degli ordini

Applica indici secondari

È una best practice per applicare indici secondari alle tabelle Spanner dopo aver caricato e i dati di Google Cloud. Ora che la replica funziona, puoi configurare indice secondario per velocizzare le query. Come le tabelle Spanner, sono completamente coerenti. Non alla fine coerenti, che è comune in molti database NoSQL. Questa funzionalità può contribuire a semplificare la tua app progettare

Esegui una query che non utilizza indici. Stai cercando i primi N di occorrenze, dato un particolare valore di colonna. Questa è una query comune in Amazon DynamoDB per l'efficienza dei database.

  1. Vai a Spanner.

    Vai a Spanner

  2. Fai clic su Spanner Studio.

    Pulsante Query

  3. Nel campo Query, inserisci la seguente query, quindi fai clic su Esegui query.

    SELECT Username,PointsEarned
      FROM Migration
     WHERE Subscribed=true
       AND ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 14 DAY)
     ORDER BY ReminderDate DESC
     LIMIT 10
    

    Una volta eseguita la query, fai clic su Spiegazione e prendi nota delle Righe scansionate e Righe restituite. Senza un indice, Spanner analizza l'intera tabella per restituire un piccolo sottoinsieme di che corrispondono alla query.

    Righe scansionate rispetto alle righe restituite

  4. Se si tratta di una query frequente, crea una query nelle colonne Subscribed e TasksDate. Il giorno Nella console Spanner, seleziona il riquadro di navigazione Indici a sinistra, e fai clic su Crea indice.

  5. Inserisci la definizione dell'indice nella casella di testo.

    CREATE INDEX SubscribedDateDesc
    ON Migration (
      Subscribed,
      ReminderDate DESC
    )
    
  6. Per iniziare a creare il database in background, fai clic su Crea.

    Aggiornamento dello schema in corso…

  7. Dopo aver creato l'indice, esegui di nuovo la query e aggiungi l'indice.

    SELECT Username,PointsEarned
      FROM Migration@{FORCE_INDEX=SubscribedDateDesc}
     WHERE Subscribed=true
       AND ReminderDate > DATE_SUB(DATE(current_timestamp()), INTERVAL 14 DAY)
     ORDER BY ReminderDate DESC
     LIMIT 10
    

    Esamina di nuovo la spiegazione della query. Nota che il numero Il valore Righe scansionate è diminuito. Le Righe restituite in ogni passaggio corrispondono il numero restituito dalla query.

    Spiegazione della query

Indici con interleaving

Puoi configurare indici con interleaving in Spanner. Secondaria degli indici trattati nell'ambito sezione precedente si trovano alla radice della gerarchia del database e usano gli indici allo stesso modo un database convenzionale. Un indice con interleaving è compreso nel contesto del suo riga con interleaving. Consulta opzioni indice per maggiori dettagli su dove applicare gli indici con interleaving.

Adattare il modello dei dati

Per adattare la parte di questo tutorial sulla migrazione alla tua situazione, modificare i file sorgente Apache Beam. È importante non modificare dello schema di origine durante l'attuale finestra di migrazione, altrimenti potresti perdere dati.

  1. Per analizzare il file JSON in entrata e le mutazioni della build, usa GSON. Modifica la definizione JSON in modo che corrisponda ai tuoi dati.

    public static class Record implements Serializable {
    
      private Item Item;
    
    }
    
    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. Modifica il mapping JSON corrispondente.

    mutation.set("Username").to(record.Item.Username.S);
    
    Optional.ofNullable(record.Item.Zipcode).ifPresent(x -> {
      mutation.set("Zipcode").to(Integer.parseInt(x.N));
    });
    
    Optional.ofNullable(record.Item.Subscribed).ifPresent(x -> {
      mutation.set("Subscribed").to(Boolean.parseBoolean(x.BOOL));
    });
    
    Optional.ofNullable(record.Item.ReminderDate).ifPresent(x -> {
      mutation.set("ReminderDate").to(Date.parseDate(x.S));
    });
    
    Optional.ofNullable(record.Item.PointsEarned).ifPresent(x -> {
      mutation.set("PointsEarned").to(Integer.parseInt(x.N));
    });

Nei passaggi precedenti, hai modificato il codice sorgente di Apache Beam per l'importazione collettiva. Modifica il codice sorgente per la parte in modalità flusso della pipeline in modo simile in modo adeguato. Infine, modifica gli script, gli schemi e gli indici di creazione delle tabelle Database Spanner di destinazione.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina risorse AWS

Se il tuo account AWS viene utilizzato al di fuori di questo tutorial, presta attenzione quando elimina le seguenti risorse:

  1. Elimina il Tabella DynamoDB chiamata Migrazione.
  2. Elimina il Bucket Amazon S3 e Funzione Lambda che hai creato durante i passaggi della migrazione.
  3. Infine, elimina IAM AWS creato durante il tutorial.

Passaggi successivi