PostgreSQL은 데이터 일관성을 관리하고 성능을 최적화하기 위해 MVCC(다중 버전 동시성 제어) 및 VACUUM이라는 두 가지 필수 메커니즘을 사용합니다. 이러한 메커니즘을 자세히 살펴보고 메커니즘이 작동하는 방식과 강력한 데이터베이스 시스템을 유지하는 데 중요한 이유를 알아보자!
다중 버전 동시성 제어(MVCC)
MVCC는 데이터베이스 테이블을 잠그지 않고 동시 트랜잭션을 관리하는 데 사용되는 데이터베이스 기술이며,
이는 읽기 및 쓰기 작업이 동시에 발생할 수 있어 각 트랜잭션에 대한 데이터에 대한 일관된 보기를 제공할 수 있음을 의미.
MVCC 작동 방식
트랜잭션 격리: 각 트랜잭션은 특정 시점의 데이터베이스 스냅샷을 확인합니다. 이렇게 하면 한 트랜잭션의 변경 사항이 커밋될 때까지 다른 트랜잭션에 표시되지 않습니다.
튜플 버전 관리: 행(튜플)이 업데이트되거나 삭제될 때 PostgreSQL은 이전 데이터를 덮어쓰지 않습니다. 대신 최신 데이터로 행의 새 버전을 생성하고 유효 기간을 나타내는 타임스탬프로 이전 버전을 표시합니다. 이를 통해 트랜잭션은 시작 시간을 기준으로 적절한 버전의 데이터에 액세스할 수 있습니다.
Visibility Rules(가시성 규칙) :
* INSERT: 새로 삽입된 행은 커밋될 때까지 해당 행을 삽입한 트랜잭션에만 표시됩니다.
* UPDATE: 업데이트는 새 행 버전을 생성하고 업데이트 전에 시작된 트랜잭션에는 이전 버전이 유지됩니다.
* DELTER: 삭제된 행은 삭제 트랜잭션이 커밋될 때까지 데이터베이스에 남아 있으므로 다른 트랜잭션에서 원본 데이터를 계속 볼 수 있습니다.
MVCC의 장점
* 동시 읽기 및 쓰기 작업: 잠금 메커니즘이 필요하지 않아 성능이 향상됩니다.
* 일관된 읽기: 각 트랜잭션이 데이터베이스의 일관된 보기에서 작동하는지 확인합니다.
* 격리 수준: 다양한 격리 수준을 지원하여 유연한 트랜잭션 관리가 가능합니다.
PostgreSQL의 VACUUM
MVCC는 상당한 이점을 제공하지만 더 이상 사용되지 않는 행 버전이 축적되어 데이터베이스를 부풀리고 성능을 저하시킬 수도 있습니다. VACUUM이 작동하는 곳입니다.
VACUUM이란 무엇인가?
VACUUM은 업데이트 및 삭제 작업으로 남겨진 데드 튜플을 정리하는 PostgreSQL 유틸리티입니다. 데이터베이스 상태를 유지하여 스토리지를 회수하고 데이터베이스 성능을 최적화합니다.
VACUUM의 종류
Standard VACUUM : 데드 튜플에서 공간을 회수하여 나중에 사용할 수 있도록 합니다. 그러나 운영 체제에 공간을 반환하지 않습니다.
VACUUM FULL: 테이블을 잠그고 전체 테이블을 새 파일에 다시 작성하여 압축한 다음 공간을 운영 체제에 반환하는 보다 공격적인 형태의 VACUUM입니다. 이렇게 하면 테이블 크기가 크게 줄어들 수 있지만 테이블 잠금이 발생합니다.
Autovacuum
PostgreSQL에는 적절한 시간에 VACUUM 및 ANALYZE 명령을 자동으로 실행하는 autovacuum 데몬이 포함되어 있습니다. 이는 수동 개입 없이 데이터베이스를 유지 관리하고 최적의 성능을 보장하며 테이블 팽창을 방지하는 데 도움이 됩니다.
VACUUM 모범 사례
* 정기 유지 관리: 과도한 데이터베이스 팽창을 방지하기 위해 정기적인 VACUUM 작업을 예약합니다.
* 성능 모니터링: PostgreSQL의 모니터링 도구를 사용하여 데이터베이스의 성능과 상태를 추적합니다.
* Autovacuum 조정: 워크로드 및 성능 요구 사항에 따라 Autovacuum 설정을 조정합니다.
결론
MVCC 및 VACUUM은 동시성과 성능이 뛰어난 데이터베이스 시스템을 제공하기 위해 함께 작동하는 PostgreSQL의 기본 구성 요소입니다. MVCC를 사용하면 잠금 없이 효율적인 트랜잭션 관리가 가능하며, VACUUM은 오래된 데이터를 정리하여 데이터베이스가 간결하게 유지되고 제대로 작동하도록 보장합니다. PostgreSQL 관리자가 건강하고 효율적인 데이터베이스 환경을 유지하려면 이러한 메커니즘을 이해하고 적절하게 구성하는 것이 중요합니다.
'DBA > Postgresql' 카테고리의 다른 글
| pg_stat_statements 활용(통계 정보) (0) | 2024.07.26 |
|---|---|
| PostgreSQL 에러 코드 (3) | 2024.07.24 |
| DB 내의 모든 table 들에 대해 각 relation ID 별로 block hit/read 통계 정보 확인 쿼 (0) | 2024.06.25 |
| 암호화 extension - pgcrypto (0) | 2024.06.11 |
| PostgreSQL 제약 조건 (0) | 2024.05.03 |