2. DBMS이야기/01. PostgreSQL

[Admin] 1.Architecture : Data Cluster

OSSW(Open Source System SoftWare 2014. 5. 22. 20:49

1. Architecture(Data Cluster) : Overview

 

 

 

 

2. PPAS 엔진영역

 

 ㅇ 엔진 영역 : .../PostgresPlus/9.2AS/, $EDBHOME

    bin : PPAS 운영에 필요하여 제공된 실행 파일 존재

    connectors : 개발환경 별 필요한 연결 드라이브와 파일 존재

    ③ doc : PPASSub 프로그램과 확장 모듈에 대한 설명서 파일 존재

    etc : pgpool 환경 설정 파일과 마이그레이션 도구 runMTK 툴 환경 설정 파일 존재

    ⑤ include : C언어 소스 컴파일에 필요한 헤더 파일 존재

    ⑥ installer : PPAS 엔진 설치 후 부가 설치 스크립트 파일 존재

    jre : jvm환경에서 실행되는 프로그램(xdb-replication, runMTK )을 위한 jre 패키지 설치 파일 존재

    ⑧ lib : 동적 라이브러리들과 C언어 개발에 필요한 정적 라이브러리 파일 존재

    ⑨ scripts : PPAS 설치 시 필요한 스크립트 파일 존재

    ⑩ share : 확장 모듈 초기화 스크립트 파일 존재

    stackbuilderplus : DB 엔진과 각종 부가 패키지 설치 및 업그레이드를 관리하는 Stackbuilder 존재

 

  ※ $EDBHOME 환경변수 설정 파일 : pgplus_env.sh로 정의

[enterprisedb@myOllehDB1 ~]$ cat /postgres/9.2AS/pgplus_env.sh

....

# Environment

export PATH=/postgres/9.2AS/bin:$PATH

export EDBHOME=/postgres/9.2AS

export PGDATA=/data/myOllehDB

export PGDATABASE=edb

# export PGUSER=enterprisedb

export PGPORT=5444

export PGLOCALEDIR=/postgres/9.2AS/share/locale

 

 

 

3. Data Cluster 구조도

 

경로 : .../PostgrePlus/9.0AS/data/, $PGDATA

  - PPAS의 데이터를 저장하는 공간, $PGDATA 디렉토리 (백업대상인 영역)

 

 

 

3. Data Cluster 확인방법과 PG_VERSION

 

 위치 확인 방법

 

   • Dictionary 정보 조회

edb=# show data_directory;

 /data/myOllehDB

 

 

  • OS상에서 edb-postgres 프로세스 실행 옵션 중간의 -D 옵션 확인

[enterprisedb@myOllehDB1 myOllehDB]$ ps -ef | grep edb-postgres

502       6478 16659  0 18:05 pts/2    00:00:00 grep edb-postgres

502      28459     1  0  2013 ?        00:21:36 /postgres/9.2AS/bin/edb-postgres -D /data/myOllehDB -i -k /tmp -p 5444

 

  • OS상에서 $PGDATA/PG_VERSION 파일 확인

[enterprisedb@myOllehDB1 /]$ find ./ -name PG_VERSION

...

./data/myOllehDB/PG_VERSION

 

 PG_VERSION : PostgreSQL의 주요 버전 번호를 보유하는 파일

[enterprisedb@myOllehDB1 /]$ find ./ -name PG_VERSION

...

./data/myOllehDB/PG_VERSION

 

 

4. Data and Log Files

 

 

① global : pg_database 에 기록된 클러스터의 모든 데이터베이스에서 공유하는 카탈로그 테이블 존재, pg_global 테이블스페이스 경로

    - pg_control 파일 : Data Cluster의 컨트롤 정보 저장 (버전, 트랜잭션, 체크포인트, 백업, 데이터 블록 크기, 트랜잭션 로그 크기 )

 [enterprisedb@myOllehDB1 bin]$ $PGDATA/bin/pg_controldata    #pg_controldata [dir] : $PGDATA 하위 디렉토리에 대한 정보 출력

pg_control version number:            922

Catalog version number:               201204301

Database system identifier:           5896984738662375033

Database cluster state:               in production

pg_control last modified:             Wed 08 Jan 2014 11:20:52 AM KST

Latest checkpoint location:           2C/58422478

Prior checkpoint location:            2C/583CA9A8

Latest checkpoint's REDO location:    2C/58422478

Latest checkpoint's TimeLineID:       1

Latest checkpoint's full_page_writes: on

Latest checkpoint's NextXID:          0/2019363

Latest checkpoint's NextOID:          76106

Latest checkpoint's NextMultiXactId:  1

Latest checkpoint's NextMultiOffset:  0

Latest checkpoint's oldestXID:        1860

Latest checkpoint's oldestXID's DB:   1

Latest checkpoint's oldestActiveXID:  0

Time of latest checkpoint:            Wed 08 Jan 2014 11:20:45 AM KST

Minimum recovery ending location:     0/0

Backup start location:                0/0

Backup end location:                  0/0

End-of-backup record required:        no

Current wal_level setting:            archive

Current max_connections setting:      1800

Current max_prepared_xacts setting:   0

Current max_locks_per_xact setting:   64

Maximum data alignment:               8

Database block size:                  8192

Blocks per segment of large relation: 131072

WAL block size:                       8192

Bytes per WAL segment:                16777216

Maximum length of identifiers:        64

Maximum columns in an index:          32

Maximum size of a TOAST chunk:        1996

Date/time type storage:               64-bit integers

Float4 argument passing:              by value

Float8 argument passing:              by value

 

   - pg_internal.init, pg_filenode.map 파일 : 객체들의 속성 및 실제 파일의 맵핑 정보 저장

   - pg_tablespace(테이블스페이스), pg_database(데이터베이스), pg_auth_members(DB사용자 및 Role 그룹), pg_authid(DB사용자 및 Role)

     : 모든 DB에서 공통으로 참조하는 전역 객체들의 데이터와 인덱스 파일

 [enterprisedb@myOllehDB1 global]$ psql -U enterprisedb

Password for user enterprisedb:

psql (9.2.4.8)

Type "help" for help.

edb=# select pg_relation_filepath('pg_authid');

 pg_relation_filepath

----------------------

 global/13739

(1 row)

[enterprisedb@myOllehDB1 ~]$ cd $PGDATA/global

[enterprisedb@myOllehDB1 global]$ ls -l

total 1136

-rw------- 1 enterprisedb enterprisedb   8192 Jan  6 09:15 13739

-rw------- 1 enterprisedb enterprisedb  24576 Jul  5  2013 13739_fsm

-rw------- 1 enterprisedb enterprisedb   8192 Jul  5  2013 13739_vm

 

 

 

 

 ② base :  데이터베이스별 하위 디렉토리 보유, 디렉토리 별 테이블과 인덱스 파일 생성, pg_default 테이블스페이스 경로

    - 저장규칙 : $PGDATA/base/{database_oid}/{object_id}

      (database_oid : pg_database테이블의 oid를 통해 확인 / object_id : pg_class테이블의 oid를 통해 확인) 

    - 한 개 테이블이 1GB 이상일 경우 : 1GB 단위로 파일 분리하여 저장 (object_filenode.1, object_filenode.2, ...)

    - _fsm 파일 : Free Space Map, 블록의 빈 공간 정보 보관, vacuum DML 작업 시 사용 (vacuum 작업 후 생성, 근본 유발요인은 아님)

    - _vm 파일 : Visibility Map, 실제 사용하는 데이터 정보 보관, select full sequence scan 시 사용 (vacuum 작업 후 생성, 근본 유발요인은 아님)

    - t로 시작하는 파일 : Temp, 임시 테이블 파일

    - pg_version 파일 : 'OS버전 - Bit정보 - DB엔진 메이저 버전' 정보를 갖는 파일 (OSDB간의 호환성 확인)

    - pg_filenode.map, pg_internal.init 파일 : 앞장의 global 디렉토리 설명 참조

    - pg_database_size('<DB>') 함수를 통한 해당영역 크기 확인 가능 (temp 파일 때문에 매번 달라질 수 있음)

 postgres=# select pg_database_size('edb');

 pg_database_size

------------------

          9111256

(1 row)

 

DatabaseObject 확인

[enterprisedb@myOllehDB1 base]$ cd $PGDATA/base

[enterprisedb@myOllehDB1 base]$ ls -l

total 72

drwx------ 2 enterprisedb enterprisedb 12288 Nov 24 00:09 1

drwx------ 2 enterprisedb enterprisedb 12288 Jul  5  2013 14077

drwx------ 2 enterprisedb enterprisedb 12288 Nov 24 00:10 14082

drwx------ 2 enterprisedb enterprisedb 12288 Jan  7 11:31 14083

drwx------ 2 enterprisedb enterprisedb 20480 Jan  7 11:30 16394

drwx------ 2 enterprisedb enterprisedb  4096 Jan  7 04:05 pgsql_tmp

[enterprisedb@myOllehDB1 base]$ psql -U enterprisedb

Password:

psql (9.2.4.8)

Type "help" for help.

edb=# select a.datname, a.datdba, b.rolname

         from pg_database a, pg_authid b

         where a.oid = 14082

             and a.datdba = b.oid;

 datname  | datdba |   rolname   

----------+--------+--------------

 postgres |     10 | enterprisedb

(1 row)

edb=# /q

 

[enterprisedb@myOllehDB1 base]$ cd 14082

[enterprisedb@myOllehDB1 14082]$ ls -l

total 8748

-rw------- 1 enterprisedb enterprisedb   8192 Jul  5  2013 13351

-rw------- 1 enterprisedb enterprisedb   8192 Jul  5  2013 13624

....

[enterprisedb@myOllehDB1 base]$ psql -U enterprisedb

Password:

psql (9.2.4.8)

Type "help" for help.

edb=# \c postgres

You are now connected to database "postgres" as user "enterprisedb".

postgres=# select oid, relowner, relname, reltype

                 from pg_class

                 where relfilenode = 13351;

  oid  | relowner |       relname        | reltype

-------+----------+----------------------+---------

 13351 |       10 | plsql_profiler_runid |   13352

(1 row)

postgres=# select pg_relation_filepath('plsql_profiler_runid');

 pg_relation_filepath

----------------------

 base/14082/13351

(1 row)

 

 

 ③ pg_xlog : 실제 트랜잭션 정보를 담은 LOG 파일 존재

    - DB 비정상 종료 시 복구를 위해 사용되며 아카이빙을 통해 별도 보관

    - 트랜잭션 로그의 개수는 checkpoint_segments 환경 설정 값의 3 배 정도 (용량은 초기값 기준 3GB)

    - 심볼릭 링크 파일을 생성하여 실제로는 별도 디렉토리에 트랜잭션 파일 저장 권장 (백업 시 제외 등 운영상 이점을 위함)

  pg_clog : 트랜잭션 커밋 정보를 담은 여러 파일 존재 (2bit 단위로 저장)
                  
autovacuum_freeze_max_age 설정을 통해 파일 최대값 설정 가능

  pg_notify : NOTIFY로 정의된 각 세션 별 이벤트 기록

                    (LISTEN, NOTIFY SQL명령을 통해 감지 처리)

  pg_stat_tmp : 통계 서브시스템을 위해 통계 수집기가 사용하는 임시용 파일 저장

  pg_tblspc : 테이블스페이스의 심볼릭 링크 보관

      - 심볼릭 링크 파일을 생성하여 실제로는 별도 디렉토리에 저장 권장

      - 기본 테이블스페이스인 pg_defualt, pg_blobal은 별도 저장

      ※ PPAS에서의 Tablespace : 용도 별 구분을 위해서 사용하기도 하지만데이터 클러스터의 공간이 부족할 경우 한 개의 PPAS서버가 사용할 수 있는 별도의 파일시스템 지정 가능

  pg_multixact : Shared Row Lock 처리를 위한 멀티 트랜잭션 상태 값 정보 저장

  pg_serial : 커밋된 Serializable 트랜잭션 상태 정보 저장

  pg_subtrans : Sub 트랜잭션 상태 정보 저장

  pg_twophase : 2단계 커밋 또는 prepared 트랜잭션 상태 정보 저장

  pg_snapshots : 내보내기 된 트랜잭션 스냅 저장

 

 

5. Configuration and Lock Files

 

 

ㅇ Configuration Files

    postgresql.conf : DBMS 실행 환경 설정 파일

                             파일 Reload 혹은 DB재기동을 통한 각종 설정 값 변경적용 가능

    pg_hba.conf : 클라이언트 접속 허용/제한에 대한 제어 파일

    pg_ident.conf

 

 Lock Files

    postmaster.pid : Postmaster 프로세스가 역할 수행을 위해 필요한 정보 저장

        - Postmaster Process ID(PID), Cluster Data Directory 경로, Postermaster 기동 시간, Port 번호, Unix-Domain Socket Directory 경로(윈도우의 경우 빈 란), First Valid Listen_address (IP), Shared Memory Segment ID 등 서버가 실행되고 있을 시 해당 파일 생성 (Shutdown 시 파일 미 존재, pg_ctl은 해당 파일 존재여부로 서버 기동여부 확인)

 

    postmaster.opts : 마지막으로 서버를 시작할 때 명령 줄 옵션 및 상태 기록

[enterprisedb@myOllehDB1 myOllehDB]$ cat $PGDATA/postmaster.opts

/postgres/9.2AS/bin/edb-postgres "-D" "/data/myOllehDB" "-i" "-k" "/tmp" "-p" "5444"

[enterprisedb@myOllehDB1 myOllehDB]$ pg_ctl status

pg_ctl: server is running (PID: 28459)

/postgres/9.2AS/bin/edb-postgres "-D" "/data/myOllehDB" "-i" "-k" "/tmp" "-p" "5444"

 

 

 

 

by. 이은석 (2014.05.22)