DB & AWS Knowledge
PostgreSQL / PPAS DB Age 본문
해당 페이지에서는 Vacuum 을 수행하는 이유 중 하나인 PostgreSQL / PPAS 의 DB age 에 대하여 다룬다.
(참고페이지 및 그림출처)
www.slideshare.net/masahikosawada98/introduction-vauum-freezing-xid-wraparound
postgresql.kr/docs/9.4/routine-vacuuming.html
이 내용을 보기 전, PostgreSQL, MySQL의 기초 MVCC 개념을 숙지하고 오면 좋다.
2021.03.07 - [PostgreSQL/아키텍처 및 내부 구조] - PostgreSQL / PPAS MVCC
2021.03.03 - [MySQL/아키텍처 및 내부 구조] - MySQL / MariaDB MVCC
PostgreSQL 은 ORACLE, MySQL 과 다르게 undo 영역이 없고, 이에 따라 commit 등의 데이터 기입이 확정되어
기입 되는 자료로 인하여 이전 해당 데이터의 변경 내역들을 지속적으로 보관하는
MGA (Multi Generation Architecture) 구조를 사용한다.
MGA 는 처리되거나 처리될 각각의 모든 트랜잭션들에 대해서 트랜잭션ID 를 부여한다.
PostgreSQL 은 txd (트랜잭션ID) 를 32비트의 이진 배열로 구성한다. 그렇기 때문에 내부적으로 최대 약 40억개의
트랜잭션을 보관 할 수 있다. (2의 32제곱 = 약 42 억)
PostgreSQL 에서는 40억개의 txd 를 절반씩 나누어 기존자료를 가지는 old (older) 와 dml 로 변경될 데이터를 가지는 new (newer) 로 구분한다. old 버전은 기존 DB에서 보여지는 트랜잭션 영역, newer 버전은 아직 수행되는 이후 트랜잭션에 분배할 txd 영역이다.
Freeze 는 지속적으로 트랜잭션이 들어옴에도 이전에 존재하는 트랜잭션들이 정합성이나 MVCC 등의 이유로 보존될 필요 가 있을때 DB 가 old, new 영역에 상관없이 보여지도록 기록하는 시점이다.
DB Age 는 해당 Freeze ID 에서 시작하여 최신값으로 txd 값을 받은 트랜잭션과의 txd 차이다.
(예를 들자면, 두번째 그림에서 별표와 Freeze 시점의 txd 차이값이다.)
원형 도형을 보면 짐작하겠지만, PostgreSQL 은 지속적으로 txd 를 분배하다보면 (new 영역인 20억개) 최대 갯수인 40억개에 도달하게 되어 언젠가능 더 이상 분배할 txd 가 고갈되게 되는 현상이 발생되고, 결국 40억개가 소진된 후 들어오는 트랜잭션에 txd 를 배정 후, 이전에 배정된 트랜잭션 txd를 다시 받으면서 기존에 받은 트랜잭션을 덮어씌운다. 이를 wraparound 라고 한다.
당연히 진행중인 txd 및 트랜잭션이 취소되어 삭제되면 데이터 적합성 이상의 치명적인 문제가 발생하기에 PostgreSQL 에서는 주기적으로 혹은 사용자가 명시적으로 이를 회수 할 수 있는 작업을 수행 해야 있는데 이를 Vacuum 이라 한다.
Vacuum 이 더이상 보존 할 필요가 없는 트랜잭션 및 txd 를 회수하기에 지속적으로 new 영역이 존재하여 txd 를 분배하는 것이다.
2021.03.08 - [PostgreSQL/Vacuum] - Vacuum 목적 및 종류
Vacuum 은 자동으로 특정 오브젝트가 파라미터로 설정한 age 이상으로 찼을 때 자동으로 수행 되는 autovacuum 과 사용자가 명시적인 명령어로 사용하는 vacuum 이 있다.
수동, 자동 여부 상관없이 Vacuum 은 반드시 트랜잭션이 고갈되기 전에 수행되어야 하는 작업이다.
Vacuum 이 제대로 수행되지 않으면 로그에 아래와 같은 내용이 기록되기 시작한다.
WARNING: database "mydb" must be vacuumed within 177009986 transactions
HINT: To avoid a database shutdown, execute a database-wide VACUUM in "mydb".
이를 그대로 방치시에는 DB 가 아래의 내용을 보이면서 트랜잭션을 받지 않게 되어 제 기능을 하지 못하게 된다.
ERROR: database is not accepting commands to avoid wraparound data loss in database "mydb"
HINT: Stop the postmaster and use a standalone backend to VACUUM in "mydb".
이에 대한 실례 장애 사례는 아래 페이지에 정리했다.
'PostgreSQL > 아키텍처 및 내부 구조' 카테고리의 다른 글
PostgreSQL / PPAS data 영역 구조 (0) | 2021.07.08 |
---|---|
PostgreSQL / PPAS 데이터베이스 구조 (0) | 2021.06.11 |
PostgreSQL / PPAS 기본 아키텍처 (Engine) (0) | 2021.03.19 |
PostgreSQL / PPAS index 종류 (0) | 2021.03.11 |
PostgreSQL / PPAS Lock 종류 (0) | 2021.03.08 |