본문 바로가기
엑셈 경쟁력/DB 인사이드

DB 인사이드 | PostgreSQL Architecture - 2. Physical Structure

by EXEM 2022. 4. 27.

Physical Structure

본 문서에서는 Data 파일, Engine Log 파일, Configuration 파일 등 PostgreSQL이 관리하는 다양한 파일과 디렉토리에 대한 내용을 다루도록 하겠습니다. 해당 파일 및 디렉토리들은 PGDATA라고 하는 Database Cluster의 data 디렉토리에 위치하고 있습니다. PGDATA의 일반적인 위치는 /var/lib/pgsql/13/data 이며 해당 경로는 설치 방법에 따라 변경 수 있습니다.

 

📌 Database 및 Cluster 등에 관한 내용은 Logical Structure 내용을 참조바랍니다.

Data Directory 구조(PGDATA)

 

일반적으로 Database Cluster의 구성요소는 data 디렉토리 하위에 위치하고 있습니다. Database Cluster 초기화(initDB)시 지정된 위치에 data 디렉토리가 생성되며, 해당 디렉토리 밑으로 다양한 디렉토리 및 파일이 추가됩니다.

 

$ pwd
/var/lib/pgsql/13/data
$ ls
base              pg_logical    pg_stat_tmp  postgresql.auto.conf
current_logfiles  pg_multixact  pg_subtrans  postgresql.conf
global            pg_notify     pg_tblspc    postmaster.opts
log               pg_replslot   pg_twophase  postmaster.pid
pg_commit_ts      pg_serial     PG_VERSION
pg_dynshmem       pg_snapshots  pg_wal
pg_ident.conf     pg_stat       pg_xact

본 문서에서는 편의에 따라 data 디렉토리를 ①Data 영역, ②Log 영역, ③Configuration영역, ④기타 영역으로 나누고 이 중 ①~③에 대해 알아보도록 하겠습니다.

Data 영역

Data 영역은 실제 사용자 데이터가 저장되는 공간으로 ①Database Cluster 관련 Data가 저장되는 global 디렉토리②사용자 데이터(테이블, 인덱스 등)가 저장되는 base 디렉토리, ③Tablespace 정보가 저장되는 pg_tblspc 디렉토리로 구분할 수 있습니다.

 

Global Directory

global 디렉토리란 PostgreSQL 초기 설치 시(InitDB) 생성되는 Default Global Tablespace 디렉토리로, pg_global Tablespace라고도 부릅니다. 해당 공간에는 PostgreSQL Cluster 하위의 Database들이 서로 공유하는 정보가 저장되어 있습니다. global 디렉토리에는 아래와 같은 4가지 종류의 파일이 있습니다.

 

$ pwd
/var/lib/pgsql/13/data/global

$ ls
1213      1233      1262      2671  2698  3592  4178  6000        pg_filenode.map
1213_fsm  1260      1262_fsm  2672  2846  3593  4181  6001        pg_internal.init
1213_vm   1260_fsm  1262_vm   2676  2847  4060  4182  6002
1214      1260_vm   2396      2677  2964  4061  4183  6100
1214_fsm  1261      2396_fsm  2694  2965  4175  4184  6114
1214_vm   1261_fsm  2396_vm   2695  2966  4176  4185  6115
1232      1261_vm   2397      2697  2967  4177  4186  pg_control

 

  • pg_internal.init, pg_filenode.map
    • Database 내에 존재하는 Object의 속성 정보 및 실제 해당 Object 들의 정보, Data 파일과의 Mapping 정보가 포함됩니다.
  • pg_control
    • Database 운영에 필요한 메타정보를 가지고 있는 파일로 Oracle의 Control 파일과 유사합니다. pg_controldata 유틸리티를 통해 파일의 내용을 확인할 수 있습니다.
  • 기타 숫자 파일들
    • Tablespace, Database, Role과 같이 여러 Database가 공통으로 사용하는 Data를 가지고 있는 파일입니다. 아래표는 대표적인 OID(Object ID)와 테이블명을 Mapping한 내용입니다.

Base Directory

base 디렉토리 역시 PostgreSQL 초기 설치 시(initDB) 생성되는 Default Tablespace 디렉토리 중 하나로 pg_default Tablespace라고도 부릅니다. 이곳에는 Database내에 있는 테이블, 인덱스, 함수와 같은 Object가 실제로 저장되는 공간이며, 저장경로는 $PGDATA/base/{database_OID}/{object_id} 순으로 구성됩니다.

즉, base 디렉토리 하위에는 Database OID를 이름으로 갖는 디렉토리들이 존재하며, 각각의 Database 디렉토리에 실제 Object관련 파일들이 위치합니다.

$ pwd
/var/lib/pgsql/13/data/base

$ ls
1  13413  13414  16402

$ oid2name -U postgres
All databases:
    Oid  Database Name  Tablespace
