MySQL에서 라이브 데이터 마이그레이션

이 문서에서는 Terraform을 사용해 Dataflow 및 Datastream을 배포하여 최소한의 다운타임으로 소스 MySQL 인스턴스에서 Spanner로 라이브 데이터 마이그레이션을 수행하는 방법을 설명합니다.

라이브 데이터 마이그레이션을 수행한 후 모든 데이터가 전송되었고 코드와 종속 항목이 마이그레이션되었고 테스트가 완료되었다는 확신이 들면, 소스 MySQL 데이터베이스 대신 Spanner를 사용하도록 애플리케이션을 전환할 수 있습니다.

대상 Spanner 데이터베이스를 만든 후 라이브 데이터 마이그레이션을 수행할 수 있습니다. 데이터를 마이그레이션하기 전에 대상 데이터베이스에 호환되는 스키마를 만들어야 합니다.

작동 방식

라이브 데이터 마이그레이션은 다음 두 단계로 구성됩니다.

  • 백필 마이그레이션:

    • 백필 마이그레이션 중에 Dataflow는 소스 MySQL 데이터베이스에서 기존 데이터를 읽고 대상 Spanner 데이터베이스로 데이터를 마이그레이션합니다. 소스 MySQL 인스턴스에서 Spanner로 데이터를 이동하려면 일괄 마이그레이션 Dataflow 템플릿을 사용해야 합니다.
    • 백필 마이그레이션 중에 행을 Spanner에 쓰지 못하면 해당 행을 Cloud Storage 버킷의 데드 레터 큐 디렉터리에 쓰는 작업을 수행합니다. 이러한 행을 Spanner에 쓰는 작업을 재시도하도록 백필 마이그레이션을 실행할 수 있습니다.
  • 변경 데이터 캡처(CDC) 마이그레이션:

    • 이 단계는 백필 마이그레이션과 동시에 실행되어 소스 MySQL 인스턴스에서 발생하는 변경사항을 실시간으로 캡처합니다. 그런 다음 백필 마이그레이션이 완료되면 이러한 변경사항이 Spanner에 적용됩니다.
    • Datastream을 사용하여 소스 MySQL 인스턴스에서 발생하는 변경사항을 실시간으로 캡처하고 Cloud Storage 버킷에 써야 합니다.
    • 백필 마이그레이션이 완료되면 Dataflow를 사용하여 CDC를 Cloud Storage 버킷에서 Spanner로 이동해야 합니다. Dataflow가 어떤 이유로든 행을 Spanner에 쓰지 못하면 해당 행을 다른 Cloud Storage 버킷의 데드 레터 큐 디렉터리에 쓰는 작업을 수행합니다. CDC 마이그레이션은 행을 데드 레터 큐 디렉터리에서 Spanner에 쓰는 작업을 자동으로 재시도합니다.

라이브 데이터 마이그레이션 계획

데이터가 소스 MySQL 인스턴스, Datastream, Dataflow, Cloud Storage 버킷, 대상 Spanner 데이터베이스 간에 흐르도록 하는 데 필요한 네트워크 인프라를 구성해야 합니다. 안전한 마이그레이션을 위해 비공개 네트워크 연결을 구성하는 것이 좋습니다. 조직의 규정 준수 요구사항에 따라 공개 또는 비공개 네트워크 연결을 구성해야 할 수 있습니다. Datastream 연결에 대한 자세한 내용은 네트워크 연결 옵션을 참조하세요.

