MySQL용 대체 구성

이 페이지에서는 역방향 복제를 사용하여 MySQL의 대체를 설정하는 방법을 설명합니다. 대체는 Spanner에 문제가 발생할 경우 소스 MySQL 데이터베이스로 되돌리는 비상 계획을 의미합니다.

역방향 복제는 예상치 못한 문제가 발생하여 서비스 중단을 최소화하면서 원본 MySQL 데이터베이스로 대체해야 하는 경우에 유용합니다. 역방향 복제를 사용하면 Spanner에 작성된 데이터를 소스 MySQL 데이터베이스로 복제하여 대체할 수 있습니다. 이렇게 하면 두 데이터베이스 모두 eventual consistency를 갖게 됩니다.

역방향 복제 흐름에는 Spanner_to_SourceDb Dataflow 템플릿에서 수행하는 다음 단계가 포함됩니다.

  1. Spanner 변경 내역을 사용하여 Spanner에서 변경사항을 읽습니다.

  2. 필터링 모드가 forward_migration인지 확인합니다.

  3. Spanner 마이그레이션 도구를 사용하여 Spanner 데이터가 소스 데이터베이스 스키마와 호환되도록 변환합니다. 자세한 내용은 커스텀 변환을 참조하세요.

  4. 소스 데이터베이스에 지정된 기본 키의 최신 데이터가 이미 포함되어 있는지 확인합니다.

  5. 데이터를 소스 데이터베이스에 씁니다.

Spanner_to_SourceDb Dataflow 템플릿 사용

Dataflow 템플릿은 기본 키 수준에서 일관성을 보장합니다. 이 템플릿은 특정 테이블의 샤드에 대한 마지막 쓰기 트랜잭션의 커밋 타임스탬프가 포함된 Spanner에 섀도 테이블이라는 메타데이터 테이블을 만듭니다.

쓰기는 기본 키의 커밋 타임스탬프까지 일관됩니다.

역방향 복제를 실행하는 Dataflow 작업이 다음 모드 중 하나로 실행되도록 구성할 수 있습니다.

  • 일반: 기본 모드입니다. Dataflow 작업은 Spanner 변경 내역에서 이벤트를 읽고 소스 데이터베이스 스키마와 호환되는 데이터 유형으로 변환하고 소스 데이터베이스에 적용합니다. 작업에서 오류를 자동으로 재시도합니다. 재시도한 후 오류를 Cloud Storage 버킷의 데드 레터 큐(DLQ) 디렉터리의 severe 폴더로 이동합니다. 또한 작업은 모든 영구 오류를 severe 폴더로 이동합니다.

  • RetryDLQ: 이 모드에서 Dataflow 작업은 DLQ의 severe 폴더에서 이벤트를 읽고 재시도합니다. 영구 오류를 모두 수정한 후에 이 모드를 실행합니다. 이 모드는 Spanner 변경 내역이 아닌 DLQ에서만 읽습니다. severe 폴더에서 처리된 레코드가 retry 폴더로 이동하면 작업에서 레코드를 재시도합니다.

시작하기 전에

  • 소스 MySQL 데이터베이스와 Dataflow 작업이 실행될Google Cloud 프로젝트 간의 네트워크 연결을 확인합니다.

  • 대상 MySQL 인스턴스에서 Dataflow 작업자 IP 주소를 허용 목록에 추가합니다.

  • MySQL 사용자 인증 정보가 source shards file에 올바르게 지정되어 있는지 확인합니다.

  • MySQL 인스턴스가 온라인 상태이고 실행 중인지 확인합니다.

  • MySQL 사용자에게 MySQL 데이터베이스에 대한 INSERT, UPDATE, DELETE 권한이 있는지 확인합니다.

  • Dataflow Flex 템플릿을 실행하는 데 필요한 IAM 권한이 있는지 확인합니다. 자세한 내용은 Flex 템플릿 빌드 및 실행을 참조하세요.

  • Dataflow 작업자 VM 간 통신을 위해 포트 12345가 열려 있는지 확인합니다.

필요한 역할

  • Compute Engine 서비스 계정에 역방향 복제를 실행하는 데 필요한 권한이 있는지 확인하려면 관리자에게 Compute Engine 서비스 계정에 인스턴스에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

