Skip to content

GaussDB 连接控制配置与管理

GaussDB的连接控制是数据库性能和稳定性管理的重要组成部分。通过合理配置连接控制参数,可以防止连接风暴、优化资源使用、提高系统安全性。连接控制主要包括连接数限制、连接超时管理、连接认证控制等方面。

连接控制核心参数

连接数限制参数

参数名描述默认值建议值
max_connections允许的最大并发连接数5000根据系统资源和业务需求调整
superuser_reserved_connections为超级用户保留的连接数3010-50
unix_socket_max_connectionsUnix套接字允许的最大连接数-1(无限制)-1
max_prepared_transactions允许的最大预备事务数00(禁用)

连接超时参数

参数名描述默认值建议值
connect_timeout客户端连接超时时间(秒)105-30
tcp_keepalives_idleTCP连接空闲时间(秒)7200600-3600
tcp_keepalives_intervalTCP保活探测间隔(秒)7515-60
tcp_keepalives_countTCP保活探测次数93-10
idle_in_transaction_session_timeout事务空闲超时时间(毫秒)0(禁用)300000(5分钟)

连接认证参数

参数名描述默认值建议值
authentication_timeout认证超时时间(秒)6010-30
password_encryption_type密码加密类型md5sha256
krb_server_keyfileKerberos服务器密钥文件路径''根据Kerberos配置
ldap_urlLDAP服务器URL''根据LDAP配置

连接控制配置方法

修改连接控制参数

  1. 使用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';
  2. 修改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
  3. 使用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支持多种连接池:

  1. 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 = 20
  2. pgpool-II

    txt
    # pgpool.conf配置示例
    listen_addresses = '*'
    port = 9999
    num_init_children = 100
    max_pool = 20
    child_life_time = 300
    client_idle_limit = 300
  3. 应用层连接池

    • Java:HikariCP、Druid
    • Python:SQLAlchemy、psycopg2连接池
    • Go:pgx连接池

连接管理策略

1. 连接数优化

  • 根据系统资源调整

    • 计算公式:max_connections = (系统内存 - 其他进程占用内存) / 每个连接平均内存消耗
    • 每个连接平均内存消耗约为5-10MB
    • 例如:64GB内存的服务器,建议max_connections设置为2000-4000
  • 预留超级用户连接

    sql
    ALTER 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';
  • 配置认证超时

    sql
    ALTER 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等慢速认证方式
  • 限制认证超时

    sql
    ALTER 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设置过大
  • 没有配置连接超时和空闲连接回收

解决方案

  1. 修复应用程序连接泄漏问题
  2. 调整连接池配置:
    java
    HikariConfig config = new HikariConfig();
    config.setMaximumPoolSize(100);
    config.setMinimumIdle(10);
    config.setIdleTimeout(300000); // 5分钟
    config.setMaxLifetime(1800000); // 30分钟
  3. 配置数据库连接超时:
    sql
    ALTER SYSTEM SET idle_in_transaction_session_timeout = 300000;
    ALTER SYSTEM SET tcp_keepalives_idle = 600;
  4. 创建定时任务清理空闲连接

优化效果

  • 数据库连接数稳定在100-200之间
  • 应用程序连接成功率100%
  • 系统性能明显提升

案例2:连接风暴导致系统崩溃

环境

  • GaussDB 200
  • 电商系统,促销活动期间
  • 配置max_connections=5000

问题现象

  • 促销活动开始后,大量用户访问系统
  • 数据库连接数瞬间达到max_connections上限
  • 系统响应缓慢,最终崩溃

分析

  • 促销活动导致并发用户数突增
  • 应用程序没有使用连接池,每个请求创建一个新连接
  • 数据库无法处理大量并发连接请求

解决方案

  1. 紧急增加max_connections:
    sql
    ALTER SYSTEM SET max_connections = 10000;
  2. 配置连接池,限制实际数据库连接数:
    java
    // HikariCP配置
    config.setMaximumPoolSize(500);
    config.setConnectionTimeout(5000);
    config.setQueueSize(1000);
  3. 配置pg_hba.conf限制连接速率:
    host    all             all             0.0.0.0/0               md5 connection_limit=1000
  4. 使用负载均衡器分散连接请求

优化效果

  • 系统成功应对促销活动的高并发访问
  • 数据库连接数稳定在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: 可以通过以下方式限制特定用户的连接数:

  1. 使用ALTER USER命令:

    sql
    ALTER USER username WITH CONNECTION LIMIT 100;
  2. 在pg_hba.conf中配置:

    host    database        username        address                 method connection_limit=100

Q4: 如何清理GaussDB的空闲连接?

A4: 可以通过以下方式清理空闲连接:

  1. 使用pg_terminate_backend函数:

    sql
    SELECT pg_terminate_backend(pid)
    FROM pg_stat_activity
    WHERE state = 'idle' AND state_change < current_timestamp - interval '10 minutes';
  2. 配置idle_in_transaction_session_timeout参数:

    sql
    ALTER SYSTEM SET idle_in_transaction_session_timeout = 300000;
  3. 创建定时任务定期清理空闲连接

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连接步骤:

  1. 生成SSL证书和密钥
  2. 配置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';
  3. 重启数据库:
    bash
    gs_ctl restart -D /data/gaussdb/data
  4. 在pg_hba.conf中配置使用SSL连接:
    hostssl    all             all             0.0.0.0/0               md5

Q8: 如何监控GaussDB的连接性能?

A8: 监控GaussDB连接性能的方法:

  • 监控连接数变化趋势
  • 监控连接建立时间
  • 监控连接认证时间
  • 监控空闲连接比例
  • 监控连接关闭时间
  • 使用pg_stat_statements查看连接相关的统计信息

可以使用Prometheus+Grafana等监控工具进行可视化监控,设置连接数阈值告警。