前言
因为服务要从公网连接Redis, 而走公网延迟又不稳定,所以通过专线走了内网。
完整的链路是这样的的, Node -> 内网Nginx -> GCP内网 -> 阿里云专线 -> 阿里云内网Redis
所以, 我们需要让应用连接到内网的Nginx端口.
但是在配置过程中却发现了一个奇怪的事情。 明明配置了指定的IP,但是程序连接的时候却直接连接到了阿里云的内网Redis IP。

解决
在出现问题的节点上抓6379端口的包
1 | tcpdump tcp port 6379 -i ens33 -w /tmp/6379_save.cap |
拖到 wireshark 里面看看.
说实话,其实第一次抓包看起来并没有什么头绪,因为你没办法定位到为什么会连接错IP。 只是单纯的看到客户端一直在发SYN,然后没有ACK响应。
重新理了一遍逻辑,通过
netstat -anput | grep dotnet
实际上发现, 业务有一部分在连正常的IP端口. 之前分析数据包也能看出来一部分正常一部分异常。
研发怀疑是Redis连接池的问题, 但是配置也仅仅只有一个配置,为什么会出现这种情况呢?
仔细从第一次程序发送错误的IP,SYN数据往上回溯, 终于发现了端倪。

可以看到, 程序在连接redis成功以后, 发了一个cluster nodes的命令。

Redis正常返回了数据, 其中的内容刚好是Redis内网的端口, 并且在下一步, 立马出现了对于这个IP建立连接的SYN请求.
总结
这种抓包还是要从出问题的地方往上翻一下才行。。