역방향 복제 실행

역방향 복제를 실행하려면 다음 단계를 수행합니다.

  1. 세션 파일을 Cloud Storage 버킷에 업로드합니다.

  2. DLQ 디렉터리의 retry 폴더에 Pub/Sub 알림을 만듭니다. Pub/Sub 주제와 해당 주제에 대한 Pub/Sub 구독을 만들어 이 작업을 수행할 수 있습니다.

  3. Dataflow 템플릿을 빌드하고 스테이징합니다. 자세한 내용은 템플릿 빌드를 참조하세요.

  4. 다음 Google Cloud CLI 명령어를 사용하여 역방향 복제 Dataflow 템플릿을 실행합니다.

      gcloud dataflow flex-template run "spanner-to-sourcedb-job" \
      --project "PROJECT" \
      --region "REGION" \
      --template-file-gcs-location "TEMPLATE_SPEC_GCSPATH" \
      --parameters "changeStreamName=CHANGE_STREAM_NAME" \
      --parameters "instanceId=INSTANCE_ID" \
      --parameters "databaseId=DATABASE_ID" \
      --parameters "spannerProjectId=SPANNER_PROJECT_ID" \
      --parameters "metadataInstance=METADATA_INSTANCE" \
      --parameters "metadataDatabase=METADATA_DATABASE" \
      --parameters "sourceShardsFilePath=SOURCE_SHARDS_FILE_PATH" \
      --parameters "startTimestamp=START_TIMESTAMP" \
      --parameters "endTimestamp=END_TIMESTAMP" \
      --parameters "shadowTablePrefix=SHADOW_TABLE_PREFIX" \
      [--parameters "sessionFilePath=SESSION_FILE_PATH"] \
      [--parameters "filtrationMode=FILTRATION_MODE"] \
      [--parameters "shardingCustomJarPath=SHARDING_CUSTOM_JAR_PATH"] \
      [--parameters "shardingCustomClassName=SHARDING_CUSTOM_CLASS_NAME"] \
      [--parameters "shardingCustomParameters=SHARDING_CUSTOM_PARAMETERS"] \
      [--parameters "sourceDbTimezoneOffset=SOURCE_DB_TIMEZONE_OFFSET"] \
      [--parameters "dlqGcsPubSubSubscription=DLQ_GCS_PUB_SUB_SUBSCRIPTION"] \
      [--parameters "skipDirectoryName=SKIP_DIRECTORY_NAME"] \
      [--parameters "maxShardConnections=MAX_SHARD_CONNECTIONS"] \
      [--parameters "deadLetterQueueDirectory=DEAD_LETTER_QUEUE_DIRECTORY"] \
      [--parameters "dlqMaxRetryCount=DLQ_MAX_RETRY_COUNT"] \
      [--parameters "runMode=RUN_MODE"] \
      [--parameters "dlqRetryMinutes=DLQ_RETRY_MINUTES"] \
      [--parameters "sourceType=SOURCE_TYPE"] \
      [--parameters "transformationJarPath=TRANSFORMATION_JAR_PATH"] \
      [--parameters "transformationClassName=TRANSFORMATION_CLASS_NAME"] \
      [--parameters "transformationCustomParameters=TRANSFORMATION_CUSTOM_PARAMETERS"] \
      [--parameters "filterEventsDirectoryName=FILTER_EVENTS_DIRECTORY_NAME"]
    

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

    • project: Google Cloud 프로젝트 ID
    • region: Google Cloud 리전입니다.
    • template-file-gcs-location: Dataflow 템플릿을 스테이징한 Cloud Storage 파일의 경로입니다.
    • changeStreamName: 작업에서 읽는 Spanner 변경 내역의 이름입니다.
    • instanceId: Spanner 인스턴스 ID입니다.
    • databaseId: Spanner 데이터베이스 ID입니다.
    • spannerProjectId: Spanner 인스턴스가 있는 프로젝트 ID입니다.
    • metadataInstance: 커넥터에서 변경 내역 API 데이터 소비를 제어하는 데 사용하는 메타데이터를 저장하는 인스턴스입니다.
    • metadataDatabase: 커넥터에서 변경 내역 API 데이터 소비를 제어하는 데 사용하는 메타데이터를 저장하는 데이터베이스입니다.
    • sourceShardsFilePath: 소스 샤드의 연결 프로필 정보가 포함된 Cloud Storage 파일의 경로입니다.

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

    • startTimestamp: 변경사항을 읽기 시작할 타임스탬프입니다. 기본값은 빈 값입니다.
    • endTimestamp: 변경사항을 읽을 때까지의 타임스탬프입니다. 타임스탬프를 제공하지 않으면 프로세스에서 변경사항을 무기한 읽습니다. 기본값은 빈 값입니다.
    • shadowTablePrefix: 섀도 테이블 이름을 지정하는 데 사용되는 프리픽스입니다. 기본값은 shadow_입니다.
    • sessionFilePath: Spanner 마이그레이션 도구의 매핑 정보가 포함된 Cloud Storage의 세션 파일 경로입니다.
    • filtrationMode: 기준에 따라 레코드를 필터링하는 방법을 결정하는 모드입니다. 지원되는 모드는 none 또는 forward_migration입니다.
    • shardingCustomJarPath: 샤드 ID를 가져오는 로직이 포함된 커스텀 JAR 파일의 Cloud Storage 내 위치(경로)입니다. 기본값은 빈 값입니다.
    • shardingCustomClassName: 커스텀 샤드 ID 구현이 있는 정규화된 클래스 이름입니다. shardingCustomJarPath가 지정되는 경우 이 필드는 필수입니다. 기본값은 빈 값입니다.
    • shardingCustomParameters: 커스텀 샤딩 클래스에 전달할 커스텀 파라미터가 포함된 문자열입니다. 기본값은 빈 값입니다.
    • sourceDbTimezoneOffset: 소스 데이터베이스의 시간대 오프셋(UTC)입니다. 예를 들면 +10:00입니다. 기본값은 +00:00입니다.
    • dlqGcsPubSubSubscription: regular 모드에서 실행할 때 DLQ 재시도 디렉터리에 대한 Cloud Storage 알림 정책에 사용되는 Pub/Sub 구독입니다. 이름을 projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_ID> 형식으로 지정합니다. 이 파라미터를 설정하면 시스템에서 deadLetterQueueDirectorydlqRetryMinutes를 무시합니다.
    • skipDirectoryName: 시스템이 역방향 복제 중에 건너뛰는 레코드를 쓰는 디렉터리입니다. 기본값: skip
    • maxShardConnections: 샤드당 허용되는 최대 연결 수입니다. 기본값: 10000
    • deadLetterQueueDirectory: DLQ 출력을 저장할 경로입니다. 기본값은 Dataflow 작업 임시 위치 아래에 있는 디렉터리입니다.
    • dlqMaxRetryCount: 시스템이 DLQ를 통해 임시 오류를 재시도하는 최대 횟수입니다. 기본값은 500입니다.
    • runMode: 실행 모드 유형입니다. 옵션은 regular 또는 retryDLQ입니다. 심각한 DLQ 레코드만 재시도하려면 retryDLQ를 사용합니다. 기본값: regular
    • dlqRetryMinutes: DLQ 재시도 간격(분)입니다. 기본값은 10입니다.
    • sourceType: 역방향 복제할 소스 데이터베이스의 유형입니다. 기본값은 mysql입니다.
    • transformationJarPath: 역방향 복제에서 레코드를 처리하기 위한 커스텀 변환 로직이 포함된 커스텀 JAR 파일의 Cloud Storage 내 위치(경로)입니다. 기본값은 빈 값입니다.
    • transformationClassName: 커스텀 변환 로직이 있는 정규화된 클래스 이름입니다. transformationJarPath가 지정되는 경우 이 필드는 필수입니다. 기본값은 빈 값입니다.
    • transformationCustomParameters: 커스텀 변환 클래스에 전달할 커스텀 파라미터가 포함된 문자열입니다. 기본값은 빈 값입니다.
    • filterEventsDirectoryName: 시스템이 역방향 복제 중에 건너뛰는 레코드를 쓰는 디렉터리입니다. 기본값: skip

다음 단계