Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

PostgreSQL / PPAS DB Age 본문

PostgreSQL/아키텍처 및 내부 구조

PostgreSQL / PPAS DB Age

`O` 2021. 4. 16. 03:12
728x90
반응형

해당 페이지에서는 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".

 

이에 대한 실례 장애 사례는 아래 페이지에 정리했다.

 

2021.04.22 - [PostgreSQL/장애사례] - DB Age Full 로 인한 DB 사용 불가

반응형
Comments