如何在 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. 基于执行计划优化查询与索引策略

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

相关推荐
旖旎夜光1 小时前
Linux(13)(中)
linux·网络
威迪斯特1 小时前
CentOS图形化操作界面:理论解析与实践指南
linux·运维·centos·组件·图形化·桌面·xserver
一方热衷.2 小时前
在线安装对应版本NVIDIA驱动
linux·运维·服务器
独自归家的兔2 小时前
ubuntu系统安装dbswitch教程 - 备份本地数据到远程服务器
linux·运维·ubuntu
ONE_SIX_MIX2 小时前
ubuntu 24.04 用rdp连接,桌面黑屏问题,解决
linux·运维·ubuntu
龙飞052 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
*小海豚*2 小时前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
June`2 小时前
muduo项目排查错误+测试
linux·c++·github·muduo网络库
消失的旧时光-19432 小时前
Linux 编辑器入门:nano 与 vim 的区别与选择指南
linux·运维·服务器
晓13132 小时前
第七章 【C语言篇:文件】 文件全面解析
linux·c语言·开发语言