AWS DMS를 사용하여 PostgreSQL 데이터베이스를 대상 RDS for PostgreSQL 데이터베이스로 마이그레이션할 때 사용할 모범 사례는 무엇이 있나요?

5분 분량
0

Amazon Relational Database Service(RDS) for PostgreSQL 소스 데이터베이스로 마이그레이션하려는 PostgreSQL 소스 데이터베이스가 있습니다. AWS Database Migration Service(AWS DMS)를 사용하여 한 PostgreSQL 데이터베이스에서 다른 데이터베이스로 마이그레이션할 때 사용할 수 있는 모범 사례는 무엇이 있나요?

간략한 설명

AWS DMS를 사용하여 동종 데이터베이스를 마이그레이션하는 경우 엔진의 기본 도구(예: pg_dump)를 사용하여 초기 데이터를 복사합니다. 그런 다음 대상에서 pg_restore를 수행합니다. 논리적 복제와 COPY 명령을 사용할 수도 있습니다. 자세한 내용은 PostgreSQL 데이터베이스를 Amazon RDS 및 Amazon Aurora로 마이그레이션하는 모범 사례를 참조하세요.

RDS for PostgreSQL 데이터베이스에서 다른 RDS for PostgreSQL 데이터베이스로 마이그레이션하려면 스냅샷을 생성한 다음 스냅샷을 대상으로 복원합니다. 자세한 내용은 RDS for PostgreSQL DB 인스턴스의 스냅샷을 Aurora PostgreSQL DB 클러스터로 마이그레이션 섹션을 참조하세요.

AWS DMS 전체 로드를 사용하여 원본 데이터베이스에서 대상 데이터베이스로 모든 데이터를 마이그레이션하면 시간이 오래 걸릴 수 있다는 점에 유의하세요. 다음과 같은 요인으로 인해 지연이 발생할 수 있습니다.

  • 대역폭
  • 대용량 데이터를 푸시할 수 있는 소스 용량
  • 대량 로드를 저장, 처리 및 전달할 수 있는 복제 엔진 용량
  • 소스 데이터를 소비하기 위한 목표 용량

이에 비해 변경 사항 복제에는 소스에서 대상으로의 변경 사항만 포함되므로 이와 같은 워크로드는 매우 적을 수 있습니다.

현재 로그 시퀀스 번호(LSN) 생성 및 확인

백업을 수행하기 전에 변경 사항 마이그레이션을 시작할 위치를 AWS DMS 태스크에 지시하는 마커가 있어야 합니다.

소스 PostgreSQL 데이터베이스에서 이러한 쿼리를 실행하여 현재 LSN을 생성하고 확인합니다.

복제 슬롯을 생성합니다.

SELECT * FROM
pg_create_logical_replication_slot('replication_slot_name','tset_decoding')

현재 LSN을 가져옵니다.

SELECT restart_LSN  FROM pg_replication_slots WHERE slot_name = 'replication_slot_name';

restart_LSN 명령은 소스에서 대상으로 변경 사항 마이그레이션을 시작할 위치를 AWS DMS 태스크에 알려줍니다.

해결 방법

AWS DMS 태스크를 사용하여 PostgreSQL에서 PostgreSQL로 데이터를 마이그레이션하려면 다음 모범 사례를 사용하세요.

전체 로드 중에는 외래 키 및 트리거를 사용하지 않습니다.

전체 로드가 발생하는 경우 외래 키와 트리거가 마이그레이션에 포함되지 않았는지 확인합니다. AWS DMS는 알파벳 순서로 테이블을 마이그레이션하지만 어떤 테이블이 상위 테이블이고 어떤 테이블이 하위 테이블인지는 알 수 없습니다. 따라서 AWS DMS는 하위 테이블을 먼저 마이그레이션하려고 할 수 있습니다. 그러면 AWS DMS는 외래 키 위반으로 인해 테이블 마이그레이션을 중지합니다. 그러므로 마이그레이션 중에는 대상에 외래 키를 표시하지 않거나 포함시키지 않습니다.

트리거는 대상의 데이터를 손상시킬 수 있는 여러 프로세스를 수행하기 때문에 마이그레이션 중에는 대상에 존재하지 않아야 합니다. 전환 시 트리거를 추가합니다.

JSON 데이터를 마이그레이션할 때 전체 LOB 모드 활성화

JSON 형식으로 LOB를 마이그레이션하는 경우 JSON 형식이 잘리지 않도록 전체 LOB 모드를 활성화합니다. 제한적 LOB 모드를 사용하는 경우 데이터 잘림이 발생할 수 있습니다. 그러면 AWS DMS는 JSON의 형식이 잘못되었으므로 테이블이 실패하도록 합니다.

프라이머리 키 필드가 TEXT 데이터 유형이 아닌지 확인

