外观
GaussDB 连接控制配置与管理
GaussDB的连接控制是数据库性能和稳定性管理的重要组成部分。通过合理配置连接控制参数,可以防止连接风暴、优化资源使用、提高系统安全性。连接控制主要包括连接数限制、连接超时管理、连接认证控制等方面。
连接控制核心参数
连接数限制参数
| 参数名 | 描述 | 默认值 | 建议值 |
|---|---|---|---|
| max_connections | 允许的最大并发连接数 | 5000 | 根据系统资源和业务需求调整 |
| superuser_reserved_connections | 为超级用户保留的连接数 | 30 | 10-50 |
| unix_socket_max_connections | Unix套接字允许的最大连接数 | -1(无限制) | -1 |
| max_prepared_transactions | 允许的最大预备事务数 | 0 | 0(禁用) |
连接超时参数
| 参数名 | 描述 | 默认值 | 建议值 |
|---|---|---|---|
| connect_timeout | 客户端连接超时时间(秒) | 10 | 5-30 |
| tcp_keepalives_idle | TCP连接空闲时间(秒) | 7200 | 600-3600 |
| tcp_keepalives_interval | TCP保活探测间隔(秒) | 75 | 15-60 |
| tcp_keepalives_count | TCP保活探测次数 | 9 | 3-10 |
| idle_in_transaction_session_timeout | 事务空闲超时时间(毫秒) | 0(禁用) | 300000(5分钟) |
连接认证参数
| 参数名 | 描述 | 默认值 | 建议值 |
|---|---|---|---|
| authentication_timeout | 认证超时时间(秒) | 60 | 10-30 |
| password_encryption_type | 密码加密类型 | md5 | sha256 |
| krb_server_keyfile | Kerberos服务器密钥文件路径 | '' | 根据Kerberos配置 |
| ldap_url | LDAP服务器URL | '' | 根据LDAP配置 |
连接控制配置方法
修改连接控制参数
使用ALTER SYSTEM命令:
sql-- 修改最大连接数 ALTER SYSTEM SET max_connections = 2000; -- 修改连接超时时间 ALTER SYSTEM SET connect_timeout = 15; -- 设置事务空闲超时 ALTER SYSTEM SET idle_in_transaction_session_timeout = 300000; -- 修改密码加密类型 ALTER SYSTEM SET password_encryption_type = 'sha256';修改pg_hba.conf文件:
bash# 编辑pg_hba.conf文件 vi /data/gaussdb/data/pg_hba.conf # 添加或修改连接控制规则 # TYPE DATABASE USER ADDRESS METHOD host all all 192.168.1.0/24 md5 host all all 0.0.0.0/0 reject # 重载配置 gs_ctl reload -D /data/gaussdb/data使用gs_guc工具:
bash# 设置最大连接数 gs_guc set -D /data/gaussdb/data -c "max_connections=2000" # 设置连接超时 gs_guc set -D /data/gaussdb/data -c "connect_timeout=15" # 重载配置 gs_ctl reload -D /data/gaussdb/data
连接池配置
使用连接池可以有效管理数据库连接,提高连接利用率,降低系统资源消耗。GaussDB支持多种连接池:
PgBouncer:
ini# pgbouncer.ini配置示例 [databases] gaussdb = host=127.0.0.1 port=5432 dbname=gaussdb [pgbouncer] listen_addr = 0.0.0.0 listen_port = 6432 auth_type = md5 auth_file = userlist.txt pool_mode = transaction max_client_conn = 5000 default_pool_size = 20pgpool-II:
txt# pgpool.conf配置示例 listen_addresses = '*' port = 9999 num_init_children = 100 max_pool = 20 child_life_time = 300 client_idle_limit = 300应用层连接池:
- Java:HikariCP、Druid
- Python:SQLAlchemy、psycopg2连接池
- Go:pgx连接池
连接管理策略
1. 连接数优化
根据系统资源调整:
- 计算公式:max_connections = (系统内存 - 其他进程占用内存) / 每个连接平均内存消耗
- 每个连接平均内存消耗约为5-10MB
- 例如:64GB内存的服务器,建议max_connections设置为2000-4000
预留超级用户连接:
sqlALTER SYSTEM SET superuser_reserved_connections = 30;确保超级用户在连接数满时仍能登录管理数据库
监控连接数使用情况:
sql-- 查看当前连接数 SELECT count(*) FROM pg_stat_activity; -- 查看连接数统计 SELECT state, count(*) FROM pg_stat_activity GROUP BY state; -- 查看各用户连接数 SELECT usename, count(*) FROM pg_stat_activity GROUP BY usename;
2. 连接超时管理
设置合适的连接超时:
sql-- 设置TCP保活参数 ALTER SYSTEM SET tcp_keepalives_idle = 600; ALTER SYSTEM SET tcp_keepalives_interval = 30; ALTER SYSTEM SET tcp_keepalives_count = 5; -- 设置事务空闲超时 ALTER SYSTEM SET idle_in_transaction_session_timeout = 300000;清理空闲连接:
sql-- 查看空闲连接 SELECT pid, usename, application_name, client_addr, state, backend_start, xact_start, query_start, state_change FROM pg_stat_activity WHERE state = 'idle' AND state_change < current_timestamp - interval '10 minutes'; -- 终止长时间空闲连接 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND state_change < current_timestamp - interval '10 minutes';
3. 连接认证控制
配置pg_hba.conf:
# 允许本地连接 local all all trust # 允许特定IP段连接 host all all 192.168.1.0/24 md5 # 允许特定用户从特定IP连接 host mydb myuser 10.0.0.5/32 md5 # 拒绝其他所有连接 host all all 0.0.0.0/0 reject使用SSL连接:
sql-- 启用SSL ALTER SYSTEM SET ssl = on; ALTER SYSTEM SET ssl_cert_file = 'server.crt'; ALTER SYSTEM SET ssl_key_file = 'server.key';配置认证超时:
sqlALTER SYSTEM SET authentication_timeout = 15;
连接控制最佳实践
1. 合理规划连接数
根据业务需求调整:
- OLTP系统:建议2000-5000个连接
- OLAP系统:建议100-500个连接
- 混合负载:根据实际情况调整
考虑连接池使用:
- 使用连接池可以减少实际数据库连接数
- 连接池连接数建议为CPU核心数的2-4倍
- 客户端连接数可以远大于数据库实际连接数
2. 监控连接状态
实时监控连接数:
sql-- 创建连接数监控视图 CREATE OR REPLACE VIEW v_connection_stats AS SELECT count(*) AS total_connections, sum(CASE WHEN state = 'active' THEN 1 ELSE 0 END) AS active_connections, sum(CASE WHEN state = 'idle' THEN 1 ELSE 0 END) AS idle_connections, sum(CASE WHEN state = 'idle in transaction' THEN 1 ELSE 0 END) AS idle_in_transaction_connections, sum(CASE WHEN usename = 'postgres' THEN 1 ELSE 0 END) AS postgres_connections, max_connections FROM pg_stat_activity, pg_settings WHERE name = 'max_connections'; -- 查询连接状态 SELECT * FROM v_connection_stats;设置连接数告警:
- 当连接数超过阈值(如max_connections的80%)时发送告警
- 监控空闲连接比例,及时清理长时间空闲连接
3. 优化连接认证
使用高效的认证方式:
- 本地连接使用trust或ident认证
- 远程连接使用md5或sha256认证
- 避免使用ldap或radius等慢速认证方式
限制认证超时:
sqlALTER SYSTEM SET authentication_timeout = 10;防止认证过程占用过多资源
4. 防止连接风暴
配置连接速率限制:
- 使用pg_hba.conf的connection_limit参数
- 配置防火墙规则限制连接速率
- 使用连接池的队列机制
启用连接延迟:
sql-- 配置认证延迟 ALTER SYSTEM SET password_encryption_type = 'sha256';增加暴力破解的难度
5. 定期清理无效连接
创建定时任务清理空闲连接:
sql-- 创建清理空闲连接的函数 CREATE OR REPLACE FUNCTION cleanup_idle_connections() RETURNS void AS $$ BEGIN PERFORM pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND state_change < current_timestamp - interval '10 minutes' AND usename != 'postgres'; END; $$ LANGUAGE plpgsql; -- 使用定时任务调度(需要启用pg_cron扩展) SELECT cron.schedule('0 * * * *', 'SELECT cleanup_idle_connections();');使用外部工具清理:
- 使用pg_repack工具
- 使用自定义脚本定期清理
连接控制常见问题与解决方案
问题1:连接数已满
可能原因:
- max_connections设置过小
- 连接泄漏
- 连接池配置不当
- 业务并发量突增
解决方案:
- 临时增加max_connections:
ALTER SYSTEM SET max_connections = 4000; - 清理无效连接:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND state_change < current_timestamp - interval '10 minutes'; - 优化连接池配置,增加连接复用
- 分析业务需求,优化应用连接逻辑
问题2:连接超时
可能原因:
- 网络延迟过高
- 数据库负载过高
- 连接超时参数设置过小
- 防火墙或网络设备限制
解决方案:
- 检查网络连接质量
- 优化数据库性能,降低负载
- 适当调整connect_timeout参数
- 检查防火墙和网络设备配置
问题3:认证失败
可能原因:
- 用户名或密码错误
- pg_hba.conf配置错误
- 认证方式不匹配
- 密码过期
解决方案:
- 验证用户名和密码
- 检查pg_hba.conf配置
- 确保认证方式一致
- 重置用户密码:
ALTER USER username WITH PASSWORD 'new_password';
问题4:连接风暴
可能原因:
- 应用程序故障,短时间内发起大量连接请求
- 恶意攻击,尝试暴力破解密码
- 连接池配置错误,导致连接泄漏
解决方案:
- 临时限制连接速率:使用防火墙或pg_hba.conf的connection_limit
- 修复应用程序故障
- 加强认证机制,使用复杂密码和SSL连接
- 优化连接池配置
连接控制案例分析
案例1:连接泄漏导致连接数满
环境:
- GaussDB 200
- 应用程序使用Java+HikariCP连接池
- 配置max_connections=2000
问题现象:
- 数据库连接数持续增长,最终达到max_connections上限
- 应用程序无法建立新连接,报"FATAL: sorry, too many clients already"
- 查看连接状态,发现大量idle连接
分析:
- 应用程序代码中存在连接泄漏,没有正确关闭连接
- 连接池配置的maximumPoolSize设置过大
- 没有配置连接超时和空闲连接回收
解决方案:
- 修复应用程序连接泄漏问题
- 调整连接池配置:java
HikariConfig config = new HikariConfig(); config.setMaximumPoolSize(100); config.setMinimumIdle(10); config.setIdleTimeout(300000); // 5分钟 config.setMaxLifetime(1800000); // 30分钟 - 配置数据库连接超时:sql
ALTER SYSTEM SET idle_in_transaction_session_timeout = 300000; ALTER SYSTEM SET tcp_keepalives_idle = 600; - 创建定时任务清理空闲连接
优化效果:
- 数据库连接数稳定在100-200之间
- 应用程序连接成功率100%
- 系统性能明显提升
案例2:连接风暴导致系统崩溃
环境:
- GaussDB 200
- 电商系统,促销活动期间
- 配置max_connections=5000
问题现象:
- 促销活动开始后,大量用户访问系统
- 数据库连接数瞬间达到max_connections上限
- 系统响应缓慢,最终崩溃
分析:
- 促销活动导致并发用户数突增
- 应用程序没有使用连接池,每个请求创建一个新连接
- 数据库无法处理大量并发连接请求
解决方案:
- 紧急增加max_connections:sql
ALTER SYSTEM SET max_connections = 10000; - 配置连接池,限制实际数据库连接数:java
// HikariCP配置 config.setMaximumPoolSize(500); config.setConnectionTimeout(5000); config.setQueueSize(1000); - 配置pg_hba.conf限制连接速率:
host all all 0.0.0.0/0 md5 connection_limit=1000 - 使用负载均衡器分散连接请求
优化效果:
- 系统成功应对促销活动的高并发访问
- 数据库连接数稳定在500-600之间
- 系统响应时间保持在合理范围内
常见问题(FAQ)
Q1: GaussDB的max_connections设置多大合适?
A1: max_connections的设置需要考虑:
- 系统内存大小:每个连接大约消耗5-10MB内存
- CPU核心数:连接数过多会导致CPU上下文切换频繁
- 存储I/O性能:大量并发连接会增加I/O压力
- 业务需求:OLTP系统需要更多连接,OLAP系统需要较少连接
建议计算公式:max_connections = (系统内存 * 0.8) / 每个连接内存消耗
Q2: 如何查看GaussDB的当前连接数?
A2: 可以通过以下方式查看当前连接数:
sql
-- 查看当前总连接数
SELECT count(*) FROM pg_stat_activity;
-- 查看各状态连接数
SELECT state, count(*) FROM pg_stat_activity GROUP BY state;
-- 查看各用户连接数
SELECT usename, count(*) FROM pg_stat_activity GROUP BY usename;
-- 查看连接数使用率
SELECT count(*) AS current_connections, setting AS max_connections,
round(count(*)::numeric / setting::numeric * 100, 2) AS usage_percent
FROM pg_stat_activity, pg_settings
WHERE name = 'max_connections'
GROUP BY setting;Q3: 如何限制特定用户的连接数?
A3: 可以通过以下方式限制特定用户的连接数:
使用ALTER USER命令:
sqlALTER USER username WITH CONNECTION LIMIT 100;在pg_hba.conf中配置:
host database username address method connection_limit=100
Q4: 如何清理GaussDB的空闲连接?
A4: 可以通过以下方式清理空闲连接:
使用pg_terminate_backend函数:
sqlSELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle' AND state_change < current_timestamp - interval '10 minutes';配置idle_in_transaction_session_timeout参数:
sqlALTER SYSTEM SET idle_in_transaction_session_timeout = 300000;创建定时任务定期清理空闲连接
Q5: 如何防止GaussDB的连接风暴?
A5: 防止连接风暴的方法:
- 配置连接池,限制实际数据库连接数
- 在pg_hba.conf中配置connection_limit参数
- 使用防火墙或负载均衡器限制连接速率
- 配置合理的连接超时参数
- 优化应用程序连接逻辑,避免短时间内发起大量连接请求
Q6: GaussDB支持哪些认证方式?
A6: GaussDB支持多种认证方式:
- trust:信任认证,不需要密码
- ident:基于操作系统用户的认证
- md5:MD5密码认证
- sha256:SHA-256密码认证
- ldap:LDAP认证
- radius:RADIUS认证
- certificate:SSL证书认证
Q7: 如何启用GaussDB的SSL连接?
A7: 启用GaussDB的SSL连接步骤:
- 生成SSL证书和密钥
- 配置SSL参数:sql
ALTER SYSTEM SET ssl = on; ALTER SYSTEM SET ssl_cert_file = 'server.crt'; ALTER SYSTEM SET ssl_key_file = 'server.key'; ALTER SYSTEM SET ssl_ca_file = 'root.crt'; - 重启数据库:bash
gs_ctl restart -D /data/gaussdb/data - 在pg_hba.conf中配置使用SSL连接:
hostssl all all 0.0.0.0/0 md5
Q8: 如何监控GaussDB的连接性能?
A8: 监控GaussDB连接性能的方法:
- 监控连接数变化趋势
- 监控连接建立时间
- 监控连接认证时间
- 监控空闲连接比例
- 监控连接关闭时间
- 使用pg_stat_statements查看连接相关的统计信息
可以使用Prometheus+Grafana等监控工具进行可视化监控,设置连接数阈值告警。
