GaussDB主机流控,导致大量业务超时并且无法新建连接

举报
GaussDB 数据库 发表于 2025/12/09 08:56:34 2025/12/09
【摘要】 问题现象客户反馈,15:25之前是大量SQL执行超时,从15:25开始无法创建连接。分析思路l   突然出现SQL超时,可能是因为并发突增和、IO打满、资源打满等,可优先通过监控查看资源使用情况以及并发数。l   无法新建连接,可能是因为连接数满、连接不释放、中间件连接数满等情况。问题分析1.获取业务报错信息。获取业务报错信息,根据业务连接池机制分析以下报错信息,业务连接池连接数为20,当连...
  • 问题现象

客户反馈,1525之前是大量SQL执行超时,从1525开始无法创建连接。

  • 分析思路

l   突然出现SQL超时,可能是因为并发突增和、IO打满、资源打满等,可优先通过监控查看资源使用情况以及并发数。

l   无法新建连接,可能是因为连接数满、连接不释放、中间件连接数满等情况。

  • 问题分析

1.获取业务报错信息。

获取业务报错信息,根据业务连接池机制分析以下报错信息,业务连接池连接数为20,当连接被占满并长时间不释放,业务新建连接失败。因此怀疑业务连接池到数据库的连接未及时释放,继续分析数据库相关指标及日志。

2024-06-13 15:25:02 [traceId:40093804-1545-4937-ab7e-5246d06de9b7] [ERROR] [http-nio-8015-exec-227] [com.cmfchina.fis.capital.apply.job.CapitalJobController:72] -- capitalStatusRefresh>>>fail
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 20, maxActive 20, creating 0, createErrorCount 1

2. 查看异常时间段数据库监控指标。

 首先查看资源使用情况,6131520分左右,cpu、内存使用率无显著突增,表明资源使用无异常。

5421.png

 其次查看会话连接情况,6131520分左右,在线会话数略有升高,活跃会话数有显著升高,由15增加到35,表明数据库连接数增加。

5422.png

5423.png

3. 查看SQL语句分布情况。

dn_6001为主DN,根据SQL语句对比,dn_600198%SQL语句为insert语句。当insert语句占比高的时候,通常可能产生流控,因此继续分析流控情况。

5431.png

4. 查看流控相关指标。

异常时间段产生主机流控,流控时间达到180000s

5432.png

5.查看DN运行日志。

dn_6002,dn_6003均产生流控,同时根据日志,以dn_6002为例,备机接收日志位置为:362E/20A4A000,备机回放位置为:362C/BF72D920,因此表明,备机回放慢导致产生主机流控。

5435.png

6. 分析gs_asp采样数据以及wdr报告。

查询gs_asp采样数据以及wdr报告,发现主要的等待事件为:LOGCTRL_SLEEPwait wal sync,该等待事件表明产生主机流控。

5436.png

5436-1.png

7.查找SQL语句。

跟踪WDR报告分析,执行次数最多的两条SQL语句为:3803763747262602308

5437.png

进一步根据unique_sql_id,定位到产生流控的主要SQL语句为:

1unique_sql_id3803763747INSERT INTO cmf_fis.wind_bondanninf语句;

2unique_sql_id262602308INSERT INTO cmf_fis.t_fis_news_port_rel_dm_v4语句。

  • 根本原因

综上分析:

由于大量的insert语句,主机产生xlog多,由于备机回放速率赶不上主机xlog产生速率,触发了主机流控,进而导致已有连接不释放,因此业务新建连接超时。

  • 解决措施

临时解决方案:

通常当产生主机流控,执行以下命令关闭流控,进行应急恢复:

gs_guc reload -Z datanode -N all -I all -c "recovery_time_target=0"

长期解决方案:

a. 恢复流控参数阈值为30min

gs_guc reload -Z datanode -N all -I all -c "recovery_time_target=1800"

b.开启极致RTO,该参数设置后需要重启集群生效。

gs_guc set -Z datanode -N all -I all -c "recovery_parse_workers=2"

gs_guc set -Z datanode -N all -I all -c "recovery_redo_workers=4"
  • 补充说明

流控原理说明

在备机回放日志的能力跟不上主机时,通过在walsender线程中进行一定时间的sleep来降低日志发送速度,让备机来得及回放已接收的日志。也就是当备机接收日志或者回放日志的能力跟不上主机时,通过强制降低主机的业务性能,来保证主备机的日志差异在一定目标范围。

因此,关闭流控,可能存在主备机之间的RTO增大,在主机故障时,主备机切换的时长可能增加

5437-1.png

流控为主机业务压力与RTO两者之间的综合选择,需要根据实际业务特点慎重配置。

极致RTO说明

普通串行回放:

5437-2.png

极致RTO

xLog日志回放建立多级流水线,提高并发度,提升日志回放速度。

5437-3.png

问题实例CPU利用率均比较低,且产生流控根本原因为备机回放慢导致,因此评估开启极致RTO,可有效提高日志回放速率。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。