背景
2019年8月12日~8月13日,ESB调数据湖接口接连失败两次,ESB端报SocketTimeout异常,每次持续时间大约30分钟~1小时:
java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
………………………………………………………………………………
问题分析
从Esb那边的日志分析,是esb到数据湖元数据库的F5有超时,这个F5后面挂着数据湖元数据库的两台服务器。
1、与网络组同事查看F5日志,由于未在其上部署探针,因此查看不到当时的网络数据。
2、在数据湖元数据库两台服务器上进行抓包
tcpdump -i ens192 IP1 -w /tmp/ens192-sas.cap
分析发现TCP数据流存在建链失败情况,F5向数据湖元数据库节点IP1发起SYN包,然而IP1未进行ACK,F5重试两次后超时,最终TCP握手失败。这里要说明的是,并非F5的所有请求都会建链失败,有一部分请求是正常的。
由此推测可能存在如下几种情况:
1、Kernel根据内核参数、NetFilter策略,丢弃了SYN包;
2、数据湖应用达到连接上限,丢弃SYN包;
问题定位
1、检查操作系统TCP统计信息,发现SYN包有被丢弃情况:
Shell> netstat -s|grep -i drop
3020 SYNs to LISTEN sockets dropped
2、查看iptables规则,观察策略正常
Shell> iptables -L -n -v
Chain INPUT (policy ACCEPT 328M packets, 104G bytes) ——input(负责过滤入本机的数据包)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) ——forward(负责转发流经但不进入本机的数据包)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0