[PostgreSQL] Checkpointer 와 bg_writer의 관계(트랜잭션이 물리적으로 쓰여지는 프로세스)

Ja L·2024년 1월 8일
0

[PostgreSQL] Operation

목록 보기
24/35

Term

  • checkpoint :
    모든 데이터 파일이 순차적인 트랜잭션 로그 가운데, 한 시점을 기준으로 모든 데이터 파일이 물리적으로 모두 쓰여진 한 시점

  • shared buffer :
    DISK I/O를 최소화하려는 목적을 가진 메모리로 자주 사용되는 블록을 메모리에 올려두어 빠른 처리를 가능하게 한다.

  • WAL buffer :
    데이터베이스의 변경 사항을 잠시 저장하는 버퍼이다. WAL Buffer 내에 저장된 내용은 정해진 시점에 WAL파일로 기록된다.

  • bg_writer(background writer) :
    주기적으로 shared buffer에 기록된 dirty buffer를 물리적 디스크($PGDATA/base)에 기록하는 프로세서

  • checkpointer :
    체크포인트 발생 시 shared buffer가 dirty buffer를 물리적 디스크($PGDATA/base)에 기록하며, pg_control 파일을 물리적 디스크에 기록합니다($PGDATA/global). pg_control은


트랜잭션이 반복적으로 발생하는 상황이라고 가정합니다.


  • 물리적 디스크에 트랜잭션이 기록되는 과정을 설명합니다.
  1. 트랜잭션이 발생한 table의 page가 shared buffer에 올라옵니다(paging)
  2. 변경된 사항이 shared buffer에 저장됩니다.
  3. 일정 주기로 bg_writer 가 dirty buffer를 물리적 디스크에 내려씁니다.

  • WAL log가 생기는 과정을 설명합니다.
  1. shared memory의 WAL buffer가 데이터베이스의 변경 사항을 잠시 저장합니다.
  2. WAL buffer에 저장된 내용이 정해진 시점에 WAL 파일로 기록됩니다.

  • Checkpoint와 bg_writer의 관계를 설명합니다.
    WAL 로그는 bg_writer가 물리적 디스크에 기록을 하기 전 먼저 기록됩니다. 따라서 정상적인 경우에 물리적 디스크에 기록된 내용은 모두 WAL 로그에서 확인할 수 있습니다. Checkpoint는 물리적 디스크에($PGDATA/base) 기록된 내용을 WAL 로그와 비교하여 어느 세그먼트의 어떤 특정 위치까지 기록이 되었는지 확인하여 pg_control에 기록합니다. 즉 Checkpoint가 마지막으로 수행된 WAL 로그의 위치와 LSN (Log Sequence Number) 정보를 저장합니다. (Checkpoint가 발생할 때 shared buffer에 존재하는 dirty buffer는 물리적 디스크에 저장한 후 WAL 로그와 비교합니다)
    변경된 데이터를 디스크에 반영하는 것이 아닌, WAL 로그의 내용을 디스크에 기록하여 일종의 '점검표' 를 만듭니다. 이 '점검표'를 통해 데이터베이스는 복구 시점을 정하고, 장애 발생 시에 해당 시점으로부터 데이터를 복구할 수 있습니다.
  • Checkpoint 가 복구에 도움이 되는 경우
    WAL 로그에 정보가 기록되어있으나 변경된 내용이 물리적 디스크에 기록되기 전 Shared memory에 존재하는 때 DB가 비정상 종료된 경우 WAL 로그에 의존하여 복구를 진행할 수 밖에 없습니다. 이 때 물리적 디스크에 기록된 데이터가 WAL 로그의 어디까지 기록되어있는지 비교할 수 있는 '기준'이 필요합니다. 이 '기준'의 역할을 하는 것이 Checkpoint 입니다. Checkpoint 이전까지의 WAL 로그는 모두 물리적 디스크에 존재한다고 확인했기 때문에 Checkpoint 이후의 WAL 로그를 이용하여 복구를 진행할 수 있습니다.
profile
DB Engineer

0개의 댓글