[PostgreSQL] : 01. PostgreSQL 이란?


서론

  • 오래만에 포스팅을 할려고 한다. 이번에 회사 업무 상 Postgresql을 하게 되어서 이번 기회에 정리할겸 포스팅을 작성할려고 한다.

01. PostgreSQL 이란?

1) PostgreSQL

image-center

[참고:https://www.postgresql.org]


  • PostgreSQL은 1996년에 출시된 오픈소스 ORDBMS로써 MIT 라이센스와 같은 라이센스를 가진다. Oracle, Mysql 와 같은 RDBMS로 꾸준히 사용량이 증가하여 현재 4위 정도의 사용량을 가지고 있다. 특기 무료인 Mysql과 비교가 많이 되는데 SQL 표준을 잘 지원하고 쿼리 성능이 좋은 걸로 알려져 있다. 특히 북미와 일본에서 높은 사용량을 가지고 있다.

  • PostgreSQL은 Ingres(INteractive Graphics Retrieval System)을 시초라고 하라고 할 수 있는데, Ingres는 현재도 활동중인 Michael Stonebraker가 시작한 프로젝트이다. 이 Ingres는 1977년 미국 버틀리대학에서 시작했으며 이를 Postgres(Post-Ingres)라는 후속 프로젝트로 이어졌다. 현재 기준(2024-02)으로는 16버전까지 나왔다.

  • PostgreSQL의 로그는 ‘Slonik’이라는 이름을 가지는 코끼리 이며, 이는 Hadoop과 Evernote에 영향을 끼쳤다.

02. PostgreSQL vs Oracle

  • RDBMS의 기준은 보통은 Oracle이다. 이는 Oracle이 구조적으로 성능적으로 제일 발전해 있기 떄문이다. 하지만 최근에 들어서는 오픈소스 DB(PostgreSQL, Mysql)들이 성능과 안정성이 많이 올라와 Oracle의 라이센스 가격으로 인해 오픈소스 DB들이 각광을 받고 있다. 그래서 PostgreSQL과 Oracle과 몇 가지 부분을 비교하고자 한다.

  • Postgrel SQL Architecture image-center

[Excem]


  • Oracle Architecture image-center
[http://pafumi.net/]


  • PostgreSQL과 Oracle 비교
    • RDBMS들의 구조는 결국에는 비슷한 구조를 띄게 되어 있다. 이는 데이터를 효과적으로 관리하기 위해 연구를 통해 비슷한 구조를 가지게 되었다. 그래도 각 솔루션 마다 차이가 있는데 이를 비교하여 PostgreSQL과 Oracle을 매핑하면 아래와 같다.

1) Shared Memory vs SGA
- PostgreSQL에서 Shraed Memorhs는 트랜잭션 및 다른 로그 캐치용으로 할당 된 시스템 공통 메모리 영역으로 시스템에서 공통적으로 사용하는 영역이다. 이를 Oracle에서는 SGA라고 한다.

2) Shared Buffers vs Database Buffer Cache
- 물리적인 DISK에 저장되어 있는 데이터를 임시로 적재하는 공간으로 “사용자 요청 -> Shared Buffers에서 찾음 있으면 바로 반환 -> Shared Buffers에 없으면 DISK에서 데이터를 찾아 Shared Buffers에 적하고 반환” 이와 같은 프로세스에 이용이 된다. 실제 데이터가 적재되고 활용되는 공간이기 떄문에 필수 적인 공간이다.

3) WAL Buffers vs Redo Log Buffer
- 데이터 변경에 따른 로그를 저장하는 버퍼로써 Database에서 발생하는 모든 변화를 물리적인 log file에 저장하기 전에 임시로 저장하는 메모리 공간이다. PostgreSQL에서는 이 로그를 WAL(Wirte Ahead Log)라고 하며 이를 관리하는 공간을 WAL Buffers라고 한다. 오라클에서는 Redo log라고 하며 이를 관리하는 공간을 Redo Log BUffer라고 한다.

4) Writer vs DBWR
- Shared Buffers와 Database Buffer Cache에 임시 저장된 데이터를 실제 물리적인 데이터 파일에 저장하는 백그라운드 프로세스로 이때 저장 단위는 Page/Block 단위이다. 이 말의 의미는 한 row가 수정되었어도 해당 Tuple/row가 수정된 page/block 단위로 저장된다는 것이다. Writer와 DBWR는 주기적으로 혹은 Checkpoint/commit라는 이벤트 발생 시 물리적인 데이터 파일에 데이터를 쓰는 역활을 한다.

5) WAL Writer vs LGWR
- WAL Writer와 LGWR은 WAL Buffers와 Redo Log Buffer에 있는 로그를 실제 물리적인 파일인 WAL files와 Redo Log Files에 쓰는 역할을 하는 백그라운드 프로세서 이다.

