본문 바로가기

Database/PostgreSQL

처음 사용자를 위한 PostgreSQL 사용 샘플 - 1. PostgreSQL 이란?

"처음 사용자를 위한 PostgreSQL 사용 샘플" 이라는 제목의 시리즈로, 저처럼 PostgreSQL을 처음 접하는 사용자를 위한 기본적인 개념, 사용 샘플을 설명드립니다.

 

아래 자료를 참조했습니다.

PostgreSQL Domcumentation
The Internals of PostgreSQL
PostgreSQL Tutorial

PostgreSQL 이란?

PostgreSQL은 1986년 University of California (Berkeley) 에서 "POSTGRES" 프로젝트의 일환으로 시작한 오픈소스 멀티모델 데이터베이스로 관계형 데이터베이스(RDBMS)입니다. 리눅스, 윈도우즈, macOS, BSD, Solaris 등의 운영 체제를 지원하고 2001년부터는 ACID를 준수합니다. Open Source 라이선스로서 자유롭게 사용, 복제, 배포 수정 할 수 있으며, 소스코드가 공개된 소프트웨어입니다. (참조. Open Source Initiative

PostgreSQL을 기반으로 기능을 확장한 데이터베이스들이 많이 있습니다. Postgres-XC/XL (active/active clusters), PostGIS (Spatial), TimeScaleDB (TimeSeries), Citus Data (Columnar), Amazon Aurora/RDS (OLTP), Amazon Redshift (DW), Greenplum (DW), Vertica (Columnar), and EnterpriseDB (OLTP) 등이 여기에 해당합니다.

 

PostgreSQL Architecture

Process Architecture

PostgreSQL은 클라이언트/서버 모델을 사용합니다. PostgreSQL 세션은 다음과 같은 프로세스(프로그램)로 구성됩니다.

서버 프로세스: 데이터베이스 클러스터 관리와 관련된 모든 프로세스의 부모 프로세스입니다. 백엔드 (backend) 프로세스는 연결된 클라이언트가 발행하는 쿼리 및 구문을 처리하는 역할을 합니다. 백그라운드 (background) 프로세스는 VACUUM, CHECKPOINT 같은 데이터베이스 관리를 위한 각 기능을 수행하는 프로세스입니다.


클라이언트 어플리케이션: 데이터베이스 작업을 수행하려는 사용자의 클라이언트(프론트엔드) 어플리케이션입니다. 클라이언트 어플리케이션은 본질적으로 매우 다양할 수 있습니다. 텍스트 기반 또는 그래픽 기반 툴, 웹 서버, 기타 데이터베이스 관리 툴 등 다양한 클라이언트 어플리케이션이 있습니다. 일부 클라이언트 어플리케이션은 PostgreSQL 배포와 함께 제공되는데, 이 경우 대부분 사용자들이 개발한 것들입니다.


클라이언트/서버 어플리케이션의 일반적인 경우와 마찬가지로 클라이언트와 서버는 다른 호스트에 있을 수 있습니다. 이 경우 TCP/IP 네트웍 연결을 통해 통신합니다.


PostgreSQL 서버는 클라이언트의 여러 동시 연결을 처리할 수 있습니다. 이를 위해 각 연결에 대해 새로운 프로세스를 시작("fork") 하고, 이때부터는 클라이언트와 새로운 서버 프로세스가 원래 postgres 프로세스의 개입 없이 통신합니다. 따라서 관리 서버 프로세스는 항상 실행 중이며 클라이언트 연결을 기다리는 반면, 클라이언트 및 관련 서버 프로세스는 계속 생성되었다 정리되었다합니다. 아래는 PostgreSQL start 후, 서버 프로세스입니다.

 

각 서버 백그라운드 프로세스는 다음과 같은 역할을 수행합니다.

프로세스 기능
background writer shared buffer pool의 dirty page를 HDD, SSD와 같은 persistent storage에 주기적으로 기록. 9.1 이전 버전에서는 checkpointer가 해당 역할을 수행
checkpointer 9.2 이상 버전부터 checkpoint 수행
autovacuum launcher vacuum 처리를 위해 주기적으로 autovacuum-worker 프로세스 생성을 postgres server에 요청
WAL writer persistent storage에 WAL buffer 상의 WAL 데이터를 주기적으로 기록 및 flush
statistics collector pg_stat_activity, pg_stat_database와 같은 통계정보를 수집
logging collector (logger) 에러 메세지를 로그 파일에 기록
achiver archiving logging 실행

 

Memory Architecture

PostgreSQL의 메모리 아키텍처는 두 영역으로 나눌 수 있습니다.

 

로컬 메모리 영역: 각 backend 프로세스가 자신이 사용하기 위해 할당한 메모리 영역

공유 메모리 영역: PostgreSQL 서버의 모든 프로세스가 사용하는 메모리 영역

 

로컬 메모리 주요 영역의 기능은 다음과 같습니다. 

프로세스 기능
work_mem ORDER BY, DISTINCT 같은 정렬 작업과 Merge 조인, Hash 조인 같은 조인 작업을 위한 영역
maintenance_work_mem VACUUM, REINDEX 같은 관리 작업을 위한 메모리 영역
temp_buffers 임시 테이블 저장을 위해 사용되는 영역

 

공유 메모리 주요 영역의 기능은 다음과 같습니다.

프로세스 기능
shared_buffer_pool persistent storage에 있는 테이블과 인덱스 페이지를 로드하여 처리하는 메모리 영역
WAL buffer 서버 장애 시 데이터 손실을 막기 위해 PostgreSQL은 WAL 메커니즘을 사용. WAL 데이터 (XLOG 레코드)는 PostgreSQL의 트랜잭션 로그로서 WAL buffer는 WAL 데이터를 persistent storage에 쓰기 전 버퍼링하는 영역
commit log CommitLOG (CLOG)에 Concurrency Control (CC) 메커니즘 작동을 위해 모든 트랜잭션의 상태를 유지

 

EnterpriseDB (EDB) ?

PostgreSQL을 기반으로한 소프트웨어, 서비스 제공 벤더입니다. 2004년 설립되었고 사모투자펀드 Great Hill Partners가 2019년 6월 EDB 인수했습니다. 두가지 버전의 온프레미스 EDB Postgres 제공합니다. 먼저 커뮤니티 오픈소스 버전의 PostgreSQL로 EDB가 배포하고 있습니다. 또 하나는 Postgres Advanced Server로서 오라클의 기능, 오라클 데이터베이스 호환성, 성능 관련 기능이 추가된 상업용 EDB 제품입니다. 데이터 로더, Index Advisor, DynaTune, SQL 대기상태 통계, 빌트인 함수 패키지, 소프트웨어 업데이트 모니터, 엔터프라이즈 모니터링 도구, SQL Performance Profiler, SQL Injection 공격 보호, 데이터베이스 마이그레이션 툴킷, 오라클 및 SQL Server와의 이기종 복제 등의 기능을 가지고 있습니다.