1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG075-PG连接管理:最大连接数配置与连接池基础

本文档风哥主要介绍PostgreSQL的连接管理,包括最大连接数配置与连接池基础,以及生产环境中的实战案例和最佳实践。风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 PostgreSQL连接的概念

PostgreSQL连接是客户端与数据库服务器之间的通信通道,用于执行SQL语句和获取结果。每个连接都需要消耗服务器资源,包括内存、CPU和网络带宽。更多视频教程www.fgedu.net.cn

PostgreSQL连接的特点:

  • 每个连接对应一个服务器进程或线程
  • 连接会消耗服务器资源
  • 连接数过多会导致服务器性能下降
  • 连接需要进行认证和授权
  • 连接可以设置超时和空闲时间

1.2 PostgreSQL最大连接数的概念

PostgreSQL最大连接数是数据库服务器允许的最大并发连接数。这个参数控制了同时可以连接到数据库的客户端数量,直接影响服务器的资源使用和性能。

# PostgreSQL最大连接数的默认值
– 小内存系统(<1GB):默认100
– 大内存系统(>1GB):默认100

# 最大连接数的影响
– 连接数过多:会消耗大量内存和CPU资源,导致服务器性能下降
– 连接数过少:会限制并发用户数,影响应用可用性
– 合理设置:根据服务器资源和业务需求设置

1.3 PostgreSQL连接池的概念

PostgreSQL连接池是一种管理数据库连接的技术,通过复用连接来减少连接创建和销毁的开销,提高系统性能和可扩展性。学习交流加群风哥微信: itpux-com

PostgreSQL连接池的优势:

  • 减少连接创建和销毁的开销
  • 控制并发连接数
  • 提高系统响应速度
  • 优化资源使用
  • 支持连接超时和健康检查

Part02-生产环境规划与建议

2.1 PostgreSQL最大连接数规划

PostgreSQL最大连接数规划要点:

# 最大连接数计算公式
max_connections = (可用内存 – 系统预留内存 – 共享内存) / 每个连接所需内存

# 每个连接所需内存估算
– 基本连接开销:约10MB
– 工作内存:根据work_mem参数
– 维护工作内存:根据maintenance_work_mem参数

# 最大连接数建议
– 小型系统(1-4GB内存):50-100
– 中型系统(4-16GB内存):100-200
– 大型系统(16GB+内存):200-500
– 超大型系统:500+(需要更多资源)

# 预留连接数
– 为超级用户预留:至少3-5个连接
– 为维护操作预留:至少5-10个连接
– 为应用预留:根据业务需求

2.2 PostgreSQL连接池规划

PostgreSQL连接池规划要点:

from oracle:www.itpux.com

# 连接池大小规划
– 小型应用:10-50个连接
– 中型应用:50-100个连接
– 大型应用:100-200个连接
– 超大型应用:200+个连接

# 连接池参数规划
– 最小空闲连接数:5-10
– 最大连接数:根据应用需求
– 连接超时:30-60秒
– 空闲超时:5-10分钟
– 验证间隔:30-60秒

# 连接池策略
– 按需创建连接
– 自动回收空闲连接
– 健康检查机制
– 故障转移支持

2.3 性能优化建议

性能优化建议:

# 服务器参数优化
– shared_buffers:建议设置为内存的25%
– work_mem:根据查询复杂度调整
– maintenance_work_mem:根据维护操作需求调整
– effective_cache_size:建议设置为内存的50-75%

# 连接管理优化
– 使用连接池
– 设置合理的连接超时
– 关闭空闲连接
– 优化应用代码,减少连接持有时间

# 监控与调优
– 监控连接数和连接状态
– 识别和处理长时间运行的连接
– 定期分析连接使用情况
– 根据业务需求调整连接参数

风哥提示:合理的连接管理对于数据库性能至关重要,需要根据服务器资源和业务需求进行详细规划,避免连接数过多导致的性能问题。

Part03-生产环境项目实施方案

3.1 PostgreSQL最大连接数配置

3.1.1 查看当前最大连接数配置

