Bộ tài liệu chuyên sâu về cách PostgreSQL hoạt động bên dưới lớp SQL và Storage, viết cho Backend Engineer, Database Engineer và Software Architect.

Tài liệu này KHÔNG phải là gì

Đây không phải tài liệu dạy SQL. Không có CREATE TABLE ở chương mở đầu. Không giải thích cú pháp.

Đây là tài liệu giúp bạn hiểu PostgreSQL như một hệ điều hành thu nhỏ dành cho dữ liệu: cách nó tổ chức bộ nhớ, quản lý page, lưu tuple, điều phối transaction, ghi WAL, phục hồi sau sự cố, tối ưu truy vấn, và phối hợp với OS để đạt hiệu năng và độ tin cậy.

Triết lý trình bày

Mọi chương đi theo dòng tư duy:

Business Problem
      ↓
Tại sao cần Database?
      ↓
Dữ liệu nằm ở đâu? (Disk, Filesystem)
      ↓
Database phải tổ chức dữ liệu thế nào? (Storage Engine)
      ↓
Memory Management → Transaction → Concurrency → Recovery
      ↓
Query Processing
      ↓
Production & Trade-off

Mỗi thành phần đều phải trả lời đủ 5 câu hỏi:

  1. Nó tồn tại để giải quyết vấn đề gì?
  2. Nếu loại bỏ nó, PostgreSQL gặp vấn đề gì?
  3. Tại sao PostgreSQL chọn thiết kế này thay vì cách khác?
  4. Trade-off của quyết định thiết kế là gì?
  5. Tác động production (hiệu năng, độ tin cậy, khả năng mở rộng) ra sao?

Mục lục

#ChươngLevelNội dung chính
01Database Fundamentals — từ First Principles1Disk, filesystem, tại sao cần database engine, ACID, durability
02Kiến trúc tổng thể — Process & Shared Memory1–2Postmaster, backend, checkpointer, bgwriter, shared buffers, SLRU
03Physical Storage — Page, Tuple, TOAST, FSM, VM2Relation file, segment, page layout, tuple header, line pointer, fork
04Buffer Manager2Buffer pool, clock sweep, pin, dirty page, ring buffer, OS cache
05WAL — Write-Ahead Log3WAL record, LSN, group commit, full page write, fsync
06Transaction Engine — MVCC, Snapshot, Visibility3XID, snapshot, visibility rules, hint bit, CLOG, isolation
07Lock Manager3Row lock, table lock, LWLock, spinlock, deadlock
08Query Processing — Parser đến Executor4Parser, rewriter, planner, cost model, executor
09Index Internals4B-tree, Hash, GIN, GiST, BRIN — page layout, split, scan, cost
10VACUUM, HOT, Freeze, Wraparound3–5Dead tuple, vacuum phases, HOT chain, freeze, autovacuum
11Checkpoint, Recovery, Replication3–5Crash recovery, WAL replay, PITR, streaming replication
12Production Failure Cases521 failure case: bloat, wraparound, checkpoint storm, lock contention…
13Anti-pattern & Khi nào không dùng PostgreSQL5Anti-patterns, giới hạn kiến trúc, lựa chọn thay thế

Cách đọc

Nếu bạn là Backend Engineer muốn hiểu tại sao query chậm: đọc 01 → 03 → 04 → 06 → 08 → 09 → 12.

Nếu bạn là Database Engineer / DBA: đọc tuần tự toàn bộ. Chương 12 là tài liệu tra cứu khi trực production.

Nếu bạn là Architect đang chọn database: đọc 01, 02, 06, 13.

Quy ước

  • Thuật ngữ chuyên ngành (Page, Heap, Tuple, WAL, MVCC, Checkpoint…) giữ nguyên tiếng Anh.
  • Diagram dùng ASCII để đọc được ở mọi nơi.
  • Pseudo code mô tả thuật toán viết bằng Go để dễ đọc với backend engineer (source thật của PostgreSQL là C).
  • Source code reference theo cây thư mục PostgreSQL: src/backend/... (nhánh master, các dòng lệnh có thể xê dịch giữa các version).
  • Số liệu benchmark là số đại diện (representative) đo trên SSD NVMe hiện đại — dùng để hiểu bậc độ lớn (order of magnitude), không phải để so sánh tuyệt đối. Luôn tự benchmark trên hạ tầng của bạn.
  • Nội dung bám theo PostgreSQL 16/17. Những điểm khác biệt lớn giữa các version được ghi chú rõ.

Bức tranh tổng thể — giữ trong đầu suốt bộ tài liệu

                        ┌──────────────────────────────────────────┐
                        │                CLIENT                    │
                        └──────────────────┬───────────────────────┘
                                           │ libpq protocol
                        ┌──────────────────▼───────────────────────┐
                        │           BACKEND PROCESS (1/conn)       │
                        │  Parser → Rewriter → Planner → Executor  │
                        └──────┬─────────────────────────┬─────────┘
                               │                         │
              ┌────────────────▼──────────┐   ┌──────────▼──────────┐
              │      SHARED MEMORY        │   │     LOCK MANAGER    │
              │  ┌─────────────────────┐  │   │  heavyweight locks  │
              │  │   Shared Buffers    │  │   │  LWLocks, spinlocks │
              │  │  (page cache 8KB)   │  │   └─────────────────────┘
              │  └─────────────────────┘  │
              │  ┌──────────┐ ┌────────┐  │   ┌─────────────────────┐
              │  │WAL Buffer│ │  SLRU  │  │   │ BACKGROUND PROCESSES│
              │  └──────────┘ │ (CLOG) │  │   │ checkpointer        │
              │  ┌──────────┐ └────────┘  │   │ background writer   │
              │  │Proc Array│              │   │ wal writer          │
              │  └──────────┘              │   │ autovacuum workers  │
              └──────┬──────────────┬──────┘   └─────────┬───────────┘
                     │              │                    │
              ┌──────▼──────┐ ┌─────▼─────┐              │
              │  DATA FILES │ │  WAL FILES│◄─────────────┘
              │ base/…/16384│ │ pg_wal/…  │
              └──────┬──────┘ └─────┬─────┘
                     │              │
              ┌──────▼──────────────▼──────┐
              │   OS PAGE CACHE / FS       │
              └──────────────┬─────────────┘
                             │
              ┌──────────────▼─────────────┐
              │        DISK (SSD/NVMe)     │
              └────────────────────────────┘

Mọi chương sau đây là việc phóng to từng ô trong sơ đồ này.