라이브 데이터 마이그레이션을 계획하려면 조직의 네트워크 관리자가 다음 작업을 수행해야 할 수 있습니다.

  • 기본 VPC를 사용하거나 프로젝트에서 다음 요구사항을 충족하는 새 VPC를 만듭니다.
    • 이 VPC에서 소스 MySQL 인스턴스를 사용할 수 있어야 합니다. 이 VPC에서 이그레스 방화벽 규칙을 만들고 소스 MySQL 인스턴스가 있는 VPC에서 인그레스 방화벽 규칙을 만들어야 할 수 있습니다.
    • 이 VPC에서 Datastream, Dataflow, Cloud Storage 버킷, 대상 Spanner 데이터베이스를 사용할 수 있어야 합니다.
    • VPC에서의 연결을 허용하려면 소스 MySQL 인스턴스에 허용 목록을 만들어야 합니다.
  • VPC에서 Datastream이 사용할 수 있는 IP 주소 범위를 결정하고 할당합니다.
  • VPC에서 Dataflow가 백필 마이그레이션을 완료하는 데 사용할 서브네트워크를 만듭니다.
  • VPC에서 Dataflow가 나중에 CDC 마이그레이션을 완료하는 데 사용할 서브네트워크를 만듭니다.

다음 단계에 따라 라이브 데이터 마이그레이션을 수행할 수 있습니다.

  1. CDC 마이그레이션 설정
  2. 백필 마이그레이션 수행
  3. 백필 마이그레이션이 완료된 후 CDC 마이그레이션 완료

라이브 데이터 마이그레이션을 수행하려면 상당한 수의 리소스를 배포하고 관리해야 합니다. Spanner는 라이브 데이터 마이그레이션의 각 단계에 두 가지 샘플 Terraform 템플릿을 제공합니다.

라이브 마이그레이션 템플릿은 다음 두 단계로 CDC 마이그레이션을 수행합니다.

  • Datastream을 사용하여 Cloud Storage 버킷으로의 CDC 마이그레이션을 설정합니다. Terraform 변수를 사용하여 템플릿이 Dataflow 작업을 만들지 못하도록 할 수 있습니다.
  • Dataflow를 사용하여 Cloud Storage 버킷에서 Spanner로 CDC를 마이그레이션합니다. 백필 마이그레이션 Terraform 템플릿으로 백필 마이그레이션이 완료된 후에만 이 단계를 수행해야 합니다.

백필 마이그레이션 Terraform 템플릿은 소스 MySQL 인스턴스에서 Spanner로 백필 마이그레이션을 수행합니다.

시작하기 전에

  • Terraform이 로컬 셸에 설치되어 있는지 확인합니다.
  • 라이브 데이터 마이그레이션을 실행할 서비스 계정을 만듭니다. 서비스 계정 만들기에 대한 자세한 내용은 서비스 계정 만들기를 참조하세요.
  • 서비스 계정에 라이브 마이그레이션을 수행하는 데 필요한 권한이 있는지 확인하려면 관리자에게 서비스 계정에 프로젝트에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

    역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

    이러한 사전 정의된 역할에는 라이브 마이그레이션을 수행하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

    필수 권한

    라이브 마이그레이션을 수행하려면 다음 권한이 필요합니다.

    • 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

    관리자는 커스텀 역할이나 다른 사전 정의된 역할을 사용하여 서비스 계정에 이러한 권한을 부여할 수도 있습니다.

CDC 마이그레이션 설정

Spanner는 CDC를 설정하고 나중에 CDC 마이그레이션을 완료하는 Terraform 템플릿을 제공합니다. Terraform 변수를 사용하여 템플릿에서 Dataflow 작업을 만들지 못하도록 할 수 있습니다. Terraform 템플릿은 CDC 마이그레이션을 설정하기 위해 다음 리소스를 배포하고 관리합니다.

  • Datastream 비공개 연결: 비공개 Datastream 비공개 연결이 구성된 VPC에 배포됩니다.

  • 소스 Datastream 연결 프로필: Datastream이 소스 MySQL 인스턴스에 연결할 수 있는 연결 프로필입니다.

  • Cloud Storage 버킷: Datastream이 데이터를 쓰는 Cloud Storage 버킷입니다.

  • 대상 Datastream 연결 프로필: 이 연결 프로필을 사용하면 Datastream이 Cloud Storage 버킷에 연결하여 쓸 수 있습니다.

  • Datastream 스트림: 연결 프로필에 정의된 대로 소스 MySQL 인스턴스에서 읽고 Cloud Storage 버킷에 쓰는 Datastream 스트림입니다.

  • Pub/Sub 주제 및 구독: Cloud Storage 버킷은 객체 알림을 Pub/Sub 주제로 전송하고 Dataflow는 Pub/Sub 구독을 사용하여 데이터를 Spanner에 씁니다.

  • Cloud Storage 버킷 알림: Pub/Sub 주제에 게시되는 Cloud Storage 버킷 알림입니다.

