1 集群版本
GaussDB A 8.0及6.5.1版本
2 问题描述
客户端使用与数据库建好的连接报错:An I/O error occurred while sending to the backend.
3 原理分析
正如2.3.2中所说,当数据库侧由于某种原因将连接断开,应用侧再次使用此连接就会产生这个报错。而数据库侧连接异常断开主要有四种原因:1. CN进程异常重启;2. session超时;3. 人为kill session;4. LVS中virtual router id冲突。
4 定位方法
- 查看CN进程是否异常重启
- ps -eo pid,lstart,etime,cmd | grep coo
如果连接在CN进程启动之前就存在,那么CN进程重启之后,连接就会断开,业务侧继续使用则会报错。
- 未达到session_timeout时间就报错
如果不存在CN重启,且时间未到设置的session_timeout,或者业务正在运行中就产生此报错,可排查LVS中的virtual router id是否冲突。
查看OS日志,搜索Keepalive字段,若存在如下图字样,即为冲突,可修改主备LVS配置文件后,重启LVS即可:.
/etc/keepalived/keepalived.conf:文件中virtual_router_id字段,同一子网下不可冲突
/etc/init.d/gs_keepalived restart:重启LVS
- 排查CN日志是否含有due to
非常清晰的两种情况,根据日志中相应时间分析;
调用select pg_terminate_backend(pid); 终止了会话,多数是用户操作产生,个别情况是由于cm_agent在检测磁盘超过阈值(默认90%)场景下,会调用此方法终止当前CN上所有非omm用户的SQL,同时会打印调用日志“cancel session ok”,可排查cm_agent日志。
会话设置了session_timeout时间,当超过此时间,数据库会自动清理连接。对于需要保持长连接的场景。可通过客户端对此session设置session_timeout为0或预期时长。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/316472.html