AWS Database Migration Service(AWS DMS) 변경 데이터 캡처(CDC) 작업을 실행할 때 소스 PostgreSQL 데이터베이스의 높은 스토리지 사용량 문제를 해결하고 싶습니다.
간략한 설명
PostgreSQL을 CDC 작업의 소스로 사용하면 AWS DMS가 PostgreSQL 논리적 복제 슬롯을 사용하여 소스 데이터베이스의 변경 사항을 가져옵니다. WAL을 PostgreSQL 소스에 연결하지 않는 경우에도 AWS DMS에 필요한 미리 쓰기 로그(WAL)가 슬롯에 유지됩니다. AWS DMS는 복제 슬롯에서 필요한 변경 사항을 가져오고 복제 슬롯의 restart_lsn을 진행한 후에만 PostgreSQL에서 WAL을 제거합니다.
자세한 내용은 PostgreSQL 웹 사이트의 Logical decoding concepts를 참조하십시오.
스토리지 볼륨 문제는 다음과 같은 이유로 발생할 수 있습니다.
- AWS DMS CDC 작업을 오랫동안 중지했습니다. AWS DMS를 소스 데이터베이스에 연결하지 않으면 소스의 복제 슬롯에서 변경된 내용이 사용되지 않습니다. 따라서 PostgreSQL이 WAL을 지속적으로 유지합니다.
- 과도한 WAL 생성을 유발하는 과중한 워크로드가 있습니다. 논리적 복제 슬롯을 사용하는 경우 복제 슬롯에 로그 시퀀스 번호(LSN)가 필요하면 PostgreSQL이 WAL을 유지합니다.
- 유휴 복제 슬롯이 있습니다. 복제 슬롯이 비활성 상태인 경우에도 복제 슬롯이 유지하는 WAL에는 여전히 테이블, 스키마 또는 데이터베이스에 대한 정보가 포함되어 있습니다. 따라서 테이블에 트랜잭션이 없는 경우에도 소스의 스토리지가 가득 차게 됩니다.
해결 방법
복제 슬롯으로 인해 PostgreSQL 소스의 디스크 공간 사용량이 증가하는지 확인
복제 슬롯으로 인해 PostgreSQL 데이터베이스의 디스크 공간 사용량이 증가하는지 확인하려면 다음 쿼리 중 하나를 실행합니다.
PostgreSQL v9:
psql=> SELECT slot_name, pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
PostgreSQL v10 이상:
psql=> SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),restart_lsn)) AS replicationSlotLag, active FROM pg_replication_slots ;
출력 예시:
slot_name | replicationslotlag | active---------------------------------------------------------------+--------------------+--------
xc36ujql35djp_00013322_907c1e0a_9f8b_4c13_89ea_ef0ea1cf143d | 129 GB | f
7pajuy7htthd7sqn_00013322_a27bcebf_7d0f_4124_b336_92d0fb9f5130 | 704 MB | t
zp2tkfo4ejw3dtlw_00013322_03e77862_689d_41c5_99ba_021c8a3f851a | 624 MB | t
복제 슬롯의 활성 상태가 f(false)로 설정된 경우에는 데이터베이스가 해당 슬롯을 사용하지 않는 것입니다.
사용하지 않는 슬롯을 삭제하려면 다음 쿼리를 실행합니다.
psql=> SELECT pg_drop_replication_slot('YOUR_SLOTNAME');
참고: YOUR_SLOTNAME을 슬롯 이름으로 바꾸십시오.
자세한 내용은 Amazon Relational Database Service(Amazon RDS)에서 "No space left on device" 또는 "DiskFull" 오류가 발생하는 이유는 무엇입니까?를 참조하십시오.
WAL 하트비트 기능 활성화
PostgreSQL 소스 데이터베이스의 스토리지 사용량을 줄이려면 heartbeatEnable 추가 연결 속성(ECA)을 활성화하십시오. 이 속성은 PostgreSQL 소스에서 스토리지가 가득 차는 시나리오를 방지하는 데 도움이 됩니다.
WAL 하트비트 기능을 활성화하려면 PostgreSQL 소스 엔드포인트에 다음 ECA를 추가합니다.
heartbeatEnable=Y;
참고: 하트비트 트랜잭션은 AWS DMS 작업이 실행 중인 경우에만 소스에서 실행됩니다. AWS DMS 작업을 중지하면 WAL 하트비트 기능이 아무런 효과가 없습니다.
다음 ECA도 지정할 수 있습니다.
heartbeatFrequency=frequency;heartbeatSchema=schemaname;
heartbeatFrequency 속성은 PostgreSQL 소스에서 하트비트 트랜잭션이 실행되는 빈도를 분 단위로 지정합니다. frequency를 원하는 트랜잭션 실행 빈도로 바꾸십시오. 예를 들어 heartbeatFrequency 값을 15로 설정하면 AWS DMS는 소스에서 15분마다 하트비트 트랜잭션을 실행합니다.
heartbeatSchema 속성은 하트비트 트랜잭션을 생성하기 위해 AWS DMS에서 데이터베이스 객체를 만드는 데이터베이스 스키마를 지정합니다. schemaname을 데이터베이스 스키마로 바꾸십시오.
PostgreSQL에서 슬롯의 최대 크기 설정
PostgreSQL 버전 13 이상에서는 소스 데이터베이스에 max_slot_wal_keep_size를 적용할 수 있습니다. 이는 복제 슬롯이 유지할 수 있는 최대 WAL의 양을 설정합니다. 자세한 내용은 PostgreSQL 웹사이트의 max_slot_wal_keep_size를 참조하십시오.
참고: max_slot_wal_keep_size 설정은 PostgreSQL 소스에서 스토리지 부족 문제를 방지하는 데 도움이 됩니다. 하지만 이 경우 AWS DMS CDC 작업이 복제 슬롯에서 변경 사항을 읽기 전에 PostgreSQL 소스 데이터베이스에서 WAL을 제거할 수 있습니다. 이로 인해 작업이 실패할 수 있습니다.
관련 정보
Hevo 웹 사이트의 Types of PostgreSQL replication slots