CDC Terraform 구성 준비

Dataflow 변수 구성을 포함하도록 Terraform 템플릿을 준비할 수 있지만, 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"
      }
    }
  

Terraform 변수는 다음 목록에 설명되어 있습니다.

  • project: Google Cloud 프로젝트 ID입니다.
  • region: Google Cloud 리전입니다.
  • mysql_host: 소스 MySQL 인스턴스 IP 주소입니다.
  • mysql_username: 소스 MySQL 인스턴스 사용자 이름입니다.
  • mysql_password: 소스 MySQL 인스턴스 비밀번호입니다.
  • mysql_port: 소스 MySQL 인스턴스 포트 번호입니다.
  • database: 인스턴스의 소스 MySQL 데이터베이스 이름입니다.
  • vpc_name: Datastream에서 사용하는 기존 VPC의 이름입니다.
  • range: Datastream에서 사용하도록 예약한 VPC의 IP 범위입니다.
  • skip_dataflow: Dataflow에서 Dataflow 작업을 만들지 못하도록 이 값을 true로 설정합니다.
  • enable_backfill: Terraform 템플릿에서 Dataflow 작업을 만들지 못하도록 이 값을 false로 설정합니다.
  • spanner_database_id: 대상 Spanner 데이터베이스 ID입니다.
  • spanner_instance_id: 대상 Spanner 인스턴스 ID입니다.
  • max_workers: Dataflow가 만드는 최대 작업자 수를 결정합니다.
  • min_workers: Dataflow가 만드는 최소 작업자 수를 결정합니다.
  • network: Dataflow에서 사용할 기존 VPC의 이름입니다.
  • subnetwork: VPC에서 Dataflow가 작업자를 만들 수 있도록 지정된 서브네트워크의 이름입니다.

CDC Terraform 템플릿 실행

CDC 마이그레이션을 수행하려면 Terraform 템플릿을 실행해야 합니다.

  1. 다음 명령어를 사용하여 Terraform을 초기화합니다.

      terraform init
    

  2. 다음 명령어를 사용하여 Terraform 파일을 검증합니다.

      terraform plan --var-file=terraform_simple.tfvars
    

  3. 다음 명령어를 사용하여 Terraform 구성을 실행합니다.

      terraform apply --var-file=terraform_simple.tfvars
    

    Terraform 구성은 다음과 유사한 출력을 생성합니다.

    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이 CDC를 Cloud Storage 버킷으로 스트리밍합니다. 백필 마이그레이션을 수행하고 나중에 CDC 마이그레이션을 완료해야 합니다.

백필 마이그레이션 수행

Spanner는 백필 마이그레이션을 수행할 Terraform 템플릿을 제공합니다. Terraform 템플릿은 다음 리소스를 배포하고 관리합니다.

  • Dataflow 작업: 소스 MySQL 인스턴스에서 읽고 대상 Spanner 데이터베이스에 쓰는 Dataflow 작업입니다.

백필 마이그레이션 Terraform 구성 준비

    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"
  