특히 전체 LOB 모드가 활성화된 경우 프라이머리 키 필드가 TEXT가 아닌지 확인합니다. AWS DMS는 TEXT 데이터 형식을 LOB로 처리하기 때문에 NULL이 중복될 수 있습니다. 따라서 전체 로드 중에 AWS DMS는 프라이머리 키를 NULL로 만들려고 시도한 다음 동일한 값을 가진 텍스트 열이 많기 때문에 중복을 보고합니다. 오류는 '프라이머리 키에서 NULL이 허용되지 않음'으로 처리되지 않고 중복으로 처리됩니다. 이는 발견하고 해결하기 어려운 문제일 수 있으므로 문제를 방지하기 위해 항상 프라이머리 키 필드가 TEXT가 아닌지 확인합니다.

AWS DMS가 대상 테이블을 생성하도록 허용

전체 로드가 발생하는 경우 AWS DMS가 대상에 테이블을 생성하도록 허용합니다. AWS DMS는 테이블을 생성할 때 열에 대한 DEFAULT 값이 일치하는 필드를 함께 생성합니다. 열의 기본값으로 인해 AWS DMS에서 예기치 않은 동작이 발생할 수 있습니다. 예를 들어 SERIAL을 사용하면 이 필드가 값을 자동으로 생성하려고 하기 때문에 AWS DMS 마이그레이션이 실패합니다. 다음 예를 참조하세요.

CREATE TABLE COMPANY (
   ID SERIAL PRIMARY KEY,
   NAME TEXT      NOT NULL);

대상이 이 예시와 같이 구조화된 경우 PostgreSQL 내부는 ID 열의 값을 생성하려고 합니다. 그러나 소스에는 문제를 일으키는 INSERT 값도 포함되어 있습니다. 따라서 마이그레이션 중에 DEFAULT가 대상의 일부가 아닌지 확인합니다.

태스크 테이블 매핑에서 파티션을 소스 테이블로 정의

분할된 테이블을 마이그레이션할 때는 파티션을 상위 테이블이 아닌 태스크 테이블 매핑의 소스 테이블로 정의해야 합니다. WAL 로그에 분할된 테이블 정보가 유지되기 때문입니다. 상위 테이블은 전체 로드 중에만 사용해야 하므로 CDC 단계에서는 상위 테이블을 사용하지 않습니다. CDC 중에 상위 테이블을 정의하면 마이그레이션에 영향을 주는 중복 오류가 발생할 수 있습니다.

또한 대상 테이블을 매핑할 때 모든 파티션이 상위에 다시 매핑되었는지 확인합니다. 즉, 상위 항목은 파티션에 자동으로 배포하는 데 사용됩니다.

PGLOGICAL을 사용할 때 소스에 모든 패싯 정의

마이그레이션에 PGLOGICAL을 사용하는 경우 소스에 필요한 모든 패싯을 정의해야 합니다. 한 영역을 건너뛰면 예기치 않은 동작이 발생합니다. 이로 인해 발생하는 문제는 해결하기가 매우 어려우므로 PGLOGICAL을 사용하여 마이그레이션을 시작하기 전에 이러한 영역을 정의했는지 확인합니다.

Amazon RDS의 경우 다음 항목을 정의합니다.

매개 변수 그룹:

shared_preload_libraries = pglocical

데이터베이스 수준:

create extension pglogical;

온프레미스의 경우 다음 항목을 정의합니다.

postgresql.conf:

shared_preload_libraries = pglogical

데이터베이스 수준:

create extension pglogical;

소스에 정의된 모든 PG 플러그인이 대상에 정의되어 있는지 확인

소스에 정의된 모든 PG 플러그인도 대상에 정의되어 있어야 합니다. 이는 데이터의 호환성과 원활한 처리에 도움이 됩니다.

태스크가 중지/오류 상태로 유지되지 않도록 확인

중지 또는 오류 상태에서 태스크 시간이 오래 걸리면 복제 슬롯의 스토리지가 꽉 차게 됩니다.

수동으로 생성한 복제 슬롯을 소스에서 삭제

복제 슬롯을 수동으로 생성한 경우 마이그레이션이 완료되면 소스에서 해당 슬롯을 삭제합니다. 복제 슬롯이 소스에 남아 있으면 크기가 누적되어 스토리지가 꽉 차게 됩니다.

프라이머리 키/고유 인덱스가 있는 테이블 마이그레이션

마이그레이션하는 테이블에 프라이머리 키/고유 인덱스가 있는지 확인하는 것이 좋습니다. 테이블에 프라이머리 키가 없는 경우, WAL 로그에 기록되지 않았기 때문에 UPDATE 및 DELETE 문이 테이블에 적용되지 않을 수 있습니다. 프라이머리 키가 없는 테이블의 경우 REPLICATE IDENTITY FULL을 사용하지만 이렇게 하면 로그에 많은 정보가 생성됩니다.


관련 정보

PostgreSQL 데이터베이스를 AWS DMS 소스로 사용

데이터 마이그레이션용 대상

AWS 공식
AWS 공식업데이트됨 2년 전