tcpdump:记一次数据库连接问题

最近在工作构建项目基础环境时,封装美团LEAF的源码,用号段方案构建了一个 RPC 调用的分布式ID服务,并通过 kubernetes 部署。

在容器启动时,dashboard 日志显示数据库连接超时,报 communication link failure。

这里申请的 RDS 服务器为 5,kubernetes 集群 ECS 服务器为 6-9。

第一时间检查的是服务器与数据库对应端口是否能 ping 通。由于在本机已经完成了一部分功能的测试,是在部署环节出现错误,所以可以排除数据库服务器访问和端口未开放的可能性,这个时候报错已经无法提供足够的有效信息。

再一次验证程序无错误后,选择使用 tcpdump 来监听数据库连接过程中发送的信息。

// 监听对应 ip 接收或发送的报文
tcpdump host [db_ip] -vvv -nn -w /var/log/tcpdump/dump-log

// 查看日志文件
tcpdump -r [log_file]

这里启动容器的服务器为 7,监听到的关键的信息简化如下:

7(server) > 5(db)     [S]   (SYN)
5(db)     > 7(server) [S.]  (SYN-ACK)
7(server) > 5(db)     [.]   (ACK)
5(db)     > 7(server) [S.]  (SYN-ACK)
7(server) > 5(db)     [.]   (ACK)
5(db)     > 7(server) [S.]  (SYN-ACK)
7(server) > 5(db)     [.]   (ACK)

这里可以看到,服务器和数据库连通且可以进行通信。根据 TCP 三次握手,多次进行 SYN-ACK 的重传,说明 ACK 未被接收到,即第三次握手的请求未发送到数据库服务器。这时可以意识到,还是网络通信出现的问题,于是联系管理数据库的同事,经查找得知数据库权限在当前服务器网段未放行,问题解决。