6) Work Memory vs PGA
- 위에 아키텍처에는 안 나와 있지만 이 부분은 중요한 부분이라서 따로 설명하고자 한다. Work Memory와 PGA는 실제 사용자가 작업하는 공간으로써 해당 공간은 내부 정렬, 해시, DISTINCT, 조인 등의 작업을 하게 된다. Work Memory의 기본값은 4MB으로써 설정은 1/(max_connections * 2)로 설정하는 것이 적당하다.

  • 용어 비교
    • PostgreSQL과 Oracle은 기본적인 용어에서도 차이가 있다. 비교하면 아래와 같다.
  • Table or Index
    • PostgreSQL : Relaction
    • Oracle : Table or Index
  • Row
    • PostgreSQL : Tuple
    • Oracle : Row
  • Column
    • PostgreSQL : Attribute
    • Oracle : Column
  • Data Blokc
    • PostgreSQL : Page(on Disk)
    • Oracle : Data Block
  • Page
    • PostgreSQL : Buffer(in Memory)
    • Oracle : Page
  • Rowid
    • PostgreSQL : Ctid
    • Oracle : Rowid

03. PostgreSQL 특성

  • PostgreSQL에서 몇가지 특성이 있는데 이를 설명하고자 한다. 대표적으로 Vacuum와 Wraparound가 있는데 이를 설명하고자 한다.

  • Vacuum
    • Vacuum은 진공, 진공청소기라는 단어로써 PostgreSQL에서도 진공청소기와 같은 역할은 한다. 자바 개발자로써 익숙한 GC(Garbage Collector)와 비슷한 기능을 하며, PostgreSQL에서 MVCC(Multi-Version Concurrency Controll) 구현 방법의 특성 떄문에 발생한 문제를 해결하기 위해서 사용된다. Vacuum은 아래와 같은 4가지 작업을 수행한다.
    • 임계치 이상으로 발생한 Daed Tuple을 정리하여 FSM(Free Space Map)으로 반환
    • Transaction ID Wraparound 방지
    • 통계정보 갱신
    • visibility mapd르 갱신하여 index scan 성능 향상
  • PostgreSQL의 MVCC
    • MVCC(Multi-Version Concurrency Controll)는 DBMS에서 동시성 향상을 위해서 사용하는 기능으로 동시에 여러 트랜잭션이 수행되는 환경에서 각 트랜잭션 쿼리 수행 시점의 데이터를 읽기 일관성을 보장하고 read/write간의 충돌 및 lock을 방지하는 것이다. 이를 통해서 동시성을 향상 시킬 수 있다.
    • PostgreSQL에서 MVCC는 데이터 페이지 내에 변경되기 이전 Tuple과 변경되 신규 Tuple을 같은 page에 저장하고 Tuple 별로 생성된 시점을 기록 및 비교하는 방식으로 MVCC를 제공한다. 이때문에 Dead Tuple이 발생한다. Dead Tuple은 위 과정을 통해 update가 완료되어 기존 원본 데이터를 저장한 Tuple 어디에도 참조되지 않는 Tuple을 의미한다.
  • Wraparound
    • Wraparound은 Transaction ID Wraparound라고도 불리며 이는 PostgreSQL에서 Vacuum없이 가용할 수 있는 Transaction id 수가 20~21억개가 넘어가는 경우 Transaction id가 다시 처음부터 순서할 수 있게 로테이션 처리를 해야된다. 이를 Transaction ID Wraparound라고 하며 이 역활을 Vacuum에서 한다. 이 Transaction ID Wraparound를 발생하는 임계치를 설정할 수 있는데 보통은 10억으로 권장하고 있다.

03. 장/단점

  • 장점
    • 최대 장점은 무료라는 점이다. Oracle의 비싼 라이센스 비용을 감당 못한다면 PostgreSQL 좋은 대안으로 선택될 수 있다.
    • 가장 넓은 ANSI SQL를 지원한다.
    • MVCC를 지원한다.
    • Mysql와 비교하여 더 나은 쿼리 성능을 보인다. 이는 여러가지 논쟁이 있지만 현업에서 바라봤을때 potgresql 가 Mysql 보다 좋은 성능을 보인다는 점이다.
  • 단점
    • update 성능이 떨어진다. 위에 얘기한 MVCC 동작 방식으로 인해 Oracle에 비해서 update 성능이 떨어질수 밖에 없다.

    • 엔지니어 수 부족과 유지관리가 힘듬. 이것은 오픈소스 DB의 숙명으로 오라클에 비해서 엔지니어 수가 부족하고 관리할 수 있는 고급인력이 적다는것이다. 이로 인해 중요 시스템에는 오라클이 필수적으로 쓰이는 원인이 된다.

04. 끝마치며

  • 이번 포스팅에서는 PostgreSQL을 Oracle과 비교하여 알아보는 시간을 가졌다. 여러가지 문제점이 있지만 Mysql 써본 입장에서는 이번 PostgreSQL를 사용하여 업무를 진행한다는 점이 조금 설레인다. Mysql를 쓰면서 불편했던 부분이 postgresql는 어떤식으로 보완이 되었는지 뭐가 조금더 좋은지 안좋은지 비교할 수 있을거 같다. 다음 시간에는 Oracle에서 PostgreSQL로 이관을 조금더 쉽게 할 수 있는 Oracle to PG에 대해서 알아보도록 하겠다.

댓글남기기