Terraform 변수는 다음 목록에 설명되어 있습니다.

  • job_name: Dataflow 작업 이름입니다.
  • project: Dataflow 작업을 실행해야 하는 Google Cloud 프로젝트 ID입니다.
  • region: Google Cloud 리전입니다.
  • working_directory_bucket: 세션 파일을 업로드하고 출력 디렉터리를 만드는 Cloud Storage 버킷입니다.
  • working_directory_prefix: Dataflow 작업 디렉터리의 Cloud Storage 버킷 프리픽스입니다.
  • source_config_url: 소스 MySQL 인스턴스 IP 주소입니다.
  • username: 소스 MySQL 인스턴스 사용자 이름입니다.
  • password: 소스 MySQL 인스턴스 비밀번호입니다.
  • instance_id: 대상 Spanner 인스턴스 ID입니다.
  • database_id: 대상 Spanner 데이터베이스 ID입니다.
  • spanner_project_id: Spanner 인스턴스가 있는 프로젝트 ID입니다. 이 프로젝트 ID는 Dataflow를 실행하는 프로젝트와 다를 수 있습니다.

백필 마이그레이션 Terraform 템플릿 실행

백필 마이그레이션을 수행하려면 다음 단계를 따르세요.

  1. 다음 명령어를 사용하여 Terraform을 초기화합니다.

      terraform init
    

  2. 다음 명령어를 사용하여 Terraform 파일을 검증합니다.

      terraform plan --var-file=terraform_simple.tfvars
    

  3. 다음 명령어를 사용하여 Terraform 구성을 실행합니다.

      terraform apply --var-file=terraform_simple.tfvars
    

    Terraform 구성은 다음과 유사한 출력을 생성합니다.

    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",
    ]
    

백필 마이그레이션 중에 행을 Spanner에 쓰지 못하면 해당 행을 Cloud Storage 버킷의 데드 레터 큐 디렉터리에 쓰는 작업을 수행합니다.

CDC 마이그레이션을 완료하기 전에 이러한 행을 데드 레터 큐 디렉터리에서 Spanner에 쓰는 작업을 재시도할 수 있습니다.

CDC 마이그레이션을 완료하기 전에 이러한 행을 데드 레터 큐 디렉터리에서 Spanner에 쓰는 작업을 재시도하려면 다음 명령어를 실행합니다.

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"

gcloud CLI 명령어 변수는 다음 목록에 설명되어 있습니다.

  • job_name: Dataflow 작업 이름입니다.
  • region: Google Cloud 리전입니다.
  • inputFilePattern: 입력 파일 패턴의 Cloud Storage 버킷 위치입니다.
  • datastreamSourceType: 소스 유형입니다(예: MySQL).
  • instanceId: 대상 Spanner 인스턴스 ID입니다.
  • databaseId: 대상 Spanner 데이터베이스 ID입니다.
  • sessionFilePath: 세션 파일의 Cloud Storage 버킷 경로입니다.
  • deadLetterQueueDirectory: DLQ 디렉터리의 Cloud Storage 버킷 경로입니다.

CDC 마이그레이션 완료

백필 마이그레이션이 완료되면 Dataflow를 사용하여 CDC를 Spanner로 마이그레이션할 수 있습니다. Dataflow 작업은 Cloud Storage 버킷에서 변경 이벤트를 가져와 Spanner에 씁니다.

Cloud Storage 버킷의 거의 모든 데이터가 Spanner에 작성되면 소스 MySQL 인스턴스에서 쓰기를 중지하여 나머지 변경사항이 Spanner에 작성되도록 합니다.

그러면 Spanner가 소스 MySQL 인스턴스를 추적하는 동안 다운타임이 짧아집니다. 모든 변경사항이 Spanner에 작성되면 애플리케이션에서 Spanner를 데이터베이스로 사용할 수 있습니다.

CDC 마이그레이션을 완료하려면 skip_dataflow Terraform 매개변수의 값을 false로 변경하고 라이브 마이그레이션 Terraform 템플릿을 다시 실행합니다.

다음 명령어를 사용하여 Terraform 구성을 실행합니다.

      terraform apply --var-file=terraform_simple.tfvars
    

다음 단계