这是2014年碰到的一个问题,用户上线了一套业务系统,这套业务系统由WEB服务器和数据库服务器组成,在测试阶段发现客户端在访问业务系统的时候经常无法登陆,在输入用户名和密码后无法正常登陆系统,业务系统的开放商说客户端登陆的时候正是WEB服务器访问数据库服务器的时候,按照这个说法,在这个节点的访问有问题。
于是我们在WEB服务器上进行抓包,抓取了一段时间,发现了下面的情况:
防火墙未配置长连接导致oracle异常_第1张图片
上图中,web服务器在空闲13266秒后向oracle数据库发起请求,但是oracle数据库并没有回应,导致web服务器一直在重传这个数据包,最后web服务器发了rst包,单方向终止了这个TCP会话。
结合这个故障现象,大家想到了两台服务器之间的防火墙,这是两个不同网段服务器之间唯一的安全设备,并且防火墙的会话有超时时间,会不会是这个原因呢,查资料发现该防火墙的TCP会话超时时间默认为30分钟,截图中的数据库访问已经是在3个小时以后了,根据这些情况,我们修改了1521端口的超时时间,因为数据库工程师表示oracle的会话在现有环境中永不超时,那么我们针对1521端口的超时时间也调整为永不超时,调整完成后,故障解除。
很可惜,这次没有在oracle服务器端抓包,这是在web服务器上抓了包,现场没有这个条件,因为两个方向比较更加有说服力。