如何在 CentOS Stream 9 上配置并优化 PostgreSQL 15,支持高并发的数据插入与快速查询?

在构建高负载数据库服务时,A5IDC亲自实践了一套从系统准备、数据库安装、核心参数调优,到高并发插入与查询优化的完整方案。本教程适合用于生产环境(例如 OLTP 大并发、数据平台实时写入场景),不仅包含详细步骤、硬件参数、配置示例,还包含性能评估与调优思路。


一、香港服务器www.a5idc.com系统与硬件环境建议

项目 推荐规格 说明
操作系统 CentOS Stream 9 x86_64 服务稳定且接受最新软件包支持
CPU 8--32 核 并发控制、查询执行并行化能力提高
内存 32--128 GB 高并发数据缓冲与缓存
存储 NVMe SSD(读写 20K+ IOPS) WAL 与数据分离提升写性能
网络 1--10 Gbps 前端应用与数据库之间网络延迟最小

二、安装 PostgreSQL 15

CentOS Stream 9 自带 PostgreSQL 15 软件包流,通过模块方式安装是最简便的方式。

bash 复制代码
# 安装 PostgreSQL 15
dnf module -y install postgresql:15

# 初始化数据库
postgresql-setup --initdb

# 配置开机启动并启动 PostgreSQL
systemctl enable --now postgresql

完成后,可通过 psql 进入数据库:

bash 复制代码
sudo -u postgres psql

三、基本配置优化策略

PostgreSQL 默认安装适合开发测试场景,并未针对高并发/高插入优化。以下是核心调优方向:

3.1 shared_buffers 与缓存参数

参数 推荐值 说明
shared_buffers 系统 RAM × 25% PostgreSQL 数据缓存
effective_cache_size 系统 RAM × 50--75% 优化器估算操作系统缓存

例如在 64GB 内存服务器上:

conf 复制代码
shared_buffers = 16GB
effective_cache_size = 32GB

理论上 shared_buffers 占比太高会减少 OS 文件缓存的空间;有效缓存是优化器评估用到索引与表页缓存的重要参考。


3.2 写入相关参数

参数 默认 推荐
wal_buffers -1 16--64MB
checkpoint_completion_target 0.5 0.9
max_wal_size 1GB 4--12GB

示例:

conf 复制代码
wal_buffers = 32MB
checkpoint_completion_target = 0.9
max_wal_size = 6GB

调整这些参数能降低 WAL checkpoint 压力,从而提升写入持续吞吐量。


3.3 连接与工作进程参数

conf 复制代码
max_connections = 500
work_mem = 16MB
maintenance_work_mem = 1GB
max_parallel_workers = 16

多人并发写入仍需配合连接池(例如 PgBouncer)来减少连接开销,否则过多连接会增加上下文切换。


四、高并发写入优化实战

4.1 批量插入而非逐行插入

逐条 INSERT 是最慢的写法。A5IDC建议使用:

sql 复制代码
BEGIN;
INSERT INTO table_name (col1, col2) VALUES
  (v1, v2),
  (v3, v4),
  ...;
COMMIT;

批量插入有效减少事务开销,并提升插入吞吐。

对于海量数据,使用 COPY FROM 是最快方式:

sql 复制代码
COPY table_name FROM '/path/data.csv' CSV;

4.2 临时禁用索引与约束

在大批量插入时,维持索引与外键会增加验证成本。可在批量插入前拆掉部分索引,插入后再重建:

sql 复制代码
DROP INDEX idx_example;
-- 批量插入
CREATE INDEX idx_example ON table_name(column);

对于 OLTP 场景,只有必要索引才能最大化插入速率。


五、查询性能优化

5.1 索引与统计信息优化

通常对单列查询用 B‑Tree 索引;复杂查询用如下类型:

索引类型 应用场景
B‑Tree 精确匹配/范围
BRIN 大表区间范围
GIN JSON、Full‑Text

PostgreSQL 强大的多种索引支持让查询性能显著提升。

执行计划分析:

sql 复制代码
EXPLAIN ANALYZE SELECT * FROM example WHERE col1 = 'value';

基于执行计划调整索引与统计信息。


5.2 并行查询

PostgreSQL 15 支持并行查询:

conf 复制代码
max_parallel_workers_per_gather = 4

视 CPU 核数合理设置,可提升复杂查询性能。


六、进阶架构与连接池

6.1 使用 PgBouncer

PgBouncer 是轻量级连接池,可显著减轻 PostgreSQL 主进程连接开销:

ini 复制代码
# pgbouncer.ini 示例
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb

[pgbouncer]
listen_addr = *
listen_port = 6432
max_client_conn = 2000
default_pool_size = 100

PgBouncer 支持 session / transaction / statement 三种池化模式,根据应用选择最合适的模式。


七、性能对比评测(示例)

以下评测是在 8 核 64GB 内存 NVMe SSD 服务器进行的简单对比,仅作参考:

场景 逐行 INSERT 批量 INSERT COPY FROM
10 万行 4.2s 1.3s 0.5s
100 万行 50s 9.8s 4.2s

八、总结

通过以上调整与优化实践,我成功将 PostgreSQL 15 在 CentOS Stream 9 上的并发写入与查询性能提升到生产级水平:

  1. 合理分配内存与缓存参数
  2. 批量写入、减少索引维护开销
  3. 使用连接池 PgBouncer 降低连接压力
  4. 基于执行计划优化查询与索引策略

这些优化策略适用于多数中大型系统的生产数据库。如需更高性能,可结合物理分区、逻辑复制或分布式扩展进一步提升。

相关推荐
柏木乃一10 小时前
进程(11)进程替换函数详解
linux·服务器·c++·操作系统·exec
ben9518chen10 小时前
Linux文件系统基础
linux·服务器·php
晴天¥10 小时前
计算机网络-Linux配置-DNS解析/为什么会出现ping: www.baidu.com: 未知的名称或服务
linux·运维·计算机网络
代码游侠10 小时前
应用——Linux FrameBuffer图形显示与多线程消息系统项目
linux·运维·服务器·开发语言·前端·算法
Lupino10 小时前
构建现代化的 Python PostgreSQL 工具库:psql_utils 的重构与优化之旅
python·postgresql
深圳市恒讯科技10 小时前
如何从损坏的Windows或Linux VPS中恢复文件
linux·运维·windows
neo_will_mvp10 小时前
通过commit创建镜像
linux·运维·服务器
go_bai10 小时前
生产消费模型-简洁线程池
linux·c++·笔记
lisanmengmeng10 小时前
cephfs rbd应用
linux·运维·服务器·ceph