Bermigrasi dari DynamoDB ke Spanner

Tutorial ini menjelaskan cara bermigrasi dari Amazon DynamoDB ke Spanner. Fitur ini terutama ditujukan bagi pemilik aplikasi yang ingin beralih dari sistem NoSQL ke Spanner, yaitu sistem database SQL yang sepenuhnya relasional, fault-tolerant, dan sangat skalabel yang mendukung transaksi. Jika Anda memiliki penggunaan tabel Amazon DynamoDB yang konsisten, dalam hal jenis dan tata letak, pemetaan ke Spanner sangat mudah dilakukan. Jika tabel Amazon DynamoDB Anda berisi jenis dan nilai data arbitrer, mungkin akan lebih mudah untuk berpindah ke layanan NoSQL lainnya, seperti Datastore atau Firestore.

Tutorial ini mengasumsikan bahwa Anda telah memahami skema database, jenis data, dasar-dasar NoSQL, dan sistem database relasional. Tutorial ini bergantung pada menjalankan tugas yang telah ditetapkan untuk melakukan migrasi contoh. Setelah tutorial, Anda dapat mengubah kode dan langkah yang diberikan agar cocok dengan lingkungan Anda.

Diagram arsitektur berikut menguraikan komponen yang digunakan dalam tutorial untuk memigrasikan data:

Diagram arsitektur komponen migrasi

Tujuan

  • Migrasikan data dari Amazon DynamoDB ke Spanner.
  • Buat database Spanner dan tabel migrasi.
  • Memetakan skema NoSQL ke skema relasional.
  • Membuat dan mengekspor set data sampel yang menggunakan Amazon DynamoDB.
  • Mentransfer data antara Amazon S3 dan Cloud Storage.
  • Gunakan Dataflow untuk memuat data ke Spanner.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih berikut:

Tagihan Spanner didasarkan pada jumlah kapasitas komputasi dalam instance dan jumlah data yang disimpan selama siklus penagihan bulanan. Selama tutorial, Anda menggunakan konfigurasi minimal untuk resource ini, yang dibersihkan di akhir. Untuk skenario nyata, perkirakan persyaratan throughput dan penyimpanan Anda, lalu gunakan dokumentasi instance Spanner untuk menentukan jumlah kapasitas komputasi yang Anda perlukan.

Selain resource Google Cloud, tutorial ini menggunakan referensi Amazon Web Services (AWS) berikut:

  • AWS Lambda
  • Amazon S3
  • Amazon DynamoDB

Layanan ini hanya diperlukan selama proses migrasi. Di akhir tutorial, ikuti petunjuk untuk menghapus semua resource agar terhindar dari biaya yang tidak perlu. Gunakan kalkulator harga AWS untuk memperkirakan biaya ini.

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan, gunakan kalkulator harga.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.

    Enable the APIs

  5. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  6. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  7. Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.

    Enable the APIs

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Menyiapkan lingkungan Anda

Dalam tutorial ini, Anda akan menjalankan perintah di Cloud Shell. Cloud Shell memberi Anda akses ke command line di Google Cloud, dan menyertakan Google Cloud CLI serta alat lain yang Anda perlukan untuk pengembangan Google Cloud. Diperlukan waktu beberapa menit untuk melakukan inisialisasi Cloud Shell.

  1. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

  2. Tetapkan zona Compute Engine default. Misalnya, us-central1-b.

    <pre class="devsite-click-to-copy">
    gcloud config set compute/zone us-central1-b
    </pre></li>
    

  3. Buat clone repositori GitHub yang berisi kode contoh.

    <pre class="devsite-click-to-copy">
    git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
    </pre></li>
    

  4. Buka direktori yang di-clone.

    <pre class="devsite-click-to-copy">
    cd dynamodb-spanner-migration
    </pre></li>
    

  5. Buat lingkungan virtual Python.

    <pre class="devsite-click-to-copy">
    pip3 install virtualenv
    virtualenv env
    </pre></li>
    

  6. Aktifkan lingkungan virtual.

    <pre class="devsite-click-to-copy">
    source env/bin/activate
    </pre></li>
    

  7. Instal modul Python yang diperlukan.

    <pre class="devsite-click-to-copy">
    pip3 install -r requirements.txt
    </pre></li>
    

Mengonfigurasi akses AWS

