Vacuum 작업을 통한 스토리지 공간 회수 - Amazon Aurora

Vacuum 작업을 통한 스토리지 공간 회수

PostgreSQL Multiversion Concurrency Control(MVCC)은 트랜잭션이 커밋되거나 롤백될 때까지 업데이트되거나 삭제된 행의 내부 복사본을 저장하여 데이터 무결성을 유지하는 데 도움이 됩니다. 튜플이라고도 하는 이러한 복사본은 정기적으로 정리하지 않으면 테이블 팽창을 야기할 수 있습니다. PostgreSQL 인스턴스는 트랜잭션 ID를 기준으로 트랜잭션 순서를 지정하며, PostgreSQL은 트랜잭션 ID 기반 MVCC를 사용하여 튜플 가시성을 제어하고 트랜잭션 격리를 제공합니다. 각 트랜잭션은 데이터의 스냅샷을 설정하고 각 튜플에는 버전이 있습니다. 스냅샷과 버전 모두 트랜잭션 ID 기반입니다.

VACUUM 유틸리티는 데이터를 정리하기 위해 PostgreSQL에서 네 가지 주요 함수를 수행합니다.

  • VACUUM - 만료된 행 버전을 제거하여 공간을 재사용할 수 있게 합니다.

  • VACUUM FULL - 데드 열 버전을 제거하고 테이블을 압축하여 완전한 조각 모음을 제공함으로써 크기를 줄이고 효율성을 높입니다.

  • VACUUM FREEZE - 이전 행 버전을 고정으로 표시하여 트랜잭션 ID 랩어라운드 문제를 방지합니다.

  • VACUUM ANALYZE - 데드 행 버전을 제거하고 데이터베이스의 쿼리 계획 통계를 업데이트합니다. VACUUMANALYZE 함수의 조합입니다. Aurora PostgreSQL Limitless Database에서 ANALYZE가 작동하는 방법에 대한 자세한 내용은 ANALYZE 섹션을 참조하세요.

MVCC와 마찬가지로 Aurora PostgreSQL에서 vacuum 작업은 트랜잭션 ID 기반입니다. Vacuum이 시작될 때 진행 중인 트랜잭션이 있는 경우 해당 트랜잭션에 계속 표시되는 행은 제거되지 않습니다.

VACUUM 유틸리티에 대한 자세한 내용은 PostgreSQL 설명서의 VACUUM을 참조하세요. Aurora PostgreSQL Limitless Database의 VACUUM 지원에 대한 자세한 내용은 VACUUM 섹션을 참조하세요.

AUTOVACUUM

Aurora PostgreSQL은 VACUUMAUTOVACUUM 유틸리티를 사용하여 불필요한 튜플을 제거합니다. AUTOVACUUM의 기본 메커니즘과 수동 VACUUM은 동일하며 유일한 차이점은 자동화입니다.

Aurora PostgreSQL 및 Aurora PostgreSQL Limitless Database의 AUTOVACUUMVACUUMANALYZE 유틸리티의 조합입니다. AUTOVACUUM은 데드 튜플의 백분율 및 삽입 수와 같은 사전 정의된 규칙에 따라 정리할 데이터베이스 및 테이블을 결정합니다.

예를 들어, AUTOVACUUM은 '다시 시작'을 주기적으로 실행하여 정리를 수행합니다. 간격은 autovacuum_naptime 파라미터로 제어됩니다. 기본값은 1분입니다. AUTOVACUUMVACUUM 구성 파라미터의 기본값은 Aurora PostgreSQL Limitless Database와 Aurora PostgreSQL이 동일합니다.

AUTOVACUUM 대몬은 활성화된 경우 테이블의 내용이 충분히 변경될 때마다 ANALYZE 명령을 자동으로 실행합니다. Aurora PostgreSQL Limitless Database에서 AUTOVACUUM은 라우터와 샤드 모두에 ANALYZE를 발급합니다.

AUTOVACUUM과 연결된 AUTOVACUUM 대몬 및 테이블 스토리지 파라미터에 대한 자세한 내용은 PostgreSQL 설명서의 The autovacuum daemonStorage parameters를 참조하세요.

Aurora PostgreSQL Limitless Database의 시간 기반 vacuum 처리

Aurora PostgreSQL Limitless Database는 분산 시스템이므로 여러 인스턴스가 하나의 트랜잭션에 관여할 수 있습니다. 따라서 트랜잭션 ID 기반 가시성은 적용되지 않습니다. 대신 Aurora PostgreSQL Limitless Database는 시간 기반 가시성을 사용합니다. 트랜잭션 IDs는 인스턴스 간에 '통합'되지 않지만 인스턴스 간에 '통합'될 수 있기 때문입니다. 각 트랜잭션 스냅샷과 각 튜플 버전은 트랜잭션 ID 대신 시간을 따릅니다. 보다 구체적으로 설명하자면 트랜잭션 스냅샷에는 스냅샷 시작 시간이 있고, 튜플에는 만든 시간(INSERT 또는 UPDATE가 발생한 시점)과 삭제 시간(DELETE가 발생한 시점)이 있습니다.