# 以超级用户登录
$ psql -U pgsql

# 查看最大连接数
postgres=# SHOW max_connections;

max_connections
—————–
100
(1 row)

# 查看预留连接数
postgres=# SHOW superfgedu_reserved_connections;

superfgedu_reserved_connections
———————————
3
(1 row)

# 查看连接使用情况
postgres=# SELECT count(*) FROM pg_stat_activity;

count
——-
1
(1 row)

3.1.2 修改最大连接数配置

# 修改postgresql.conf文件
$ vi /postgresql/data/postgresql.conf

# 修改最大连接数
max_connections = 200 # 根据服务器资源调整

# 修改预留连接数
superfgedu_reserved_connections = 10 # 为超级用户预留更多连接

# 重新启动PostgreSQL服务(注意:需要重启才能生效)
$ pg_ctl restart -D /postgresql/data

# 验证配置修改
postgres=# SHOW max_connections;

max_connections
—————–
200
(1 row)

postgres=# SHOW superfgedu_reserved_connections;

superfgedu_reserved_connections
———————————
10
(1 row)

3.2 PostgreSQL连接池配置

3.2.1 使用pgBouncer配置连接池

# 安装pgBouncer
$ yum install pgbouncer -y

# 配置pgBouncer
$ vi /etc/pgbouncer/pgbouncer.ini

