GaussDB主机流控,导致大量业务超时并且无法新建连接
- 问题现象
客户反馈,15:25之前是大量SQL执行超时,从15:25开始无法创建连接。
- 分析思路
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. 查看异常时间段数据库监控指标。
− 首先查看资源使用情况,6月13日15:20分左右,cpu、内存使用率无显著突增,表明资源使用无异常。

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


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

4. 查看流控相关指标。
异常时间段产生主机流控,流控时间达到180000s。

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

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


7.查找SQL语句。
跟踪WDR报告分析,执行次数最多的两条SQL语句为:3803763747、262602308。

进一步根据unique_sql_id,定位到产生流控的主要SQL语句为:
1、unique_sql_id为3803763747的INSERT INTO cmf_fis.wind_bondanninf语句;
2、unique_sql_id为262602308的INSERT 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增大,在主机故障时,主备机切换的时长可能增加。

流控为主机业务压力与RTO两者之间的综合选择,需要根据实际业务特点慎重配置。
极致RTO说明
普通串行回放:

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

问题实例CPU利用率均比较低,且产生流控根本原因为备机回放慢导致,因此评估开启极致RTO,可有效提高日志回放速率。
- 点赞
- 收藏
- 关注作者
评论(0)