DB 샤드 그룹의 인스턴스 간에 데이터 일관성을 유지하려면 Aurora PostgreSQL Limitless Database는 vacuum 작업이 DB 샤드 그룹의 활성 트랜잭션에 여전히 표시되는 튜플을 제거하지 않도록 해야 합니다. 따라서 Aurora PostgreSQL Limitless Database의 vacuum도 시간 기반입니다. 특정 테이블에서 VACUUM을 실행하는 것을 포함하여 VACUUM의 다른 측면은 동일하게 유지되며 사용자는 해당 테이블에 액세스할 수 있어야 합니다.

참고

트랜잭션을 장기간 열어 두지 않는 것이 좋습니다.

시간 기반 vacuum은 트랜잭션 ID 기반 vacuum보다 더 많은 메모리를 소비합니다.

다음 예시에서는 시간 기반 vacuum의 작동 방식을 보여줍니다.

  1. 고객 테이블은 네 개의 샤드에 분산됩니다.

  2. 트랜잭션 1은 반복 가능한 읽기로 시작하며 샤드(샤드 1) 하나만 대상으로 합니다. 이 트랜잭션은 열린 상태로 유지됩니다.

    트랜잭션 1은 그 이후에 시작된 다른 트랜잭션보다 연령이 더 많습니다.

  3. 트랜잭션 2는 나중에 시작되고 테이블에서 모든 튜플을 삭제한 다음 커밋합니다.

  4. AUTOVACUUM 또는 수동 VACUUM이 데드 튜플을 정리하려고 하면(트랜잭션 2로 인해 데드 상태) 아무것도 제거되지 않습니다.

    트랜잭션 1이 여전히 이러한 튜플에 액세스해야 할 수 있기 때문에 샤드 1뿐만 아니라 샤드 2~4에 대해서도 마찬가지입니다. MVCC로 인해 트랜잭션 1에도 계속 표시됩니다.

마지막 단계는 동기화를 통해 이루어지므로 트랜잭션 1이 모든 샤드를 터치하지 않더라도 모든 샤드가 트랜잭션 1을 인식합니다.

데이터베이스 통계를 사용하여 vacuum 처리

정리해야 할 수 있는 튜플에 대한 정보를 가져오려면 pg_stat_all_tables과 유사하게 작동하는 limitless_stat_all_tables 뷰를 사용합니다. 다음 예시는 뷰를 쿼리합니다.

SELECT * FROM rds_aurora.limitless_stat_all_tables WHERE relname LIKE '%customer%';

마찬가지로 데이터베이스 통계의 경우 pg_stat_database 대신 limitless_stat_database를 사용하고 pg_stat_activity 대신 limitless_stat_activity를 사용합니다.

테이블 디스크 사용량을 확인하려면 pg_relation_size와 유사하게 작동하는 limitless_stat_relation_sizes 함수를 사용합니다. 다음 예시는 함수를 쿼리합니다.

SELECT * FROM rds_aurora.limitless_stat_relation_sizes('public','customer');

Aurora PostgreSQL Limitless Database에서 VACUUM 작업의 진행 상황을 추적하려면 pg_stat_progress_vacuum 대신 limitless_stat_progress_vacuum 뷰를 사용합니다. 다음 예시는 뷰를 쿼리합니다.

SELECT * FROM rds_aurora.limitless_stat_progress_vacuum;

자세한 내용은 Aurora PostgreSQL Limitless Database 뷰Aurora PostgreSQL Limitless Database 함수 단원을 참조하세요.

Aurora PostgreSQL과 Aurora PostgreSQL Limitless Database의 vacuum 동작 차이점

Vacuum 작동 방식과 관련하여 Aurora PostgreSQL과 Aurora PostgreSQL Limitless Database의 또 다른 차이점은 다음과 같습니다.

  • Aurora PostgreSQL은 가장 오래 지속되는 트랜잭션까지 트랜잭션 ID에 대한 VACUUM 작업을 수행합니다. 데이터베이스에 진행 중인 트랜잭션이 없는 경우 VACUUM은 마지막 트랜잭션까지 작업을 수행합니다.

  • Aurora PostgreSQL Limitless Database는 가장 오래된 시간 스냅샷을 10초마다 동기화합니다. 따라서 VACUUM은 지난 10초 이내에 실행된 트랜잭션에 대해 작업을 수행하지 않을 수 있습니다.

Aurora PostgreSQL Limitless Database의 VACUUM 지원에 대한 자세한 내용은 Aurora PostgreSQL Limitless Database 참조VACUUM 섹션을 참조하세요.