----------------------------------
  16402         TEST01  pg_default
  16405         TEST02       tbs01
  16406         TEST03       tbs01
  13414       postgres  pg_default
  13413      template0  pg_default
      1      template1  pg_default
📌 oid2name Utility는 pg_class 테이블과 pg_relation_filepath 함수를 통해 데이터베이스명, 테이블명의 확인이 가능합니다.

pg_tblspc Directory

PostgreSQL의 Tablespace 정보를 저장하는 공간입니다. data 디렉토리가 아닌 다른 특정 디렉토리를 지정하여 Tablespace를 생성하면, 해당 디렉토리의 경로가 pg_tblspc 디렉토리에 생성된 심볼릭 링크를 통해 연결됩니다.

# 테이블스페이스 생성 (## 2021-12-02 추가)
postgres=# CREATE TABLESPACE tbs01 LOCATION /pg_tbs ;

$ pwd
/var/lib/postgresql/13/main/pg_tblspc

$ ls -l
lrwxrwxrwx  1 postgres postgres    7 Nov 22 15:55 16404 -> /pg_tbs

$ cd /var/lib/postgresql/13/main/pg_tblspc/16404/PG_13_202007201
$ ls -l
drwx------ 2 postgres postgres 4096 Nov 23 10:45 16405
drwx------ 2 postgres postgres 4096 Nov 23 10:45 16406

Log 영역

pg_wal Directory

  • Oracle의 Redo Log 와 같은 역할을 수행하는 WAL 파일을 저장하는 공간입니다.
  • 일반적으로 Database 비정상 종료 시 복구 용도로 사용되며 추가적으로 Replication 기능을 사용할 때 사용됩니다.
  • PostgreSQL 9.6버전까지는 디렉토리 명이 pg_xlog였지만, PostgreSQL 10버전부터 pg_wal로 변경되었습니다.
📌 postgresql.conf 의 "WRITE-AHEAD LOG" 부분 파라미터를 수정하여 사용합니다.

Log Directory

  • Oracle의 Alert Log와 유사하며 Database 운영 중 발생하는 특이사항들을 기록하는 공간입니다.
  • PostgreSQL 9.6버전까지는 디렉토리 명이 pg_log였지만, PostgreSQL 10버전부터 log로 변경되었습니다.
📌 postgresql.conf 의 "REPORTING AND LOGGING" 부분 파라미터를 수정하여 사용합니다.

Configuration 영역

PG_VERSION

PostgreSQL Database 버전 정보(Major Number)를 표시합니다. 파일 안에 기술된 내용과 PostgreSQL 엔진 버전이 동일해야만 PostgreSQL이 기동됩니다. 아래 두 가지 경우에 대해서는 PostgreSQL이 기동 되지 않습니다.

  • PG_VERSION 파일이 존재하지 않을 경우
  • PostgreSQL Database 버전과 파일에 기술된 버전이 다른 경우

pg_hba.conf

PostgreSQL의 인증시스템 관련 정보를 담고 있는 파일입니다. PostgreSQL에 접근하는 Host나 Host의 Data 전송방식, 암호화 전송방식에 대한 설정을 할 수 있습니다. pg_hba.conf 내용을 변경한 후에는 PostgreSQL 재기동을 해야 적용됩니다.

 

📌 pg_hba의 HBA는 Host-Based Authentication의 약자로 호스트 기반 인증을 말합니다. 보다 자세한 설명은
pg_hba.conf 페이지 참고하시면 됩니다.

postgresql.conf

  • PostgreSQL Database의 환경설정 파일입니다. Oracle의 pfile과 비슷한 역할을 수행합니다.
  • PostgreSQL 12버전부터 recovery.conf 파일이 해당 파일로 일원화 되었습니다. (기존 버전에서는 필요 시 recovery.conf 구성 필요)
📌 파라미터 별 자세한 설명은 postgresql.conf 페이지 참고하시면 됩니다.

postgresql.auto.conf

  • postgresql.auto.conf는 사용자가 직접 수정하는 용도가 아니며, alter system 명령어를 통해 변경한 내용들이 저장되는 파일입니다.
  • 변경된 정보는 pg_reload_conf() 함수 또는 pg_ctl reload 명령어를 사용해야 실제로 적용이 가능합니다. 단, DB를 재시작을 해야 적용되는 파라미터도 존재합니다.
  • alter system reset 또는 alter system reset all 구문을 사용하면 변경된 내용을 초기화 할 수 있으며, 기존 설정 내용은 해당 파일에서 삭제됩니다.

postmaster.pid

  • postmaster 프로세스의 PID, Data Path, 시작시간 및 Port 정보를 저장하며 기동 중에만 존재합니다.

 

 

 

 

기획 및 글 | 기술기획팀

이미지 제작 | 디자인그룹 이민석

 

 

 

댓글