Dalam tutorial ini, Anda akan membuat dan menghapus tabel Amazon DynamoDB, bucket Amazon S3, dan resource lainnya. Untuk mengakses resource ini, Anda harus membuat izin AWS Identity and Access Management (IAM) yang diperlukan terlebih dahulu. Anda dapat menggunakan akun AWS pengujian atau sandbox agar tidak memengaruhi resource produksi di akun yang sama.

Membuat peran IAM AWS untuk AWS Lambda

Di bagian ini, Anda akan membuat peran AWS IAM yang digunakan AWS Lambda di langkah selanjutnya dalam tutorial.

  1. Di konsol AWS, buka bagian IAM, klik Roles, lalu pilih Create role.
  2. Pada bagian Trusted entity type, pastikan AWS service dipilih.
  3. Di bagian Use case, pilih Lambda, lalu klik Next.
  4. Di kotak filter Kebijakan izin, masukkan AWSLambdaDynamoDBExecutionRole, lalu tekan Return untuk menelusuri.
  5. Pilih kotak centang AWSLambdaDynamoDBExecutionRole, lalu klik Next.
  6. Di kotak Role name, masukkan dynamodb-spanner-lambda-role, lalu klik Create role.

Membuat pengguna AWS IAM

Ikuti langkah-langkah berikut untuk membuat pengguna IAM AWS dengan akses terprogram ke resource AWS, yang digunakan di sepanjang tutorial.

  1. Saat Anda masih berada di bagian IAM pada konsol AWS, klik Users, lalu pilih Add users.
  2. Di kotak Nama pengguna, masukkan dynamodb-spanner-migration.
  3. Di bagian Jenis akses, centang kotak di sebelah kiri Kunci akses - Akses terprogram.

  4. Klik Berikutnya: Izin.

  5. Klik Lampirkan kebijakan yang ada secara langsung, lalu menggunakan kotak Penelusuran untuk memfilter, centang kotak di samping masing-masing dari tiga kebijakan berikut:

    • AmazonDynamoDBFullAccess
    • AmazonS3FullAccess
    • AWSLambda_FullAccess
  6. Klik Berikutnya: Tag dan Berikutnya: Tinjau, lalu klik Buat pengguna.

  7. Klik Show untuk melihat kredensial. ID kunci akses dan kunci akses rahasia akan ditampilkan kepada pengguna yang baru dibuat. Biarkan jendela ini terbuka untuk saat ini karena kredensial diperlukan di bagian berikut. Simpan kredensial ini dengan aman karena dengan kredensial ini, Anda dapat membuat perubahan pada akun dan memengaruhi lingkungan. Di akhir tutorial ini, Anda dapat menghapus pengguna IAM.

Mengonfigurasi antarmuka command line AWS

  1. Di Cloud Shell, konfigurasikan Antarmuka Command Line (CLI AWS).

    aws configure
    

    Output berikut akan muncul:

    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]:
    
    • Masukkan ACCESS KEY ID dan SECRET ACCESS KEY dari akun IAM AWS yang Anda buat.
    • Di kolom Default region name, masukkan us-west-2. Biarkan kolom lain tetap pada nilai defaultnya.
  2. Tutup jendela konsol IAM AWS.

Memahami model data

Bagian berikut menguraikan persamaan dan perbedaan antara jenis, kunci, dan indeks data untuk Amazon DynamoDB dan Spanner.

Jenis data

Spanner menggunakan jenis data GoogleSQL. Tabel berikut menjelaskan cara jenis data Amazon DynamoDB dipetakan ke jenis data Spanner.

Amazon DynamoDB Spanner
Nomor Bergantung pada presisi atau penggunaan yang dimaksudkan, mungkin dipetakan ke INT64, FLOAT64, TIMESTAMP, atau DATE.
String String
Boolean BOOL
Null Tidak ada jenis eksplisit. Kolom dapat berisi nilai {i>null<i}.
Biner Byte
Set Array
Peta dan Daftar Buat struktur jika strukturnya konsisten dan dapat dijelaskan dengan menggunakan sintaksis DDL tabel.

Kunci utama

Kunci utama Amazon DynamoDB menetapkan keunikan dan dapat berupa kunci hash atau kombinasi dari kunci hash ditambah kunci rentang. Tutorial ini dimulai dengan mendemonstrasikan migrasi tabel Amazon DynamoDB yang kunci utamanya adalah kunci hash. Kunci hash ini menjadi kunci utama tabel Spanner Anda. Kemudian, di bagian pada tabel sisipan, Anda akan membuat model situasi di mana tabel Amazon DynamoDB menggunakan kunci utama yang terdiri dari kunci hash dan kunci rentang.

