<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>postgresql on LaMelD</title><link>https://lameld.github.io/tags/postgresql/</link><description>Recent content in postgresql on LaMelD</description><generator>Hugo</generator><language>ko-KR</language><lastBuildDate>Thu, 17 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://lameld.github.io/tags/postgresql/index.xml" rel="self" type="application/rss+xml"/><item><title>PostgreSQL 특징과 기능: 아키텍처, 타입, 인덱스, MariaDB와 비교</title><link>https://lameld.github.io/postgresql/features/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lameld.github.io/postgresql/features/</guid><description>&lt;h2 id="1-개요"&gt;1. 개요&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;1986년 UC 버클리 POSTGRES 프로젝트에서 출발한 객체-관계형 데이터베이스(ORDBMS). 1996년 SQL을 지원하며 PostgreSQL로 이름을 바꿨다.&lt;/li&gt;&#10;&lt;li&gt;라이선스는 PostgreSQL License(BSD/MIT 계열). 상용 이용·재배포에 제한이 없고 단일 회사가 소유하지 않는다.&lt;/li&gt;&#10;&lt;li&gt;매년 9~10월에 메이저 버전이 나오고, 각 메이저 버전은 5년간 마이너 업데이트를 받는다. 마이너 업데이트는 분기마다 나온다.&lt;/li&gt;&#10;&lt;li&gt;2026-09 기준 최신 메이저는 18이며, Ubuntu 24.04 기본 저장소는 16을 제공한다.&lt;/li&gt;&#10;&lt;li&gt;SQL 표준 준수도가 높고, 트랜잭션 DDL·MVCC·확장 시스템이 강점이다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-아키텍처"&gt;2. 아키텍처&lt;/h2&gt;&#10;&lt;h3 id="21-프로세스-구조"&gt;2.1 프로세스 구조&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;postmaster&lt;/code&gt;(postgres 메인 프로세스)가 접속마다 백엔드 프로세스를 하나씩 fork한다. 스레드가 아니라 프로세스 모델이다.&lt;/li&gt;&#10;&lt;li&gt;접속 수가 많으면 프로세스 비용이 커지므로 수백 개 이상 동시 접속에는 PgBouncer 같은 커넥션 풀러를 앞에 둔다.&lt;/li&gt;&#10;&lt;li&gt;백그라운드 프로세스:&#10;&lt;ul&gt;&#10;&lt;li&gt;checkpointer: 더티 페이지를 주기적으로 디스크에 기록&lt;/li&gt;&#10;&lt;li&gt;background writer: 버퍼를 미리 비워 백엔드의 대기를 줄임&lt;/li&gt;&#10;&lt;li&gt;WAL writer: WAL 버퍼를 디스크로 flush&lt;/li&gt;&#10;&lt;li&gt;autovacuum launcher/worker: 죽은 튜플 정리와 통계 갱신&lt;/li&gt;&#10;&lt;li&gt;stats collector(15 이전) / 공유 메모리 통계(15 이후)&lt;/li&gt;&#10;&lt;li&gt;archiver, logical replication launcher, walsender/walreceiver&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="22-메모리"&gt;2.2 메모리&lt;/h3&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;파라미터&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;역할&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;기본값&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;shared_buffers&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;디스크 페이지 캐시. 보통 RAM의 25%&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;128MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;work_mem&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;정렬·해시 작업 하나당 메모리. 쿼리·노드마다 별도 할당&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;maintenance_work_mem&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;VACUUM, CREATE INDEX 등 유지보수 작업 메모리&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;64MB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;effective_cache_size&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;플래너가 가정하는 OS 캐시 포함 총 캐시 크기(할당 아님)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4GB&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;wal_buffers&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;WAL 쓰기 버퍼&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;shared_buffers의 1/32&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="23-저장-구조와-wal"&gt;2.3 저장 구조와 WAL&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;논리 계층: 클러스터(인스턴스) &amp;gt; 데이터베이스 &amp;gt; 스키마 &amp;gt; 테이블/인덱스/뷰/함수.&lt;/li&gt;&#10;&lt;li&gt;하나의 클러스터에 여러 데이터베이스가 있지만, 한 접속은 한 데이터베이스에만 붙는다. 데이터베이스 간 조인은 &lt;code&gt;dblink&lt;/code&gt;나 &lt;code&gt;postgres_fdw&lt;/code&gt;가 필요하다.&lt;/li&gt;&#10;&lt;li&gt;테이블은 8KB 페이지(블록) 단위로 힙 파일에 저장된다. 큰 값은 TOAST로 압축·분리 저장한다.&lt;/li&gt;&#10;&lt;li&gt;WAL(Write-Ahead Log): 데이터 파일을 바꾸기 전에 변경 로그를 먼저 기록해 크래시 복구, 스트리밍 복제, PITR의 기반이 된다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="24-mvcc와-vacuum"&gt;2.4 MVCC와 VACUUM&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;다중 버전 동시성 제어(MVCC): UPDATE·DELETE는 기존 행을 덮어쓰지 않고 새 버전을 만들며, 읽기는 쓰기를 막지 않고 쓰기도 읽기를 막지 않는다.&lt;/li&gt;&#10;&lt;li&gt;오래된 행 버전(dead tuple)은 VACUUM이 회수한다. autovacuum이 자동으로 돌지만, 대량 갱신 테이블은 임계값 튜닝이 필요하다.&lt;/li&gt;&#10;&lt;li&gt;트랜잭션 ID는 32비트라서 약 20억 트랜잭션마다 wraparound를 막기 위한 freeze VACUUM이 반드시 필요하다. autovacuum을 끄면 안 되는 이유다.&lt;/li&gt;&#10;&lt;li&gt;격리 수준: Read Committed(기본), Repeatable Read, Serializable(SSI, 진짜 직렬화 보장). Read Uncommitted는 Read Committed로 동작한다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="25-클러스터-구성-단일-vs-다중"&gt;2.5 클러스터 구성: 단일 vs 다중&lt;/h3&gt;&#10;&lt;p&gt;서버 한 대에 클러스터 하나를 두고 그 안에서 database와 schema로 나누는 것이 표준 구성이다. 다중 클러스터는 특정한 이유가 있을 때만 쓴다.&lt;/p&gt;</description></item><item><title>PostgreSQL 사용법과 명령어: 설치, psql, 권한, 백업, 모니터링</title><link>https://lameld.github.io/postgresql/commands/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lameld.github.io/postgresql/commands/</guid><description>&lt;p&gt;Ubuntu 24.04 + PostgreSQL 16 기준. 다른 버전은 경로의 &lt;code&gt;16&lt;/code&gt;을 바꾼다.&lt;/p&gt;&#10;&lt;h2 id="1-설치"&gt;1. 설치&lt;/h2&gt;&#10;&lt;h3 id="11-ubuntu-기본-저장소-16"&gt;1.1 Ubuntu 기본 저장소 (16)&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install postgresql-16 &lt;span class="c1"&gt;# 서버 + contrib 모듈 포함&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install postgresql-client-16 &lt;span class="c1"&gt;# 클라이언트만 필요할 때&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;한국어 로케일 클러스터를 원하면 설치 전에 로케일을 만들고 &lt;code&gt;LANG&lt;/code&gt;을 지정한다.&lt;/p&gt;</description></item><item><title>PostgreSQL 고가용성 구성: Galera·MaxScale·ProxySQL에 대응하는 요소</title><link>https://lameld.github.io/postgresql/high-availability/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lameld.github.io/postgresql/high-availability/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;조사일: 2026-09-11&lt;/li&gt;&#10;&lt;li&gt;목적: MariaDB/MySQL의 Galera Cluster, MaxScale, ProxySQL에 대응하는 PostgreSQL HA 구성 요소를 정리한다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-결론-요약"&gt;1. 결론 요약&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;PostgreSQL 코어에는 Galera 같은 &lt;strong&gt;동기 멀티마스터가 없다.&lt;/strong&gt; 표준 HA는 &amp;ldquo;스트리밍 복제(단일 writer) + 자동 장애 조치 관리자 + 프록시&amp;rdquo; 조합이다.&lt;/li&gt;&#10;&lt;li&gt;MaxScale 하나가 하던 일(R/W 분리, 자동 failover, 커넥션 라우팅)은 PostgreSQL에서 보통 &lt;strong&gt;Patroni + HAProxy (+ PgBouncer)&lt;/strong&gt; 조합으로 나누어 하거나, &lt;strong&gt;Pgpool-II&lt;/strong&gt; 하나로 한다.&lt;/li&gt;&#10;&lt;li&gt;멀티마스터가 꼭 필요하면 논리 복제 기반 확장(pgactive, pgEdge Spock, EDB PGD)을 쓴다. 대부분 &lt;strong&gt;비동기 + 충돌 해결&lt;/strong&gt; 방식이라 Galera의 동기 인증(certification) 방식과는 성격이 다르다.&lt;/li&gt;&#10;&lt;li&gt;쿠버네티스에서는 CloudNativePG가 표준이다.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-mariadb-구성-요소와의-대응"&gt;2. MariaDB 구성 요소와의 대응&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;MariaDB / MySQL&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;역할&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;PostgreSQL 대응&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Galera Cluster&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;동기 멀티마스터, 가상 동기 복제, 자동 멤버십&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;직접 대응 없음. 가용성 면에서는 동기 스트리밍 복제 + Patroni. 다중 writer는 pgactive / pgEdge Spock / EDB PGD&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MaxScale&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;R/W 분리, 자동 failover, 커넥션 라우팅, 필터&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Pgpool-II (단일 도구) 또는 Patroni + HAProxy + PgBouncer (조합)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ProxySQL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SQL 인식 프록시, 풀링, 쿼리 라우팅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PgBouncer, pgcat, PgDog, ProxySQL 3.0 (PostgreSQL 지원 추가)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;비동기 binlog 복제&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;복제 기본&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;스트리밍 물리 복제(비동기), 논리 복제&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;반동기(semi-sync) 복제&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;커밋 내구성 보장&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;synchronous_commit&lt;/code&gt; • &lt;code&gt;synchronous_standby_names&lt;/code&gt; (쿼럼 커밋 포함)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GTID&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;복제 위치 식별&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LSN, 타임라인, replication slot&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MHA, Orchestrator&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;자동 failover 관리자&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Patroni, repmgr, pg_auto_failover&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;garbd (Galera arbitrator)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;쿼럼 유지&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;etcd / Consul / ZooKeeper (Patroni DCS), witness 노드 (repmgr)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;mariabackup, xtrabackup&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;물리 백업&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pg_basebackup, pgBackRest, Barman, WAL-G&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MariaDB Operator, Percona Operator&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;쿠버네티스&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CloudNativePG, Zalando postgres-operator, Crunchy PGO, Percona Operator for PostgreSQL, StackGres&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="3-코어가-제공하는-기반"&gt;3. 코어가 제공하는 기반&lt;/h2&gt;&#10;&lt;p&gt;코어는 복제와 승격의 기본 동작만 제공하고, 자동 장애 조치·VIP·클라이언트 라우팅·멀티마스터는 외부 도구에 맡긴다.&lt;/p&gt;</description></item></channel></rss>