1. 首页 > 国产数据库教程 > openGauss教程 > 正文

opengauss教程FG077-openGauss连接数过高与超时生产实战解析

内容简介:本文深入讲解openGauss数据库连接数过高与超时的原因与优化方法。风哥教程参考openGauss官方文档openGauss6系统管理员手册、openGauss6性能调优指南,帮助DBA掌握连接管理的技巧,确保数据库稳定高效运行。

目录大纲

Part01-基础概念与理论知识

1.1 数据库连接的基本概念

数据库连接是应用程序与数据库之间的通信通道,是数据库操作的基础。

数据库连接相关概念:
1. 连接数:当前数据库的活跃连接数量
2. 最大连接数:数据库允许的最大连接数量
3. 连接池:管理数据库连接的缓存池
4. 连接超时:连接建立或操作的超时时间
5. 空闲连接:建立但未使用的连接
6. 活跃连接:正在执行操作的连接

1.2 连接数过高的原因

openGauss数据库连接数过高的常见原因:

连接数过高的原因:
1. 应用程序连接管理不当:没有使用连接池,每次操作都创建新连接
风哥提示:
2. 连接泄漏:应用程序没有正确关闭连接
3. 高并发访问:大量并发请求导致连接数激增
4. 长事务:长事务占用连接时间过长
5. 参数设置不合理:max_connections设置过小

1.3 连接超时的原因

openGauss数据库连接超时的常见原因:

连接超时的原因:
1. 网络问题:网络延迟或中断
2. 数据库负载过高:数据库处理能力不足
3. 连接池配置不当:连接池超时设置不合理
4. 防火墙配置:防火墙阻止连接
5. 参数设置不合理:connect_timeout等参数设置不合理

Part02-生产环境规划与建议

2.1 连接池规划

连接池规划是避免连接数过高的基础:

连接池规划要点:
1. 连接池选型:
– 应用层面:使用HikariCP、Druid等连接池
– 数据库层面:使用pgBouncer等连接池
2. 连接池配置:
– 最大连接数:根据系统资源和并发需求设置学习交流加群风哥微信: itpux-com
– 最小空闲连接数:保持适量的空闲连接
– 连接超时:合理设置连接获取超时时间
– 空闲连接超时:及时回收空闲连接
3. 监控配置:
– 监控连接池使用情况
– 设置连接池告警阈值

2.2 连接监控体系设计

建立完善的连接监控体系:

连接监控体系要点:
1. 连接数监控:监控当前连接数和最大连接数
2. 连接状态监控:监控连接的活跃状态
3. 连接来源监控:监控连接的来源和应用
4. 连接使用监控:监控连接的使用情况和时长
5. 告警机制:设置连接数和连接超时告警

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

3.1 连接参数优化

优化连接相关参数:

# gsql -h 192.168.1.10 -d fgedudb -U fgedu -W fgedu_password

— 查看当前连接相关参数
SHOW max_connections;
SHOW superuser_reserved_connections;
SHOW idle_in_transaction_session_timeout;
SHOW statement_timeout;
SHOW connect_timeout;

max_connections
—————–
100
(1 row)学习交流加群风哥QQ113257174

superuser_reserved_connections
——————————–
10
(1 row)

idle_in_transaction_session_timeout
———————————–
0
(1 row)

statement_timeout
——————
0
(1 row)

connect_timeout
—————-
10s
(1 row)

— 优化连接相关参数
ALTER SYSTEM SET max_connections = 500;
# 增加最大连接数
ALTER SYSTEM SET superuser_reserved_connections = 20;
# 增加超级用户预留连接数
ALTER SYSTEM SET idle_in_transaction_session_timeout = ‘300s’;
# 设置空闲事务超时
ALTER SYSTEM SET statement_timeout = ‘600s’;
# 设置语句超时

— 重新加载配置
SELECT pg_reload_conf();

ALTER SYSTEM
pg_reload_conf
—————-
t
(1 row)

更多视频教程www.fgedu.net.cn

3.2 连接池配置

配置应用层面的连接池(以Druid为例):

# cat /app/config/druid.properties

# Druid连接池配置
druid.driverClassName=org.postgresql.Driver
druid.url=jdbc:postgresql://192.168.1.10:5432/fgedudb
druid.username=fgedu
druid.password=fgedu_password