Indeks sekunder

Amazon DynamoDB dan Spanner mendukung pembuatan indeks pada atribut kunci non-utama. Catat indeks sekunder apa pun di tabel Amazon DynamoDB, sehingga Anda dapat membuatnya di tabel Spanner, yang akan dibahas di bagian selanjutnya dari tutorial ini.

Tabel contoh

Untuk memfasilitasi tutorial ini, migrasikan tabel contoh berikut dari Amazon DynamoDB ke Spanner:

Amazon DynamoDB Spanner
Nama tabel Migration Migration
Kunci utama "Username" : String "Username" : STRING(1024)
Jenis kunci Hash t/a
Kolom lainnya Zipcode: Number Subscribed: Boolean ReminderDate: String PointsEarned: Number Zipcode: INT64 Subscribed: BOOL ReminderDate: DATE PointsEarned: INT64

Menyiapkan tabel Amazon DynamoDB

Di bagian berikut, Anda akan membuat tabel sumber Amazon DynamoDB dan mengisinya dengan data.

  1. Di Cloud Shell, buat tabel Amazon DynamoDB yang menggunakan atribut tabel contoh.

    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. Pastikan status tabel adalah ACTIVE.

    aws dynamodb describe-table --table-name Migration \
        --query 'Table.TableStatus'
    
  3. Isi tabel dengan data sampel.

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

Membuat database Spanner

Anda membuat instance Spanner dengan kapasitas komputasi terkecil: 100 unit pemrosesan. Kapasitas komputasi ini cukup untuk cakupan tutorial ini. Untuk deployment produksi, baca dokumentasi untuk instance Spanner guna menentukan kapasitas komputasi yang sesuai guna memenuhi persyaratan performa database Anda.

Dalam contoh ini, Anda membuat skema tabel secara bersamaan dengan {i>database<i}. Anda juga dapat melakukan pembaruan skema setelah Anda membuat database.

  1. Buat instance Spanner di region yang sama dengan tempat Anda menetapkan zona Compute Engine default. Misalnya, us-central1.

    gcloud beta spanner instances create spanner-migration \
        --config=regional-us-central1 --processing-units=100 \
        --description="Migration Demo"
    
  2. Buat database di instance Spanner beserta tabel contoh.

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

Menyiapkan migrasi

Bagian selanjutnya menunjukkan cara mengekspor tabel sumber Amazon DynamoDB dan menetapkan replikasi Pub/Sub untuk mencatat perubahan pada database yang terjadi saat Anda mengekspornya.

Streaming perubahan ke Pub/Sub

