PostgreSQL架构
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