PostgreSQL教程FG075-PG连接管理:最大连接数配置与连接池基础
本文档风哥主要介绍PostgreSQL的连接管理,包括最大连接数配置与连接池基础,以及生产环境中的实战案例和最佳实践。风哥教程参考PostgreSQL官方文档Server Administration内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 PostgreSQL连接的概念
PostgreSQL连接是客户端与数据库服务器之间的通信通道,用于执行SQL语句和获取结果。每个连接都需要消耗服务器资源,包括内存、CPU和网络带宽。更多视频教程www.fgedu.net.cn
- 每个连接对应一个服务器进程或线程
- 连接会消耗服务器资源
- 连接数过多会导致服务器性能下降
- 连接需要进行认证和授权
- 连接可以设置超时和空闲时间
1.2 PostgreSQL最大连接数的概念
PostgreSQL最大连接数是数据库服务器允许的最大并发连接数。这个参数控制了同时可以连接到数据库的客户端数量,直接影响服务器的资源使用和性能。
– 小内存系统(<1GB):默认100
– 大内存系统(>1GB):默认100
# 最大连接数的影响
– 连接数过多:会消耗大量内存和CPU资源,导致服务器性能下降
– 连接数过少:会限制并发用户数,影响应用可用性
– 合理设置:根据服务器资源和业务需求设置
1.3 PostgreSQL连接池的概念
PostgreSQL连接池是一种管理数据库连接的技术,通过复用连接来减少连接创建和销毁的开销,提高系统性能和可扩展性。学习交流加群风哥微信: itpux-com
- 减少连接创建和销毁的开销
- 控制并发连接数
- 提高系统响应速度
- 优化资源使用
- 支持连接超时和健康检查
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 修改最大连接数配置
$ 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配置连接池
$ 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配置连接池
$ 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();
Part04-生产案例与实战讲解
4.1 PostgreSQL最大连接数配置案例
4.1.1 案例:为生产环境配置最大连接数
# 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 案例:为高并发应用配置连接池
# 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 案例:连接数达到上限
# 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. 长期解决方案
# 增加服务器资源
# 优化应用代码
# 调整最大连接数配置
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
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