# 连接池配置
druid.initialSize=10 # 初始连接数
druid.minIdle=10 # 最小空闲连接数
druid.maxActive=200 # 最大连接数
druid.maxWait=60000 # 获取连接超时时间
druid.timeBetweenEvictionRunsMillis=60000 # 连接检测间隔
druid.minEvictableIdleTimeMillis=300000 # 连接最小空闲时间
druid.validationQuery=SELECT 1 # 验证连接的SQL
druid.testWhileIdle=true # 空闲时验证
druid.testOnBorrow=false # 获取连接时验证
druid.testOnReturn=false # 归还连接时验证

Part04-生产案例与实战讲解

4.1 连接数监控实战

实战演示连接数监控:

# gsql -h 192.168.1.10 -d fgedudb -U fgedu -W fgedu_password

— 查看当前连接数
SELECT count(*) FROM pg_stat_activity;

count
——-
25
(1 row)

— 查看连接状态分布
SELECT
state,
count(*)
FROM pg_stat_activity
GROUP BY state;更多学习教程公众号风哥教程itpux_com

state | count
———+——-
active | 5
idle | 20
(2 rows)

— 查看连接来源
SELECT
client_addr,
count(*)
FROM pg_stat_activity
GROUP BY client_addr
ORDER BY count(*) DESC;

client_addr | count
————–+——-
192.168.1.20 | 15
192.168.1.21 | 8
192.168.1.22 | 2
(3 rows)

4.2 连接数优化实战

from DB视频:www.itpux.com

实战演示连接数优化:

— 查看空闲连接
SELECT
pid,
usename,
application_name,
client_addr,
state,
now() – backend_start AS connected_time
FROM pg_stat_activity
WHERE state = ‘idle’
ORDER BY connected_time DESC
LIMIT 10;

pid | usename | application_name | client_addr | state | connected_time
——-+———+——————+————–+——-+———————-
12345 | fgedu | psql | 192.168.1.20 | idle | 00:30:00
12346 | fgedu | psql | 192.168.1.20 | idle | 00:25:00
12347 | fgedu | psql | 192.168.1.20 | idle | 00:20:00
(3 rows)

— 终止长时间空闲连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = ‘idle’ AND now() – backend_start > interval ’10 minutes’;

pg_terminate_backend
———————-
t
t
t
(3 rows)

4.3 连接超时处理

处理连接超时问题:

# vi /opengauss/fgdata/postgresql.conf

# 连接超时配置
connect_timeout = 10 # 连接超时时间(秒)
idle_in_transaction_session_timeout = 300000 # 空闲事务超时(毫秒)
statement_timeout = 600000 # 语句执行超时(毫秒)

# gs_ctl reload -D /opengauss/fgdata

server signaled

4.4 连接监控脚本

编写连接监控脚本:

# cat /opengauss/scripts/connection_monitor.sh

#!/bin/bash
# connection_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# openGauss连接监控脚本

LOG_DIR=”/opengauss/log/connection”
mkdir -p $LOG_DIR
LOG_FILE=”$LOG_DIR/connection_monitor_$(date ‘+%Y%m%d’).log”

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a $LOG_FILE
}

check_connection_status() {
log “=== 连接状态监控 ===”

# 当前连接数
total_connections=$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT count(*) FROM pg_stat_activity;
” | tr -d ‘ ‘)
log “当前连接数: $total_connections”

# 最大连接数
max_connections=$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SHOW max_connections;
” | tr -d ‘ ‘)
log “最大连接数: $max_connections”

# 连接状态分布
log “连接状态分布:
$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT
state,
count(*)
FROM pg_stat_activity
GROUP BY state;
“)”

# 连接来源
log “连接来源:
$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT
client_addr,
count(*)
FROM pg_stat_activity
GROUP BY client_addr
ORDER BY count(*) DESC;
“)”
}

check_idle_connections() {
log “=== 空闲连接监控 ===”

# 长时间空闲连接
idle_connections=$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT
pid,
usename,
application_name,
client_addr,
now() – backend_start AS connected_time
FROM pg_stat_activity
WHERE state = ‘idle’ AND now() – backend_start > interval ’10 minutes’
ORDER BY connected_time DESC;
“)

if [ -n “$idle_connections” ]; then
log “发现长时间空闲连接:
$idle_connections”