# 添加以下内容
[fgedudbs]
fgedu_business = fgedu.net.cn=localfgedu.net.cn port=5432 fgedudb=fgedu_business fgedu=pgsql [pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 50
min_pool_size = 10
reserve_pool_size = 10
reserve_pool_timeout = 5
max_db_connections = 100
max_fgedu_connections = 50
log_connections = 1
log_disconnections = 1
log_pooler_errors = 1
server_reset_query = DISCARD ALL
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/fgedulist.txt

# 创建用户认证文件
$ vi /etc/pgbouncer/fgedulist.txt

# 添加用户信息
“postgres” “password”

# 启动pgBouncer
$ systemctl start pgbouncer
$ systemctl enable pgbouncer

# 验证pgBouncer状态
$ systemctl status pgbouncer

# 连接到pgBouncer
$ psql -h localfgedu.net.cn -p 6432 -U pgsql -d fgedu_business

3.2.2 使用Pgpool-II配置连接池

# 安装Pgpool-II
$ yum install pgpool-II-pg18 -y

# 配置Pgpool-II
$ vi /etc/pgpool-II/pgpool.conf

# 修改以下配置
listen_addresses = ‘*’
port = 9999
backend_fgedu.net.cnname0 = ‘localfgedu.net.cn’
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ‘/postgresql/data’
backend_flag0 = ‘ALLOW_TO_FAILOVER’
pool_mode = ‘transaction’
num_init_children = 50
max_pool = 4
child_life_time = 300
child_max_connections = 100
connection_life_time = 0
client_idle_limit = 0

# 启动Pgpool-II
$ systemctl start pgpool-II
$ systemctl enable pgpool-II

# 验证Pgpool-II状态
$ systemctl status pgpool-II

# 连接到Pgpool-II
$ psql -h localfgedu.net.cn -p 9999 -U pgsql -d fgedu_business

3.3 PostgreSQL连接监控

3.3.1 监控连接状态

# 查看当前连接数
postgres=# SELECT count(*) FROM pg_stat_activity;

count
——-
10
(1 row)

# 查看连接状态分布
postgres=# SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

state | count
——–+——-
active | 2
idle | 8
(2 rows)

# 查看长时间空闲的连接
postgres=# SELECT pid, usename, datname, state, query_start, now() – query_start as idle_time
postgres-# FROM pg_stat_activity
postgres-# WHERE state = ‘idle’
postgres-# ORDER BY idle_time DESC;

pid | usename | datname | state | query_start | idle_time
——+———-+———–+——-+——————————-+—————
1234 | pgsql | fgedu_business | idle | 2026-04-02 09:00:00.000000 | 01:00:00
1235 | pgsql | fgedu_business | idle | 2026-04-02 09:30:00.000000 | 00:30:00
(2 rows)

# 查看连接来源
postgres=# SELECT client_addr, count(*) FROM pg_stat_activity GROUP BY client_addr;

client_addr | count
————-+——-
192.168.1.1 | 5
192.168.1.2 | 3
127.0.0.1 | 2
(3 rows)

3.3.2 终止异常连接

# 查看所有连接
postgres=# SELECT pid, usename, datname, state, query FROM pg_stat_activity;

# 终止指定连接
postgres=# SELECT pg_terminate_backend(1234);

pg_terminate_backend
———————-
t
(1 row)

# 终止所有空闲连接
postgres=# SELECT pg_terminate_backend(pid)
postgres-# FROM pg_stat_activity
postgres-# WHERE state = ‘idle’
postgres-# AND pid <> pg_backend_pid();

# 终止特定数据库的连接
postgres=# SELECT pg_terminate_backend(pid)
postgres-# FROM pg_stat_activity
postgres-# WHERE datname = ‘fgedu_business’
postgres-# AND pid <> pg_backend_pid();

风哥提示:定期监控连接状态,及时终止异常连接和长时间空闲的连接,有助于提高服务器性能和资源利用率。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 PostgreSQL最大连接数配置案例

4.1.1 案例:为生产环境配置最大连接数

# 场景:生产环境服务器配置为16GB内存,需要支持200个并发用户

# 1. 计算最大连接数
# 可用内存:16GB
# 系统预留:4GB
# 共享内存:4GB (25% of 16GB)
# 剩余内存:8GB
# 每个连接所需内存:约40MB
# 最大连接数:8GB / 40MB = 200

# 2. 修改postgresql.conf文件
$ vi /postgresql/data/postgresql.conf

# 修改连接相关参数
max_connections = 200
superfgedu_reserved_connections = 10
shared_buffers = 4GB
work_mem = 16MB
maintenance_work_mem = 1GB

# 3. 重新启动PostgreSQL服务
$ pg_ctl restart -D /postgresql/data

# 4. 验证配置
postgres=# SHOW max_connections;
postgres=# SHOW shared_buffers;
postgres=# SHOW work_mem;

# 5. 监控连接使用情况
postgres=# SELECT count(*) FROM pg_stat_activity;
postgres=# SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

4.2 PostgreSQL连接池配置案例

4.2.1 案例:为高并发应用配置连接池

# 场景:高并发Web应用,峰值并发用户数为500

# 1. 配置pgBouncer
$ vi /etc/pgbouncer/pgbouncer.ini

[fgedudbs]
fgedu_webfgapp = fgedu.net.cn=localfgedu.net.cn port=5432 fgedudb=fgedu_webfgapp fgedu=fgapp_fgedu

[pgbouncer]
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 100
min_pool_size = 20
reserve_pool_size = 20
reserve_pool_timeout = 5
max_db_connections = 150
max_fgedu_connections = 100
listen_addr = *
listen_port = 6432
auth_type = md5
auth_file = /etc/pgbouncer/fgedulist.txt

# 2. 创建用户认证文件
$ vi /etc/pgbouncer/fgedulist.txt
“fgapp_fgedu” “password”

# 3. 启动pgBouncer
$ systemctl start pgbouncer

# 4. 配置应用连接字符串
# 将应用连接字符串从
# postgresql://fgapp_fgedu:password@localfgedu.net.cn:5432/fgedu_webfgapp
# 修改为
# postgresql://fgapp_fgedu:password@localfgedu.net.cn:6432/fgedu_webfgapp

# 5. 监控连接池状态
$ psql -h localfgedu.net.cn -p 6432 -U fgapp_fgedu -d fgedu_webfgapp

fgedu_webfgapp=# SHOW POOLS;

fgedudb | cl_active | cl_waiting | sv_active | sv_idle | sv_used | sv_tested | sv_login | maxwait | maxwait_us | pool_mode
————–+———–+————+———–+———+———+———–+———-+———+————+———–
fgedu_webfgapp | 50 | 0 | 50 | 50 | 0 | 0 | 0 | 0 | 0 | transaction
(1 row)

4.3 PostgreSQL连接问题排查案例

4.3.1 案例:连接数达到上限

# 场景:应用无法连接到数据库,报错”FATAL: sorry, too many clients already”

# 1. 查看当前连接数
postgres=# SELECT count(*) FROM pg_stat_activity;

count
——-
200
(1 row)

# 2. 查看最大连接数
postgres=# SHOW max_connections;

max_connections
—————–
200
(1 row)

# 3. 分析连接状态
postgres=# SELECT state, count(*) FROM pg_stat_activity GROUP BY state;

state | count
——–+——-
active | 50
idle | 150
(2 rows)

# 4. 查看长时间空闲的连接
postgres=# SELECT pid, usename, datname, state, query_start, now() – query_start as idle_time
postgres-# FROM pg_stat_activity
postgres-# WHERE state = ‘idle’
postgres-# ORDER BY idle_time DESC
postgres-# LIMIT 10;

# 5. 终止长时间空闲的连接
postgres=# SELECT pg_terminate_backend(pid)
postgres-# FROM pg_stat_activity
postgres-# WHERE state = ‘idle’
postgres-# AND now() – query_start > interval ’30 minutes’
postgres-# AND pid <> pg_backend_pid();

# 6. 调整连接池配置
# 修改pgBouncer配置,减少最大连接数
# 或调整应用代码,及时释放连接

# 7. 长期解决方案
# 增加服务器资源
# 优化应用代码
# 调整最大连接数配置

风哥教程针对风哥教程针对风哥教程针对生产环境建议:在生产环境中,建议使用连接池来管理数据库连接,避免连接数过多导致的性能问题。同时,定期监控连接状态,及时处理异常连接。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 PostgreSQL连接管理最佳实践

PostgreSQL连接管理最佳实践:

  • 最大连接数配置:
    • 根据服务器资源合理设置最大连接数
    • 为超级用户和维护操作预留足够的连接
    • 定期监控连接使用情况,及时调整
  • 连接池使用:
    • 使用连接池管理数据库连接
    • 合理配置连接池大小和参数
    • 选择合适的连接池模式(事务/语句/会话)
  • 连接监控:
    • 定期监控连接状态和使用情况
    • 及时终止异常连接和长时间空闲的连接
    • 设置连接超时和空闲超时
  • 应用优化:
    • 优化应用代码,减少连接持有时间
    • 使用连接池,避免频繁创建和销毁连接
    • 实现连接重试机制,提高应用可靠性

5.2 PostgreSQL连接管理常见问题

PostgreSQL连接管理常见问题及解决方案:

  • 连接数达到上限:增加最大连接数,使用连接池,优化应用代码
  • 连接泄漏:检查应用代码,确保连接正确关闭,使用连接池
  • 连接超时:调整连接超时参数,检查网络连接
  • 连接认证失败:检查用户名和密码,检查pg_hba.conf配置
  • 连接性能问题:优化连接池配置,调整服务器参数,优化应用代码

5.3 PostgreSQL连接管理工具推荐

PostgreSQL连接管理常用工具:

  • pgBouncer:轻量级连接池工具,适合大多数应用场景
  • Pgpool-II:功能丰富的连接池工具,支持负载均衡和故障转移
  • Odyssey:高性能连接池工具,适合高并发场景
  • ProxySQL:支持PostgreSQL的代理和连接池工具
  • 应用级连接池:如Java的HikariCP,Python的psycopg2连接池等
  • 监控工具:pg_stat_statements, pgAdmin4, Prometheus + Grafana
风哥提示:PostgreSQL的连接管理是数据库性能优化的重要组成部分,需要根据业务需求和服务器资源进行合理规划和配置。使用连接池可以显著提高系统性能和可扩展性,建议在生产环境中广泛使用。from PostgreSQL:www.itpux.com

持续改进:连接管理是一个持续的过程,需要根据业务发展和系统变化不断调整和优化。建议建立定期审查机制,持续改进连接管理策略。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息