Tutorial ini menjelaskan cara bermigrasi dari Amazon DynamoDB ke Spanner. Panduan ini terutama ditujukan untuk pemilik aplikasi yang ingin berpindah dari sistem NoSQL ke Spanner, sistem database SQL yang sangat skalabel, toleran terhadap kesalahan, dan relasional sepenuhnya yang mendukung transaksi. Jika Anda memiliki penggunaan tabel Amazon DynamoDB yang konsisten, baik dari segi tipe maupun tata letak, pemetaan ke Spanner akan mudah dilakukan. Jika tabel Amazon DynamoDB Anda berisi jenis dan nilai data arbitrer, mungkin lebih mudah untuk beralih ke layanan NoSQL lain, seperti Datastore atau Firestore.
Tutorial ini mengasumsikan bahwa Anda sudah memahami skema database, jenis data, dasar-dasar NoSQL, dan sistem database relasional. Tutorial ini bergantung pada cara menjalankan tugas yang telah ditetapkan untuk melakukan contoh migrasi. Setelah tutorial, Anda dapat mengubah kode dan langkah yang diberikan agar sesuai dengan lingkungan Anda.
Diagram arsitektur berikut menguraikan komponen yang digunakan dalam tutorial untuk memigrasikan data:
Tujuan
- Migrasikan data dari Amazon DynamoDB ke Spanner.
- Buat basis data Spanner dan tabel migrasi.
- Memetakan skema NoSQL ke skema relasional.
- Buat dan ekspor contoh set data yang menggunakan Amazon DynamoDB.
- Mentransfer data antara Amazon S3 dan Cloud Storage.
- Gunakan Dataflow untuk memuat data ke dalam Spanner.
Biaya
Tutorial ini menggunakan komponen Google Cloudyang dapat ditagih berikut:
Biaya Spanner didasarkan pada jumlah kapasitas komputasi di instance Anda dan jumlah data yang disimpan selama siklus penagihan bulanan. Selama tutorial, Anda menggunakan konfigurasi minimal dari sumber daya ini, yang dibersihkan di akhir. Untuk skenario dunia nyata, perkirakan kebutuhan throughput dan penyimpanan Anda, lalu gunakanDokumentasi contoh Spanner untuk menentukan jumlah kapasitas komputasi yang Anda butuhkan.
Selain Google Cloud resource, tutorial ini menggunakan resource Amazon Web Services (AWS) berikut:
- AWS Lambda
- Amazon S3
- Amazon DynamoDB
Layanan-layanan ini hanya dibutuhkan selama proses migrasi. Di akhir tutorial, ikuti petunjuk untuk membersihkan semua sumber daya guna mencegah biaya yang tidak perlu. Gunakan kalkulator harga AWS untuk memperkirakan biaya ini.
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.
Sebelum memulai
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Spanner, Pub/Sub, Compute Engine, and Dataflow APIs.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
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 mencakup Google Cloud CLI serta alat lain yang Anda perlukan untuk pengembangan Google Cloud . Cloud Shell mungkin membutuhkan waktu beberapa menit untuk melakukan inisialisasi.
-
Di konsol Google Cloud , aktifkan Cloud Shell.
Di bagian bawah konsol Google Cloud , sesi Cloud Shell akan dimulai 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 pada sesi.
- Tetapkan zona Compute Engine default. Misalnya,
us-central1-b. gcloud config set compute/zone us-central1-b - Clone repositori GitHub yang berisi kode contoh. git clone https://github.com/GoogleCloudPlatform/dynamodb-spanner-migration.git
- Masuk ke direktori yang telah dikloning. cd dynamodb-spanner-migration
- Buat aplikasi Python.lingkungan virtual . pip3 instal virtualenv virtualenv env
- Aktifkan lingkungan virtual. source env/bin/activate
- Instal modul Python yang dibutuhkan. pip3 install -r requirements.txt
Konfigurasi akses AWS
Dalam tutorial ini, Anda akan membuat dan menghapus tabel Amazon DynamoDB, bucket Amazon S3, dan sumber daya lainnya. Untuk mengakses sumber daya ini, Anda perlu membuat izin AWS Identity and Access Management (IAM) yang diperlukan terlebih dahulu. Anda dapat menggunakan akun AWS uji coba atau sandbox untuk menghindari dampak pada sumber daya produksi di akun yang sama.
Membuat peran AWS IAM untuk AWS Lambda
Di bagian ini, Anda akan membuat peran AWS IAM yang akan digunakan AWS Lambda pada langkah selanjutnya dalam tutorial ini.
- Di konsol AWS, buka bagian IAM, klik Roles, lalu pilih Create role.
- Di bawah Jenis entitas tepercaya, pastikan Layanan AWS dipilih.
- Di bawah Use case, pilih Lambda, lalu klik Next.
- Di kotak filter Kebijakan izin, masukkan
AWSLambdaDynamoDBExecutionRoledan tekanReturnuntuk mencari. - Pilih kotak centang AWSLambdaDynamoDBExecutionRole, lalu klik Berikutnya.
- Di kotak Nama peran, masukkan
dynamodb-spanner-lambda-role, lalu klik Buat peran.
Membuat pengguna AWS IAM
Ikuti langkah-langkah ini untuk membuat pengguna AWS IAM dengan akses terprogram ke sumber daya AWS, yang digunakan di seluruh tutorial ini.
- Saat Anda masih berada di bagian IAM pada konsol AWS, klik Pengguna, lalu pilih Tambahkan pengguna.
- Di kotak Nama pengguna, masukkan
dynamodb-spanner-migration. Di bawah Jenis akses, pilih kotak centang di sebelah kiri Kunci akses - Akses terprogram.
Klik Berikutnya: Izin.
Klik Lampirkan kebijakan yang sudah ada secara langsung, dan menggunakan kotak Cari untuk memfilter, pilih kotak centang di samping masing-masing dari tiga kebijakan berikut:
AmazonDynamoDBFullAccessAmazonS3FullAccessAWSLambda_FullAccess
Klik Berikutnya: Tag dan Berikutnya: Ulasan, lalu klik Buat pengguna.
Klik Tampilkan untuk melihat kredensial. ID kunci akses dan kunci akses rahasia ditampilkan untuk pengguna yang baru dibuat. Biarkan jendela ini tetap terbuka untuk sementara karena kredensial diperlukan di bagian selanjutnya. Simpan kredensial ini dengan aman karena dengan kredensial ini, Anda dapat melakukan perubahan pada akun Anda dan memengaruhi lingkungan Anda. Di akhir tutorial ini, Anda dapat menghapus pengguna IAM.
Konfigurasi antarmuka baris perintah AWS
Di Cloud Shell, konfigurasikan AWS Command Line Interface (CLI).
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 IDdanSECRET ACCESS KEYdari akun AWS IAM yang telah Anda buat. - Pada kolom Nama wilayah default, masukkan
us-west-2. Biarkan kolom lainnya pada nilai default-nya.
- Masukkan
Tutup jendela konsol AWS IAM.
Memahami model data
Bagian berikut menguraikan persamaan dan perbedaan antara jenis data, kunci, dan indeks untuk Amazon DynamoDB dan Spanner.
Jenis data
Spanner menggunakan tipe data GoogleSQL. Tabel berikut menjelaskan cara pemetaan jenis data Amazon DynamoDB ke jenis data Spanner.
| Amazon DynamoDB | Spanner |
|---|---|
| Angka | Tergantung pada presisi atau tujuan penggunaannya, mungkin dipetakan ke INT64, FLOAT64, stempel waktu, atau DATE. |
| String | String |
| Boolean | BOOL |
| Null | Tidak ada jenis eksplisit. Kolom dapat berisi nilai null. |
| Biner | Byte |
| Setelan | Array |
| Peta dan Daftar | Gunakan sintaks DDL tabel untuk menentukan apakah struktur tersebut konsisten dan dapat dijelaskan dengan menggunakan sintaks tersebut. |
Kunci utama
Kunci utama Amazon DynamoDB menetapkan keunikan dan dapat berupa kunci hash atau kombinasi 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. Selanjutnya, di bagian tentang tabel yang disisipkan, Anda memodelkan situasi saat tabel Amazon DynamoDB menggunakan kunci utama yang terdiri dari kunci hash dan kunci rentang.
Indeks sekunder
Baik Amazon DynamoDB maupun Spanner mendukung pembuatan indeks pada atribut yang bukan kunci utama. Catat indeks sekunder apa pun di tabel Amazon DynamoDB Anda sehingga Anda dapat membuatnya di tabel Spanner Anda, yang akan dibahas di bagian selanjutnya dari tutorial ini.
Tabel contoh
Untuk mempermudah tutorial ini, Anda akan memigrasikan 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 |
| Bidang lainnya |
Zipcode: Number
Subscribed: Boolean
ReminderDate: String
PointsEarned: Number
|
Zipcode: INT64
Subscribed: BOOL
ReminderDate: DATE
PointsEarned: INT64
|
Siapkan tabel Amazon DynamoDB.
Pada bagian berikut, Anda akan membuat tabel sumber Amazon DynamoDB dan mengisinya dengan data.
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=75Verifikasi bahwa status tabel adalah
ACTIVE.aws dynamodb describe-table --table-name Migration \ --query 'Table.TableStatus'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 yang mungkin: 100 unit pemrosesan. Kapasitas komputasi ini sudah cukup untuk ruang lingkup tutorial ini. Untuk penerapan di lingkungan produksi, lihat dokumentasi untuk instance Spanner untuk menentukan kapasitas komputasi yang tepat guna memenuhi kebutuhan performa database Anda.
Dalam contoh ini, Anda membuat skema tabel bersamaan dengan pembuatan basis data. Melakukan hal ini juga dimungkinkan, dan umum dilakukan.pembaruan skema setelah Anda membuat basis data.
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"Buat database di instance Spanner bersama dengan 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)"
Persiapkan migrasi
Bagian selanjutnya akan menunjukkan cara mengekspor tabel sumber Amazon DynamoDB dan mengatur replikasi Pub/Sub untuk menangkap setiap perubahan pada basis data yang terjadi saat Anda mengekspornya.
Perubahan aliran ke Pub/Sub
Anda menggunakan fungsi AWS Lambda untuk melakukan streaming perubahan basis data ke Pub/Sub.
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_IMAGESBuat topik Pub/Sub untuk menerima perubahan.
gcloud pubsub topics create spanner-migration
Output berikut akan muncul:
Created topic [projects/your-project/topics/spanner-migration].
Buat akun layanan IAM untuk mengirimkan update 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].
Buat binding kebijakan IAM agar akun layanan memiliki izin untuk memublikasikan ke Pub/Sub. Ganti
GOOGLE_CLOUD_PROJECTdengan nama Google Cloud proyek Anda.gcloud projects add-iam-policy-binding GOOGLE_CLOUD_PROJECT \ --role roles/pubsub.publisher \ --member serviceAccount:spanner-migration@GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.comOutput berikut akan muncul:
bindings: (...truncated...) - members: - serviceAccount:spanner-migration@solution-z.iam.gserviceaccount.com role: roles/pubsub.publisher
Buat kredensial untuk akun layanan.
gcloud iam service-accounts keys create credentials.json \ --iam-account spanner-migration@GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.comOutput berikut akan muncul:
created key [5e559d9f6bd8293da31b472d85a233a3fd9b381c] of type [json] as [credentials.json] for [spanner-migration@your-project.iam.gserviceaccount.com]
Siapkan dan kemas fungsi AWS Lambda untuk mengirimkan 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
Buat variabel untuk menyimpan Amazon Resource Name (ARN) dari peran eksekusi Lambda yang telah Anda buat sebelumnya.
LAMBDA_ROLE=$(aws iam list-roles \ --query 'Roles[?RoleName==`dynamodb-spanner-lambda-role`].[Arn]' \ --output text)Gunakan paket
pubsub-lambda.zipuntuk 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" ] }Buat variabel untuk mengambil ARN aliran Amazon DynamoDB untuk tabel Anda.
STREAMARN=$(aws dynamodb describe-table \ --table-name Migration \ --query "Table.LatestStreamArn" \ --output text)Hubungkan fungsi Lambda ke tabel Amazon DynamoDB.
aws lambda create-event-source-mapping --event-source ${STREAMARN} \ --function-name dynamodb-spanner-lambda --enabled \ --starting-position TRIM_HORIZONUntuk mengoptimalkan responsivitas selama pengujian, tambahkan
--batch-size 1di 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
Di Cloud Shell, buat variabel untuk nama bucket yang akan Anda gunakan di beberapa bagian berikut.
BUCKET=${DEVSHELL_PROJECT_ID}-dynamodb-spanner-exportBuat bucket Amazon S3 untuk menerima ekspor DynamoDB.
aws s3 mb s3://${BUCKET}Di AWS Management Console, buka DynamoDB, lalu klik Tables.
Klik tabel
Migration.Di bawah tab Ekspor dan streaming, klik Ekspor ke S3.
Aktifkan
point-in-time-recovery(PITR) jika diminta.Klik Browse S3 untuk memilih bucket S3 yang Anda buat sebelumnya.
Klik Ekspor.
Klik ikon Segarkan untuk memperbarui status pekerjaan ekspor. Tugas ini memerlukan waktu beberapa menit untuk menyelesaikan ekspor.
Setelah proses selesai, lihatlah wadah hasilnya.
aws s3 ls --recursive s3://${BUCKET}Langkah ini diperkirakan akan memakan 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
Sekarang setelah fitur Pub/Sub tersedia, Anda dapat menerapkan perubahan tabel apa pun yang terjadi setelah ekspor.
Menyalin tabel yang diekspor ke Cloud Storage
Di Cloud Shell, buat bucket Cloud Storage untuk menerima file yang diekspor dari Amazon S3.
gcloud storage buckets create gs://${BUCKET}Sinkronisasi memindahkan file dari Amazon S3 ke Cloud Storage. Untuk sebagian besar operasi penyalinan, perintah
rsyncefektif. Jika file ekspor Anda berukuran besar (beberapa GB atau lebih), gunakan layanan transfer Cloud Storage untuk mengelola transfer di latar belakang.gcloud storage rsync s3://${BUCKET} gs://${BUCKET} --recursive --delete-unmatched-destination-objects
Impor data secara massal.
Untuk menulis data dari file yang diekspor ke dalam tabel Spanner, jalankan pekerjaan 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"Untuk memantau perkembangan pekerjaan impor, di Google Cloud konsol, buka Dataflow.
Saat proses sedang berjalan, Anda dapat mengamati grafik eksekusi untuk memeriksa log. Klik tugas yang menunjukkan Status dari Running.
Klik setiap tahap untuk melihat berapa banyak elemen yang telah diproses. Proses impor selesai ketika semua tahapan bertuliskan Berhasil. Jumlah elemen yang dibuat dalam tabel Amazon DynamoDB Anda akan ditampilkan sama dengan jumlah elemen yang diproses pada setiap tahap.
Verifikasi bahwa jumlah record dalam tabel Spanner tujuan sesuai 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
Ambil sampel entri secara 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
Lakukan query pada tabel Amazon DynamoDB dengan
Usernameyang sama seperti yang dikembalikan dari query Spanner pada langkah sebelumnya. Contoh,aallen2538. Nilai tersebut spesifik untuk data sampel dalam basis data Anda.aws dynamodb get-item --table-name Migration \ --key '{"Username": {"S": "aadams4495"}}'Nilai pada field lainnya harus sesuai dengan nilai yang dihasilkan oleh output Spanner. Output berikut akan muncul:
{ "Item": { "Username": { "S": "aadams4495" }, "ReminderDate": { "S": "2018-06-18" }, "PointsEarned": { "N": "1606" }, "Zipcode": { "N": "17303" }, "Subscribed": { "BOOL": false } } }
Replikasi perubahan baru
Setelah pekerjaan impor batch selesai, Anda menyiapkan pekerjaan streaming untuk menulis pembaruan berkelanjutan dari tabel sumber ke Spanner. Anda berlangganan acara dari Pub/Sub dan menuliskannya ke Spanner
Fungsi Lambda yang Anda buat dikonfigurasi untuk menangkap perubahan pada tabel Amazon DynamoDB sumber dan mempublikasikannya ke Pub/Sub.
Buat langganan ke topik Pub/Sub yang digunakan AWS Lambda untuk mengirimkan event.
gcloud pubsub subscriptions create spanner-migration \ --topic spanner-migrationOutput berikut akan muncul:
Created subscription [projects/your-project/subscriptions/spanner-migration].
Untuk mengalirkan perubahan yang masuk ke Pub/Sub agar ditulis ke tabel Spanner, jalankan pekerjaan 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"Sama seperti langkah batch load, untuk melihat kemajuan pekerjaan, di konsol Google Cloud , buka Dataflow.
Klik tugas yang memiliki Status Running.
Grafik pemrosesan menunjukkan keluaran yang serupa seperti sebelumnya, tetapi setiap item yang diproses dihitung di jendela status. Waktu tunda sistem adalah perkiraan kasar tentang berapa lama penundaan yang diharapkan sebelum perubahan muncul di tabel Spanner.
Job Dataflow yang Anda jalankan pada fase pemuatan batch adalah kumpulan input terbatas, juga dikenal sebagai dataset terbatas. Job Dataflow ini menggunakan Pub/Sub sebagai sumber streaming dan dianggap tidak terbatas. Untuk informasi lebih lanjut mengenai kedua jenis sumber ini, tinjau bagian tentang PCollections di Panduan pemrograman Apache Beam. Job Dataflow pada langkah ini dimaksudkan untuk tetap aktif, sehingga tidak akan berhenti ketika selesai. Job Dataflow streaming tetap dalam status Running, bukan status Succeeded.
Memverifikasi replikasi
Anda melakukan beberapa perubahan pada tabel sumber untuk memverifikasi bahwa perubahan tersebut direplikasi ke tabel Spanner.
Mencari 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 menghasilkan hasil apa pun.
Buat data di Amazon DynamoDB dengan kunci yang sama yang Anda gunakan dalam kueri Spanner. Jika perintah berhasil dijalankan, tidak ada output yang ditampilkan.
aws dynamodb put-item \ --table-name Migration \ --item '{"Username" : {"S" : "my-test-username"}, "Subscribed" : {"BOOL" : false}}'Jalankan kueri yang sama lagi untuk memverifikasi bahwa baris tersebut kini ada di Spanner.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"Outputnya menunjukkan baris yang disisipkan:
Username: my-test-username PointsEarned: None ReminderDate: None Subscribed: False Zipcode:
Ubah beberapa atribut pada 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_NEWAnda akan melihat output yang mirip dengan berikut ini:
{ "Attributes": { "Username": { "S": "my-test-username" }, "PointsEarned": { "N": "4500" }, "Subscribed": { "BOOL": true } } }Pastikan perubahan tersebut telah diterapkan ke tabel Spanner.
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"Hasilnya akan tampak seperti berikut:
Username PointsEarned ReminderDate Subscribed Zipcode my-test-username 4500 None True
Hapus item pengujian dari tabel sumber Amazon DynamoDB.
aws dynamodb delete-item \ --table-name Migration \ --key '{"Username": {"S":"my-test-username"}}'Verifikasi bahwa baris yang bersangkutan telah dihapus dari tabel Spanner. Saat perubahan disebarkan, perintah berikut mengembalikan nol baris:
gcloud spanner databases execute-sql migrationdb \ --instance=spanner-migration \ --sql="SELECT * FROM Migration WHERE Username='my-test-username'"
Gunakan tabel berselang-seling.
Spanner mendukung konsep tabel interleaving. Ini adalah model desain di mana item tingkat atas memiliki beberapa item bersarang yang terkait dengan item tingkat atas tersebut, seperti pelanggan dan pesanan mereka, atau pemain dan skor permainan mereka. Jika tabel sumber Amazon DynamoDB Anda menggunakan kunci utama yang terdiri dari kunci hash dan kunci rentang, Anda dapat memodelkan skema tabel interleaved seperti yang ditunjukkan pada diagram berikut. Struktur ini memungkinkan Anda untuk melakukan kueri pada tabel yang saling terkait secara efisien sambil menggabungkan kolom-kolom di tabel induk.
Terapkan indeks sekunder
Merupakan praktik terbaik untuk menerapkan indeks sekunder pada tabel Spanner setelah Anda memuat data. Sekarang setelah replikasi berfungsi, Anda membuat indeks sekunder untuk mempercepat kueri. Seperti tabel Spanner, indeks sekunder Spanner sepenuhnya konsisten. Data tersebut tidak konsisten pada akhirnya, yang umum terjadi di banyak basis data NoSQL. Fitur ini dapat membantu menyederhanakan desain aplikasi Anda.
Jalankan kueri yang tidak menggunakan indeks apa pun. Anda mencari kemunculan teratas sebanyak N, berdasarkan nilai kolom tertentu. Ini adalah kueri umum di Amazon DynamoDB untuk efisiensi basis data.
Pergi ke Spanner.
Klik Spanner Studio.
Pada 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 dijalankan, klik Penjelasan dan perhatikan Baris yang dipindai dibandingkan dengan Baris yang dikembalikan. Tanpa indeks, Spanner memindai seluruh tabel untuk mengembalikan sebagian kecil data yang sesuai dengan kueri.
Jika ini merupakan kueri yang sering muncul, buat indeks komposit pada kolom Subscribed dan ReminderDate. Pada konsol Spanner, pilih panel navigasi kiri Indeks, lalu klik Buat Indeks.
Di kotak teks, masukkan definisi indeks.
CREATE INDEX SubscribedDateDesc ON Migration ( Subscribed, ReminderDate DESC )
Untuk memulai pembuatan basis data di latar belakang, klik Buat.
Setelah indeks dibuat, jalankan kembali kueri dan tambahkan indeks tersebut.
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 10Periksa kembali penjelasan kueri tersebut. Perhatikan bahwa jumlah Baris yang dipindai telah berkurang. ItuBaris yang dikembalikan pada setiap langkah sesuai dengan angka yang dikembalikan oleh kueri.
Indeks berselang-seling
Anda dapat mengatur indeks interleaved di Spanner. Indeks sekunder yang dibahas di bagian sebelumnya berada di akar hierarki basis data, dan indeks tersebut digunakan dengan cara yang sama seperti basis data konvensional. Indeks interleaved berada dalam konteks baris interleaved-nya. Lihat opsi indeks untuk detail selengkapnya tentang di mana menerapkan indeks interleaved.
Sesuaikan dengan model data Anda
Untuk menyesuaikan bagian migrasi dari tutorial ini dengan situasi Anda sendiri, modifikasi file sumber Apache Beam Anda. Penting untuk tidak mengubah skema sumber selama periode migrasi berlangsung, jika tidak, Anda dapat kehilangan data.
Untuk mengurai JSON yang masuk dan membangun mutasi, gunakan GSON. Sesuaikan definisi JSON agar sesuai dengan data Anda.
Sesuaikan pemetaan JSON yang sesuai.
Pada langkah-langkah sebelumnya, Anda telah memodifikasi kode sumber Apache Beam untuk impor massal. Ubah kode sumber untuk bagian streaming dari pipeline dengan cara yang serupa. Terakhir, sesuaikan skrip pembuatan tabel, skema, dan indeks basis data target Spanner Anda.
Pembersihan
Untuk menghindari biaya yang dibebankan kepada Anda Google Cloud Jika Anda ingin menyimpan sumber daya yang digunakan dalam tutorial ini, Anda dapat menghapus proyek yang berisi sumber daya tersebut, atau mempertahankan proyek dan menghapus masing-masing sumber daya.
Menghapus project
- Di konsol Google Cloud , buka halaman Manage resources.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- 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 sumber daya berikut:
- Hapus tabel DynamoDB yang disebut Migration.
- Hapus bucket Amazon S3 dan fungsi Lambda yang Anda buat selama langkah-langkah migrasi.
- Terakhir, hapus pengguna AWS IAM yang Anda buat selama tutorial ini.
Langkah berikutnya
- Baca tentang caraOptimalkan skema Spanner Anda. .
- Pelajari cara menggunakan Dataflow untuk situasi yang lebih kompleks.