AWS DMS 작업 중에 대량 작업이 실패하여 Amazon Redshift가 one-by-one 모드로 전환된 원인을 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 10월 2일

Amazon Redshift를 대상으로 데이터를 마이그레이션하는 AWS Database Migration Service(AWS DMS) 작업이 있습니다. 하지만 대량 작업이 실패하여 작업이 one-by-one 모드로 변경되었습니다. 이 문제를 해결하려면 어떻게 해야 합니까?

간략한 설명

작업의 변경 데이터 캡처(CDC) 단계 중에 AWS DMS는 단일 스레드를 사용하여 원본에서 변경 데이터를 읽고 변경 사항을 대상에 적용합니다. 스레드는 소스의 변경 속도에 따라 한 번에 특정 수의 트랜잭션만 처리할 수 있기 때문에 스레드가 대상을 원본과 동기화할 수 없는 경우도 있습니다. 이 문제는 OLAP 엔진에서의 커밋 비용이 비싸기 때문에 Amazon Redshift가 AWS DMS의 대상일 때 더 자주 발생합니다. 기본적으로 AWS DMS는 Batch Apply 모드를 사용하여 변경 사항을 배치 단위로 처리합니다. Batch Apply 모드를 사용할 때 AWS DMS는 다음을 수행합니다.

  1. [Batch Apply settings]에서 제어하는 배치에서 변경 사항을 수집합니다.
  2. 배치에서 대상 인스턴스로의 모든 변경 사항이 포함된 순 변경 사항 테이블을 생성합니다. 
  3. 트랜잭션을 그룹화하고 대상에 대량으로 적용하는 알고리즘을 사용합니다.

데이터를 Amazon Redshift로 복제하는 마이그레이션 작업에서 배치를 적용하는 데 문제가 있는 경우 AWS DMS에서 전체 배치가 실패하는 것은 아닙니다. AWS DMS는 배치를 중단하고 트랜잭션을 적용하기 위해 one-by-one 모드로 전환합니다. AWS DMS에서 배치 작업 실패를 초래한 트랜잭션이 발생하면 AWS DMS는 해당 트랜잭션을 Amazon Redshift 대상의 awsdms_apply_exceptions 테이블에 기록합니다. 그런 다음 AWS DMS는 배치의 모든 트랜잭션이 대상에 적용될 때까지 배치의 다른 트랜잭션을 하나씩 차례로 적용합니다. 마지막으로 AWS DMS는 새 배치에 대해 Batch Apply 모드로 다시 전환하고 다른 배치가 실패하지 않으면 Batch Apply를 계속 사용합니다.

​해결 방법

AWS DMS 작업 로그를 확인하여 배치 실패 여부와 AWS DMS의 one-by-one 모드 사용 여부를 확인할 수 있습니다. 배치가 실패하고 AWS DMS가 one-by-one 모드로 전환될 때마다 다음 로그 항목이 표시됩니다.

메시지
[TARGET_APPLY] I: Bulk apply operation failed. Trying to execute bulk statements in 'one-by-one' mode (bulk_apply.c: 2175)

이 경우 AWS DMS는 배치의 트랜잭션 중 하나라도 문제가 발생할 때까지 대상에 트랜잭션을 순차적으로 적용합니다. AWS DMS에서 문제가 발생하면 트랜잭션의 로그를 기록하고 다음과 유사한 로그 항목이 표시됩니다.

메시지
[TARGET_APPLY ]W: Source changes that would have had no impact were not applied to the target database. Refer to the 'awsdms_apply_exceptions' table for details. (endpointshell.c:5984)

참고: AWS DMS 작업의 작업 설정에서 제어 테이블 스키마를 지정하지 않는 한 기본적으로 awsdms_apply_exceptions 테이블은 퍼블릭 스키마에 생성됩니다.

AWS DMS는 트랜잭션 로그를 기록한 후 해당 배치에서 모든 트랜잭션의 적용을 완료합니다. 그런 다음 AWS DMS가 Batch Apply로 다시 전환되고 다음과 유사한 메시지가 로그에 표시됩니다.

메시지
[TARGET_APPLY] I: Switch back to bulk apply mode (bulk_apply.c: 4751)

Amazon Redshift는 복잡한 분석 쿼리 실행에 최적화된 OLAP 데이터 웨어하우스입니다. 하지만 Amazon Redshift 성능은 OLTP 데이터베이스에서 트랜잭션 변경 사항을 실행할 때 영향을 받을 수 있습니다. 따라서 Batch Apply가 실패하고 AWS DMS가 one-by-one 모드로 전환되면 AWS DMS가 one-by-one 모드에서 트랜잭션을 실행하는 기간 동안 대상 지연 시간이 높아집니다. AWS DMS가 Bulk Apply로 다시 전환되면 대상 지연 시간이 줄어듭니다.

이 문제를 해결하려면 Amazon Redshift 대상에 연결합니다. 그리고 awsdms_apply_exceptions 테이블에서 출력을 가져와 배치 작업 실패를 초래한 쿼리를 식별합니다.

select * from public.awsdms_apply_exceptions order by 4 desc;

배치 작업 실패를 초래한 쿼리(예: 업데이트 충돌 또는 제약 조건 위반)를 찾은 후 충돌을 해결하여 작업이 one-by-one 모드로 전환되는 것을 방지할 수 있습니다.