# 终止长时间空闲连接
log “终止长时间空闲连接…”
gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = ‘idle’ AND now() – backend_start > interval ’10 minutes’;

else
log “未发现长时间空闲连接”
fi
}

check_connection_parameters() {
log “=== 连接参数监控 ===”

# 连接相关参数
log “连接相关参数:
$(gsql -h 192.168.1.10 -d fgedudb -U fgedu -t -c ”
SHOW max_connections;
SHOW superuser_reserved_connections;
SHOW idle_in_transaction_session_timeout;
SHOW statement_timeout;
SHOW connect_timeout;
“)”
}

main() {
log “开始连接监控检查…”
check_connection_status
check_idle_connections
check_connection_parameters
log “连接监控检查完成”
}

main

# chmod +x /opengauss/scripts/connection_monitor.sh
# /opengauss/scripts/connection_monitor.sh

[2024-01-15 14:30:00] 开始连接监控检查…
[2024-01-15 14:30:00] === 连接状态监控 ===
[2024-01-15 14:30:00] 当前连接数: 25
[2024-01-15 14:30:00] 最大连接数: 500
[2024-01-15 14:30:00] 连接状态分布:
active | 5
idle | 20
[2024-01-15 14:30:00] 连接来源:
192.168.1.20 | 15
192.168.1.21 | 8
192.168.1.22 | 2
[2024-01-15 14:30:00] === 空闲连接监控 ===
[2024-01-15 14:30:00] 发现长时间空闲连接:
12345 | fgedu | psql | 192.168.1.20 | 00:30:00
12346 | fgedu | psql | 192.168.1.20 | 00:25:00
12347 | fgedu | psql | 192.168.1.20 | 00:20:00
[2024-01-15 14:30:00] 终止长时间空闲连接…
[2024-01-15 14:30:00] === 连接参数监控 ===
[2024-01-15 14:30:00] 连接相关参数:
500
20
300s
600s
10s
[2024-01-15 14:30:00] 连接监控检查完成

# crontab -l

# 每5分钟执行一次连接监控
*/5 * * * * /opengauss/scripts/connection_monitor.sh > /dev/null 2>&1

Part05-风哥经验总结与分享

5.1 连接管理优化经验

风哥提示:连接管理是数据库性能的重要组成部分,需要从多个层面进行优化。

连接管理优化经验:
1. 使用连接池:应用程序使用连接池管理数据库连接
2. 合理设置参数:根据系统资源和业务需求设置连接数相关参数
3. 定期清理空闲连接:及时回收长时间空闲的连接
4. 监控连接状态:建立完善的连接监控体系
5. 优化应用代码:避免连接泄漏,正确关闭连接

连接管理注意事项:
1. 最大连接数不宜设置过大,否则会消耗过多系统资源
2. 连接池配置需要根据实际并发需求调整
3. 长时间空闲的连接应该及时回收
4. 连接超时设置需要合理,避免过短或过长
5. 定期监控连接状态,及时发现异常情况

5.2 最佳实践建议

连接管理最佳实践:
1. 应用层面:
– 使用连接池管理数据库连接
– 正确关闭连接,避免连接泄漏
– 合理设置连接池参数

2. 数据库层面:
– 根据系统资源设置合理的最大连接数
– 配置连接超时参数
– 定期清理空闲连接

3. 监控管理:
– 监控连接数和连接状态
– 设置连接数告警阈值
– 分析连接使用模式

4. 网络层面:
– 确保网络稳定
– 合理设置网络超时参数
– 防火墙配置允许数据库连接

最佳实践总结:
1. 连接管理是数据库运维的重要组成部分
2. 使用连接池可以有效管理数据库连接
3. 合理的参数设置可以提高连接管理效率
4. 定期监控和清理可以避免连接数过高
5. 连接管理优化需要从应用、数据库和网络多个层面入手

总结:本文详细介绍了openGauss数据库连接数过高与超时的原因与优化方法。通过使用连接池、优化参数配置、定期清理空闲连接等多种手段,可以有效管理数据库连接,避免连接数过高和超时问题。连接管理需要从应用、数据库和网络多个层面入手,建立完善的监控体系,及时发现和解决问题,确保数据库系统的稳定高效运行。

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

联系我们

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

微信号:itpux-com

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