Anda menggunakan fungsi AWS Lambda untuk mengalirkan perubahan database ke Pub/Sub.

  1. Di Cloud Shell, aktifkan streaming Amazon DynamoDB di tabel sumber Anda.

    aws dynamodb update-table --table-name Migration \
        --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
    
  2. Siapkan topik Pub/Sub untuk menerima perubahan.

    gcloud pubsub topics create spanner-migration
    

    Output berikut akan muncul:

    Created topic [projects/your-project/topics/spanner-migration].
    
  3. Buat akun layanan IAM untuk mengirim pembaruan tabel ke topik Pub/Sub.

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

    Output berikut akan muncul:

    Created service account [spanner-migration].
    
  4. Buat binding kebijakan IAM sehingga akun layanan memiliki izin untuk memublikasikan ke Pub/Sub. Ganti GOOGLE_CLOUD_PROJECT dengan nama project Google Cloud Anda.

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

    Output berikut akan muncul:

    bindings:
    (...truncated...)
    - members:
      - serviceAccount:spanner-migration@solution-z.iam.gserviceaccount.com
      role: roles/pubsub.publisher
    
  5. Buat kredensial untuk akun layanan.

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

    Output berikut akan muncul:

    created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.iam.gserviceaccount.com]
    
  6. Siapkan dan kemas fungsi AWS Lambda untuk mengirim perubahan tabel Amazon DynamoDB ke topik 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. Buat variabel untuk mengambil Amazon Resource Name (ARN) dari peran eksekusi Lambda yang Anda buat sebelumnya.

    LAMBDA_ROLE=$(aws iam list-roles \
        --query 'Roles[?RoleName==`dynamodb-spanner-lambda-role`].[Arn]' \
        --output text)
    
  8. Gunakan paket pubsub-lambda.zip untuk membuat fungsi 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}"
    

    Output berikut akan muncul:

    {
        "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. Buat variabel untuk menangkap ARN aliran Amazon DynamoDB untuk tabel Anda.

    STREAMARN=$(aws dynamodb describe-table \
        --table-name Migration \
        --query "Table.LatestStreamArn" \
        --output text)
    
  10. Lampirkan fungsi Lambda ke tabel Amazon DynamoDB.

    aws lambda create-event-source-mapping --event-source ${STREAMARN} \
        --function-name dynamodb-spanner-lambda --enabled \
        --starting-position TRIM_HORIZON
    
  11. Untuk mengoptimalkan responsivitas selama pengujian, tambahkan --batch-size 1 ke akhir perintah sebelumnya, yang akan memicu fungsi setiap kali Anda membuat, memperbarui, atau menghapus item.

    Anda akan melihat output yang mirip dengan berikut ini:

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

Ekspor tabel Amazon DynamoDB ke Amazon S3

  1. Di Cloud Shell, buat variabel untuk nama bucket yang Anda gunakan di beberapa bagian berikut.

    BUCKET=${DEVSHELL_PROJECT_ID}-dynamodb-spanner-export
    
  2. Buat bucket Amazon S3 untuk menerima ekspor DynamoDB.

    aws s3 mb s3://${BUCKET}
    
  3. Di AWS Management Console, buka DynamoDB, lalu klik Tables.

  4. Klik tabel Migration.

  5. Pada tab Ekspor dan aliran, klik Ekspor ke S3.

  6. Aktifkan point-in-time-recovery (PITR) jika diminta.

  7. Klik Browse S3 untuk memilih bucket S3 yang Anda buat sebelumnya.

  8. Klik Ekspor.

  9. Klik ikon Muat ulang untuk memperbarui status tugas ekspor. Tugas ini memerlukan waktu beberapa menit untuk menyelesaikan ekspor.

    Setelah proses selesai, lihat bucket output.

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

    Langkah ini diperkirakan memerlukan waktu sekitar 5 menit. Setelah selesai, Anda akan melihat output seperti berikut:

    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
    

Melakukan migrasi

Setelah pengiriman Pub/Sub dilakukan, Anda dapat meneruskan perubahan tabel apa pun yang terjadi setelah ekspor.

Salin tabel yang diekspor ke Cloud Storage

  1. Di Cloud Shell, buat bucket Cloud Storage untuk menerima file yang diekspor dari Amazon S3.

    gsutil mb gs://${BUCKET}
    
  2. Sinkronkan file dari Amazon S3 ke Cloud Storage. Untuk sebagian besar operasi penyalinan, perintah rsync merupakan perintah yang efektif. Jika file ekspor Anda besar (beberapa GB atau lebih), gunakan layanan transfer Cloud Storage untuk mengelola transfer di latar belakang.

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

Mengimpor data dalam batch

  1. Untuk menulis data dari file yang diekspor ke tabel Spanner, jalankan tugas Dataflow dengan contoh kode 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. Untuk melihat progres tugas impor, di konsol Google Cloud, buka Dataflow.

      Buka Dataflow

    2. Selagi tugas berjalan, Anda dapat melihat grafik eksekusi untuk memeriksa log. Klik tugas yang menunjukkan Status Berjalan.

      Menjalankan tugas impor

  2. Klik setiap tahap untuk melihat berapa banyak elemen yang telah diproses. Impor selesai saat semua tahap menunjukkan Berhasil. Jumlah elemen yang sama yang dibuat di tampilan tabel Amazon DynamoDB sama seperti yang diproses di setiap tahap.

    Tahap keberhasilan tugas impor

  3. Pastikan jumlah data dalam tabel Spanner tujuan cocok dengan jumlah item dalam tabel Amazon 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"

    Output berikut akan muncul:

    $ 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. Ambil sampel entri acak di setiap tabel untuk memastikan data konsisten.

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

    Output berikut akan muncul:

     Username: aadams4495
     PointsEarned: 5247
     ReminderDate: 2022-03-14
     Subscribed: True
     Zipcode: 58057
    
  5. Buat kueri tabel Amazon DynamoDB dengan Username yang sama yang ditampilkan dari kueri Spanner pada langkah sebelumnya. Misalnya, aallen2538. Nilai ini khusus untuk data sampel dalam database Anda.

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

    Nilai kolom lain harus cocok dengan nilai dari output Spanner. Output berikut akan muncul:

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

Replikasikan perubahan baru

Setelah tugas impor batch selesai, Anda menyiapkan tugas streaming untuk menulis pembaruan berkelanjutan dari tabel sumber ke Spanner. Anda berlangganan ke peristiwa dari Pub/Sub dan menulisnya ke Spanner

Fungsi Lambda yang Anda buat dikonfigurasi untuk menangkap perubahan pada tabel Amazon DynamoDB sumber dan memublikasikannya ke Pub/Sub.

  1. Buat langganan ke topik Pub/Sub yang menjadi tujuan pengiriman peristiwa oleh AWS Lambda.

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

    Output berikut akan muncul:

    Created subscription [projects/your-project/subscriptions/spanner-migration].
    
  2. Untuk mengalirkan perubahan yang masuk ke Pub/Sub untuk ditulis ke tabel Spanner, jalankan tugas Dataflow dari 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. Mirip dengan langkah beban batch, untuk melihat progres tugas, buka Dataflow di Konsol Google Cloud.

      Buka Dataflow

    2. Klik tugas yang memiliki Status Berjalan.

      Menjalankan tugas

      Grafik pemrosesan menunjukkan output yang serupa seperti sebelumnya, tetapi setiap item yang diproses dihitung di jendela status. Waktu keterlambatan sistem adalah perkiraan kasar dari jumlah penundaan yang diperkirakan sebelum perubahan muncul di tabel Spanner.

      Proses yang berjalan karena waktu keterlambatan

Tugas Dataflow yang Anda jalankan dalam fase pemuatan batch adalah set input terbatas, juga dikenal sebagai set data terikat. Tugas Dataflow ini menggunakan Pub/Sub sebagai sumber streaming dan dianggap tidak terbatas. Untuk informasi selengkapnya tentang kedua jenis sumber ini, tinjau bagian tentang PCollections di panduan pemrograman Apache Beam. Tugas Dataflow pada langkah ini dimaksudkan untuk tetap aktif, sehingga tidak berakhir setelah selesai. Tugas Dataflow streaming tetap dalam status Running, bukan status Succeeded.

Memverifikasi replikasi

Anda membuat beberapa perubahan pada tabel sumber untuk memverifikasi bahwa perubahan tersebut direplikasi ke tabel Spanner.

  1. Mengkueri baris yang tidak ada di Spanner.

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

    Operasi ini tidak akan menampilkan hasil apa pun.

  2. Buat data di Amazon DynamoDB dengan kunci yang sama seperti yang Anda gunakan dalam kueri Spanner. Jika perintah berhasil dijalankan, tidak akan ada output.

    aws dynamodb put-item \
        --table-name Migration \
        --item '{"Username" : {"S" : "my-test-username"}, "Subscribed" : {"BOOL" : false}}'
    
  3. Jalankan kueri yang sama tersebut lagi untuk memastikan bahwa baris tersebut sekarang ada di Spanner.

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

    Output menunjukkan baris yang disisipkan:

    Username: my-test-username
    PointsEarned: None
    ReminderDate: None
    Subscribed: False
    Zipcode:
    
  4. Ubah beberapa atribut dalam item asli dan perbarui tabel 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
    

    Anda akan melihat output yang mirip dengan berikut ini:

    {
        "Attributes": {
            "Username": {
                "S": "my-test-username"
            },
            "PointsEarned": {
                "N": "4500"
            },
            "Subscribed": {
                "BOOL": true
            }
        }
    }
    
  5. Pastikan perubahan telah diterapkan ke tabel Spanner.

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

    Outputnya akan muncul seperti berikut:

    Username          PointsEarned  ReminderDate  Subscribed  Zipcode
    my-test-username  4500          None          True
    
  6. Hapus item pengujian dari tabel sumber Amazon DynamoDB.

    aws dynamodb delete-item \
        --table-name Migration \
        --key '{"Username": {"S":"my-test-username"}}'
    
  7. Pastikan baris yang sesuai telah dihapus dari tabel Spanner. Saat perubahan disebarkan, perintah berikut akan menampilkan baris nol:

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

Menggunakan tabel sisipan

Spanner mendukung konsep tabel interleaving. Ini adalah model desain dengan item tingkat teratas memiliki beberapa item bertingkat yang terkait dengan item level teratas tersebut, seperti pelanggan dan pesanannya, atau pemain dan skor gamenya. Jika tabel sumber Amazon DynamoDB menggunakan kunci utama yang terdiri dari kunci hash dan kunci rentang, Anda dapat membuat model skema tabel sisipan seperti yang ditunjukkan dalam diagram berikut. Struktur ini memungkinkan Anda secara efisien mengueri tabel sisipan sambil menggabungkan kolom di tabel induk.

Tabel pengguna dibandingkan dengan tabel pesanan

Menerapkan indeks sekunder

Menerapkan indeks sekunder ke tabel Spanner setelah Anda memuat data adalah praktik terbaik. Setelah replikasi berfungsi, Anda harus menyiapkan indeks sekunder untuk mempercepat kueri. Seperti tabel Spanner, indeks sekunder Spanner sepenuhnya konsisten. Keduanya tidak akan konsisten, yang biasa terjadi di banyak database NoSQL. Fitur ini dapat membantu menyederhanakan desain aplikasi

Menjalankan kueri yang tidak menggunakan indeks apa pun. Anda mencari N kemunculan teratas, dengan nilai kolom tertentu. Ini adalah kueri umum di Amazon DynamoDB untuk efisiensi database.

  1. Buka Spanner.

    Buka Spanner

  2. Klik Spanner Studio.

    Tombol Kueri

  3. Di kolom Query, masukkan kueri berikut, lalu klik Run 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
    

    Setelah kueri berjalan, klik Penjelasan dan catat Baris yang dipindai dibandingkan Baris yang ditampilkan. Tanpa indeks, Spanner akan memindai seluruh tabel untuk menampilkan sebagian kecil data yang cocok dengan kueri.

    Baris yang dipindai dibandingkan dengan baris yang ditampilkan

  4. Jika ini merepresentasikan kueri yang sering terjadi, buat indeks komposit pada kolom Subscribed dan PengingatDate. Di konsol Spanner, pilih panel navigasi kiri Indexes, lalu klik Create Index.

  5. Di kotak teks, masukkan definisi indeks.

    CREATE INDEX SubscribedDateDesc
    ON Migration (
      Subscribed,
      ReminderDate DESC
    )
    
  6. Untuk mulai mem-build database di latar belakang, klik Create.

    Pembaruan skema sedang berlangsung

  7. Setelah indeks dibuat, jalankan lagi kueri dan tambahkan indeks.

    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
    

    Periksa lagi penjelasan kueri. Perhatikan bahwa jumlah Baris yang dipindai telah menurun. Baris yang ditampilkan di setiap langkah cocok dengan angka yang ditampilkan oleh kueri.

    Penjelasan kueri

Indeks sisipan

Anda dapat menyiapkan indeks sisipan di Spanner. Indeks sekunder yang dibahas di bagian sebelumnya berada di akar hierarki database dan menggunakan indeks dengan cara yang sama seperti database konvensional. Indeks sisipan berada dalam konteks baris berselang-seling. Lihat opsi indeks untuk mengetahui detail selengkapnya tentang tempat menerapkan indeks sisipan.

Menyesuaikan dengan model data Anda

Untuk menyesuaikan bagian migrasi dalam tutorial ini dengan situasi Anda, ubah file sumber Apache Beam. Anda tidak boleh mengubah skema sumber selama periode migrasi yang sebenarnya. Jika tidak, Anda dapat kehilangan data.

  1. Untuk mengurai JSON yang masuk dan mem-build mutasi, gunakan GSON. Sesuaikan definisi JSON agar cocok dengan data Anda.

    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. Sesuaikan pemetaan JSON yang sesuai.

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

Pada langkah sebelumnya, Anda telah mengubah kode sumber Apache Beam untuk impor massal. Ubah kode sumber untuk bagian streaming pipeline dengan cara yang serupa. Terakhir, sesuaikan skrip, skema, dan indeks pembuatan tabel dari database target Spanner Anda.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource, atau simpan project dan hapus resource satu per satu.

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource AWS

Jika akun AWS Anda digunakan di luar tutorial ini, berhati-hatilah saat menghapus resource berikut:

  1. Hapus tabel DynamoDB yang disebut Migration.
  2. Hapus bucket Amazon S3 dan fungsi Lambda yang Anda buat selama langkah-langkah migrasi.
  3. Terakhir, hapus pengguna AWS IAM yang Anda buat selama tutorial ini.

Langkah selanjutnya