Dokumen ini menjelaskan cara melakukan migrasi data langsung dari instance MySQL sumber ke Spanner dengan periode nonaktif minimal menggunakan Terraform untuk men-deploy Dataflow dan Datastream.
Setelah melakukan migrasi data langsung dan yakin bahwa semua data telah ditransfer, Anda telah memigrasikan kode dan dependensi, serta menyelesaikan pengujian, Anda dapat mengalihkan aplikasi untuk menggunakan Spanner, bukan database MySQL sumber.
Anda dapat melakukan migrasi data langsung setelah membuat database Spanner target. Anda perlu membuat skema yang kompatibel di database target sebelum memigrasikan data.
Cara kerjanya
Migrasi data langsung terdiri dari dua fase berikut:
Migrasi pengisian ulang:
- Selama migrasi pengisian ulang, Dataflow membaca data yang ada dari database MySQL sumber dan memigrasikan data ke database Spanner target. Anda harus menggunakan template Dataflow migrasi massal untuk memindahkan data dari instance MySQL sumber ke Spanner.
- Jika migrasi pengisian ulang gagal menulis baris ke Spanner, migrasi tersebut akan menulis baris tersebut ke direktori antrean surat mati di bucket Cloud Storage. Anda dapat meminta migrasi pengisian ulang untuk mencoba kembali menulis baris ini ke Spanner.
Migrasi pengambilan data perubahan (CDC):
- Fase ini berjalan secara serentak dengan migrasi pengisian ulang, yang merekam perubahan yang terjadi di instance MySQL sumber secara real time. Perubahan ini kemudian diterapkan ke Spanner setelah migrasi pengisian ulang selesai.
- Anda perlu menggunakan Datastream untuk merekam perubahan yang terjadi di instance MySQL sumber secara real time dan menulisnya ke bucket Cloud Storage.
- Setelah migrasi pengisian ulang selesai, Anda perlu menggunakan Dataflow untuk memindahkan CDC dari bucket Cloud Storage ke Spanner. Jika Dataflow gagal menulis baris ke Spanner karena alasan apa pun, Dataflow akan menulis baris tersebut ke direktori antrean surat mati di bucket Cloud Storage yang berbeda. Migrasi CDC akan otomatis mencoba lagi menulis baris dari direktori antrean pesan yang dihentikan pengirimannya ke Spanner.
Merencanakan migrasi data langsung
Anda perlu mengonfigurasi infrastruktur jaringan yang diperlukan agar data dapat mengalir antara instance MySQL sumber, Datastream, Dataflow, bucket Cloud Storage, dan database Spanner target. Sebaiknya konfigurasikan konektivitas jaringan pribadi untuk migrasi yang aman. Bergantung pada persyaratan kepatuhan organisasi, Anda mungkin harus mengonfigurasi konektivitas jaringan publik atau pribadi. Untuk mengetahui informasi selengkapnya tentang konektivitas Datastream, lihat Opsi konektivitas jaringan.
Untuk merencanakan migrasi data aktif, Anda mungkin memerlukan administrator jaringan organisasi untuk melakukan tugas berikut:
- Gunakan VPC default atau buat VPC baru di
project Anda dengan persyaratan berikut:
- Instance MySQL sumber harus tersedia di VPC ini. Anda mungkin perlu membuat aturan firewall keluar di VPC ini, dan aturan firewall masuk di VPC tempat instance MySQL sumber berada.
- Bucket Datastream, Dataflow, Cloud Storage, dan database Spanner target harus tersedia di VPC ini.
- Anda harus membuat daftar yang diizinkan di instance MySQL sumber untuk mengizinkan koneksi dari VPC.
- Tentukan dan alokasikan rentang alamat IP di VPC yang dapat digunakan Datastream.
- Buat subnetwork di VPC untuk digunakan Dataflow untuk menyelesaikan migrasi pengisian ulang.
- Buat subnetwork di VPC untuk digunakan Dataflow guna menyelesaikan migrasi CDC nanti.
Anda dapat melakukan migrasi data langsung menggunakan langkah-langkah berikut:
- Menyiapkan migrasi CDC.
- Melakukan migrasi pengisian ulang.
- Selesaikan migrasi CDC setelah migrasi pengisian ulang selesai.
Melakukan migrasi data secara live memerlukan deployment dan pengelolaan resource dalam jumlah yang signifikan. Spanner menyediakan dua contoh template Terraform untuk setiap fase migrasi data langsung.
Template migrasi langsung melakukan migrasi CDC dalam dua fase:
- Menyiapkan migrasi CDC ke bucket Cloud Storage menggunakan Datastream. Anda dapat menggunakan variabel Terraform untuk mencegah template membuat tugas Dataflow.
- Migrasikan CDC ke Spanner dari bucket Cloud Storage menggunakan Dataflow. Anda hanya boleh melakukan fase ini setelah template Terraform migrasi pengisian ulang selesai dengan migrasi pengisian ulang.
Template terraform migrasi pengisian ulang melakukan migrasi pengisian ulang dari instance MySQL sumber ke Spanner.
Sebelum memulai
- Pastikan Terraform diinstal di shell lokal Anda.
- Buat akun layanan untuk menjalankan migrasi data live. Untuk informasi selengkapnya tentang cara membuat akun layanan, lihat Membuat akun layanan.
-
Untuk memastikan bahwa akun layanan memiliki izin yang diperlukan untuk melakukan migrasi langsung, minta administrator untuk memberi akun layanan peran IAM berikut di project Anda:
-
Dataflow Admin (
roles/dataflow.admin
) -
Datastream Admin (
roles/datastream.admin
) -
Security Admin (
roles/iam.securityAdmin
) -
Service Account Admin (
roles/serviceAccountAdmin
) -
Pub/Sub Admin (
roles/pubsub.admin
) -
Storage Admin (
roles/storage.admin
) -
Compute Network Admin (
roles/compute.networkAdmin
) -
Pelihat (
roles/viewer
)
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.
Peran bawaan ini berisi izin yang diperlukan untuk melakukan migrasi langsung. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:
Izin yang diperlukan
Izin berikut diperlukan untuk melakukan migrasi langsung:
-
compute.globalAddresses.create
-
compute.globalAddresses.createInternal
-
compute.globalAddresses.createInternal
-
compute.globalAddresses.delete
-
compute.globalAddresses.deleteInternal
-
compute.globalAddresses.get
-
compute.globalOperations.get
-
compute.networks.addPeering
-
compute.networks.get
-
compute.networks.listPeeringRoutes
-
compute.networks.removePeering
-
compute.networks.use
-
compute.routes.get
-
compute.routes.list
-
compute.subnetworks.get
-
compute.subnetworks.list
-
dataflow.jobs.cancel
-
dataflow.jobs.create
-
dataflow.jobs.updateContents
-
datastream.connectionProfiles.create
-
datastream.connectionProfiles.delete
-
datastream.privateConnections.create
-
datastream.privateConnections.delete
-
datastream.streams.create
-
datastream.streams.delete
-
datastream.streams.update
-
iam.roles.get
-
iam.serviceAccounts.actAs
-
pubsub.subscriptions.create
-
pubsub.subscriptions.delete
-
pubsub.topics.attachSubscription
-
pubsub.topics.create
-
pubsub.topics.delete
-
pubsub.topics.getIamPolicy
-
pubsub.topics.setIamPolicy
-
resourcemanager.projects.setIamPolicy
-
storage.buckets.create
-
storage.buckets.delete
-
storage.buckets.update
-
storage.objects.delete
Administrator Anda mungkin juga dapat memberikan izin ini kepada akun layanan dengan peran khusus atau peran bawaan lainnya.
-
Dataflow Admin (
Menyiapkan migrasi CDC
Spanner menawarkan template Terraform yang menyiapkan CDC, lalu menyelesaikan migrasi CDC. Anda dapat menggunakan variabel Terraform untuk menonaktifkan template agar tidak membuat tugas Dataflow. Template Terraform men-deploy dan mengelola resource berikut untuk menyiapkan migrasi CDC:
Koneksi pribadi Datastream: koneksi pribadi Datastream di-deploy di VPC yang Anda konfigurasi.
Profil koneksi Datastream sumber: profil koneksi yang memungkinkan Datastream terhubung ke instance MySQL sumber Anda.
Bucket Cloud Storage: bucket Cloud Storage tempat Datastream menulis data.
Profil koneksi Datastream target: profil koneksi ini memungkinkan Datastream terhubung dan menulis ke bucket Cloud Storage.
Aliran Datastream: aliran Datastream yang membaca dari instance MySQL sumber Anda dan menulis ke bucket Cloud Storage seperti yang ditentukan dalam profil koneksi.
Topik dan langganan Pub/Sub: bucket Cloud Storage mengirim notifikasi objek ke topik Pub/Sub dan Dataflow menggunakan langganan Pub/Sub untuk menulis data ke Spanner.
Notifikasi bucket Cloud Storage: notifikasi bucket Cloud Storage yang memublikasikan ke topik Pub/Sub.
Menyiapkan konfigurasi Terraform CDC
Anda dapat menyiapkan template Terraform untuk menyertakan konfigurasi variabel Dataflow, tetapi menonaktifkan pembuatan tugas Dataflow:
common_params = { project = "PROJECT_ID" region = "GCP_REGION" } datastream_params = { mysql_host = "MYSQL_HOST_IP_ADDRESS" mysql_username = "MYSQL_USERNAME" mysql_password = "MYSQL_PASSWORD" mysql_port = 3306 mysql_database = { database = "DATABASE_NAME" } private_connectivity = { vpc_name = "VPC_NAME" range = "RESERVED_RANGE" } } dataflow_params = { skip_dataflow = false enable_backfill = false template_params = { spanner_database_id = "SPANNER_DATABASE_ID" spanner_instance_id = "SPANNER_INSTANCE_ID" } runner_params = { max_workers = 10 num_workers = 4 on_delete = "cancel" network = "VPC_NETWORK" subnetwork = "SUBNETWORK_NAME" } }
Variabel Terraform dijelaskan dalam daftar berikut:
project
: project ID Google Cloud.region
: Google Cloud region.mysql_host
: alamat IP instance MySQL sumber Anda.mysql_username
: nama pengguna instance MySQL sumber Anda.mysql_password
: sandi instance mySQL sumber Anda.mysql_port
: nomor port instance MySQL sumber.database
: nama database MySQL sumber Anda di instance.vpc_name
: nama VPC yang ada yang digunakan oleh Datastream.range
: Rentang IP di VPC yang telah Anda cadangkan untuk digunakan Datastream.skip_dataflow
: tetapkan nilai ini ketrue
untuk menonaktifkan Dataflow agar tidak membuat tugas Dataflow.enable_backfill
: tetapkan nilai ini kefalse
untuk menonaktifkan template Terraform agar tidak membuat tugas Dataflow.spanner_database_id
: ID database Spanner target.spanner_instance_id
: ID instance Spanner target.max_workers
: menentukan jumlah maksimum pekerja yang dibuat Dataflow.min_workers
: menentukan jumlah maksimum pekerja yang dibuat Dataflow.network
: nama VPC yang ada yang akan digunakan oleh Dataflow.subnetwork
: nama subnetwork yang ditetapkan di VPC yang dapat membuat pekerja oleh Dataflow.
Menjalankan template Terraform CDC
Untuk melakukan migrasi CDC, Anda perlu menjalankan template Terraform:
Lakukan inisialisasi Terraform menggunakan perintah berikut:
terraform init
Validasi file Terraform menggunakan perintah berikut:
terraform plan --var-file=terraform_simple.tfvars
Jalankan konfigurasi Terraform menggunakan perintah berikut:
terraform apply --var-file=terraform_simple.tfvars
Konfigurasi Terraform menghasilkan output yang mirip dengan berikut ini:
Outputs: resource_ids = { "datastream_source_connection_profile" = "source-mysql-thorough-wombat" "datastream_stream" = "mysql-stream-thorough-wombat" "datastream_target_connection_profile" = "target-gcs-thorough-wombat" "gcs_bucket" = "live-migration-thorough-wombat" "pubsub_subscription" = "live-migration-thorough-wombat-sub" "pubsub_topic" = "live-migration-thorough-wombat" } resource_urls = { "datastream_source_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/source-mysql-thorough-wombat?project=your-project-here" "datastream_stream" = "https://console.cloud.google.com/datastream/streams/locations/us-central1/instances/mysql-stream-thorough-wombat?project=your-project-here" "datastream_target_connection_profile" = "https://console.cloud.google.com/datastream/connection-profiles/locations/us-central1/instances/target-gcs-thorough-wombat?project=your-project-here" "gcs_bucket" = "https://console.cloud.google.com/storage/browser/live-migration-thorough-wombat?project=your-project-here" "pubsub_subscription" = "https://console.cloud.google.com/cloudpubsub/subscription/detail/live-migration-thorough-wombat-sub?project=your-project-here" "pubsub_topic" = "https://console.cloud.google.com/cloudpubsub/topic/detail/live-migration-thorough-wombat?project=your-project-here" }
Datastream kini melakukan streaming CDC ke bucket Cloud Storage. Anda harus melakukan migrasi pengisian ulang dan menyelesaikan migrasi CDC nanti.
Melakukan migrasi pengisian ulang
Spanner menawarkan template Terraform untuk melakukan migrasi pengisian ulang. Template Terraform men-deploy dan mengelola resource berikut:
- Tugas Dataflow: Tugas Dataflow yang membaca dari instance MySQL sumber dan menulis ke database Spanner target.
Menyiapkan konfigurasi Terraform migrasi pengisian ulang
job_name = "JOB_NAME" project = "PROJECT_ID" region = "GCP_REGION" working_directory_bucket = "WORKING_DIRECTORY_BUCKET" working_directory_prefix = "WORKING_DIRECTORY_PREFIX" source_config_url = "SOURCE_CONFIG_URL" username = "USERNAME" password = "PASSWORD" instance_id = "SPANNER_INSTANCE_ID" database_id = "SPANNER_DATABASE_ID" spanner_project_id = "SPANNER_PROJECT_ID"
Variabel Terraform dijelaskan dalam daftar berikut:
job_name
: nama tugas Dataflow.project
: project ID Google Cloud tempat tugas Dataflow perlu dijalankan.region
: Google Cloud region.working_directory_bucket
: bucket Cloud Storage untuk mengupload file sesi dan membuat direktori output.working_directory_prefix
: awalan bucket Cloud Storage untuk direktori kerja Dataflow.source_config_url
: alamat IP instance MySQL sumber Anda.username
: nama pengguna instance mySQL sumber Anda.password
: sandi instance mySQL sumber Anda.instance_id
: ID instance Spanner target.database_id
: ID database Spanner target.spanner_project_id
: project ID tempat instance Spanner Anda berada. Project ID ini dapat berbeda dengan project tempat Anda menjalankan Dataflow.
Menjalankan template Terraform migrasi pengisian ulang
Untuk melakukan migrasi pengisian ulang, lakukan hal berikut:
Lakukan inisialisasi Terraform menggunakan perintah berikut:
terraform init
Validasi file Terraform menggunakan perintah berikut:
terraform plan --var-file=terraform_simple.tfvars
Jalankan konfigurasi Terraform menggunakan perintah berikut:
terraform apply --var-file=terraform_simple.tfvars
Konfigurasi Terraform menghasilkan output yang mirip dengan berikut ini:
Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: dataflow_job_id = [ "2024-06-05_00_41_11-4759981257849547781", ] dataflow_job_url = [ "https://console.cloud.google.com/dataflow/jobs/gcp-region/2024-06-05_00_41_11-4759981257849547781", ]
Jika migrasi pengisian ulang tidak dapat menulis baris ke Spanner, migrasi tersebut akan menulis baris tersebut ke direktori antrean surat mati di bucket Cloud Storage.
Anda dapat mencoba lagi menulis baris ini dari direktori antrean surat mati ke Spanner sebelum menyelesaikan migrasi CDC.
Untuk mencoba menulis baris ini dari direktori antrean surat mati ke Spanner sebelum menyelesaikan migrasi CDC, jalankan perintah berikut:
gcloud dataflow flex-template run JOB_NAME \ --region=GCP_REGION \ --template-file-gcs-location=gs://dataflow-templates/latest/flex/Cloud_Datastream_to_Spanner \ --additional-experiments=use_runner_v2 \ --parameters inputFilePattern=inputFilePattern,streamName="ignore", \ --datastreamSourceType=SOURCE_TYPE\ instanceId=INSTANCE_ID,databaseId=DATABASE_ID,sessionFilePath=SESSION_FILE_PATH, \ deadLetterQueueDirectory=DLQ_DIRECTORY,runMode="retryDLQ"
Variabel perintah gcloud CLI dijelaskan dalam daftar berikut:
job_name
: nama tugas Dataflow.region
: Google Cloud region.inputFilePattern
: lokasi bucket Cloud Storage dari pola file input.datastreamSourceType
: jenis sumber, misalnya, MySQL.instanceId
: ID instance Spanner target.databaseId
: ID database Spanner target.sessionFilePath
: jalur bucket Cloud Storage ke file sesi.deadLetterQueueDirectory
: jalur bucket Cloud Storage ke direktori DLQ.
Menyelesaikan migrasi CDC
Setelah migrasi pengisian ulang selesai, Anda dapat menggunakan Dataflow untuk memigrasikan CDC ke Spanner. Tugas Dataflow mengambil peristiwa perubahan dari bucket Cloud Storage dan menulisnya ke Spanner.
Setelah hampir semua data dari bucket Cloud Storage ditulis ke Spanner, hentikan penulisan pada instance MySQL sumber untuk memungkinkan perubahan yang tersisa ditulis ke Spanner.
Hal ini menyebabkan periode nonaktif singkat saat Spanner mengejar instance MySQL sumber. Setelah semua perubahan ditulis ke Spanner, aplikasi Anda dapat mulai menggunakan Spanner sebagai database-nya.
Untuk menyelesaikan migrasi CDC, ubah nilai parameter Terraform skip_dataflow
menjadi false
dan jalankan ulang template Terraform migrasi langsung.
Jalankan konfigurasi Terraform menggunakan perintah berikut:
terraform apply --var-file=terraform_simple.tfvars