← 返回首页
🗄️

PostgreSQL架构

📂 architecture ⏱ 1 min 156 words

PostgreSQL架构

进程架构

PostgreSQL采用多进程模型,每个连接对应一个后端进程,通过共享内存实现数据共享。

┌─────────────────────────────────┐
│         Postmaster              │
│    (主进程,管理连接)            │
└──────┬──────┬──────┬───────────┘
       │      │      │
   ┌───▼──┐┌──▼───┐┌─▼────┐
   │Backend││Backend││Backend│
   └───┬──┘└──┬───┘└─┬────┘
       │      │      │
       └──────┴──────┘
          Shared Buffers

MVCC实现

PostgreSQL通过元组版本和事务快照实现MVCC,无需锁即可支持高并发读。

-- 查看事务ID和命令ID
SELECT xmin, xmax, ctid, * FROM users WHERE id = 1;

-- xmin: 插入该行的事务ID
-- xmax: 删除/更新该行的事务ID(0表示未删除)
-- ctid: 行的物理位置 (page, offset)
// 事务隔离级别配置
@Repository
public interface UserRepository extends CrudRepository<User, Long> {

    @Query(value = "SELECT * FROM users WHERE id = :id", nativeQuery = true)
    @Transactional(isolation = Isolation.REPEATABLE_READ)
    User findByIdWithIsolation(@Param("id") Long id);
}

WAL日志机制

Write-Ahead Logging保证数据持久性,支持时间点恢复和流复制。

# postgresql.conf
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1GB
archive_mode = on
archive_command = 'cp %p /archive/%f'
-- 手动触发WAL检查点
CHECKPOINT;

-- 查看WAL状态
SELECT * FROM pg_stat_replication;
SELECT pg_current_wal_lsn();

TOAST大字段

超过页大小的大字段自动压缩并存储到TOAST表,对应用透明。

-- 创建带大字段的表
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255),
    content TEXT,  -- 自动使用TOAST存储
    created_at TIMESTAMP DEFAULT NOW()
);

-- 查看TOAST信息
SELECT attname, atttypid, attstorage 
FROM pg_attribute WHERE attrelid = 'documents'::regclass;

性能优化

通过连接池、索引优化、查询调优提升PostgreSQL性能。

# HikariCP连接池配置
spring:
  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 300000
      connection-timeout: 20000
      max-lifetime: 1200000