在 GNU/Linux 中,我制作的应用程序存在问题。它在我的开发环境中工作,大部分组件在docker中或本机运行,但在需要部署的服务器环境中随机(经常但并非总是)失败。
基础设施:
[App in Ubuntu Server 20.04 host-1] <--->[router+firewall]<---> [Ubuntu Server 20.04 host-2]
两台服务器似乎都有足够的资源 - 4 个 CPU、4 GB RAM。
运行应用程序的机器必须连接到在该 host2 中运行的 RabbitMQ,并且在不同的队列中发布(我在这里没有看到失败)和订阅(这往往会失败)。
问题:有时它可以工作(有路由器+防火墙,但问题似乎不存在),但很多时候,由于某种原因,两个连接都会随机失败。我检查了 MTU(1500,它适用于其他部署),ulimit 似乎没问题,等等,但我没有发现问题......
很多时候 Rabbit 连接都会启动,但最终我会收到 Rabbit 错误消息:
AMQPConnector - reporting failure: AMQPConnectorAMQPHandshakeError: ProbableAuthenticationError
[..]("ConnectionClosedByBroker: (403) 'ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.'"
这不是真的,因为我 100% 确定这些凭据是可以的,事实上,它们有时会起作用。
重试连接,但没有成功。
来自兔子日志:
[info] <0.16188.30> Closing all channels from connection
'xxx.yyy.zzz.kkk:41426 -> yyy.zzz.kkk.zzz:5672' because it has been
closed
[info] <0.16192.30> accepting AMQP
connection <0.16192.30> (xxx.yyy.zzz.kkk:41430 ->
yyy.zzz.kkk.zzz:5672)
[error] <0.16192.30>
Error on AMQP connection <0.16192.30> (xxx.yyy.zzz.kkk:41430 ->
yyy.zzz.kkk.zzz:5672, state: starting): PLAIN login refused: user
'someuser' - invalid credentials
我尝试了500和90的心跳,以及300的阻塞连接超时......
对我来说,有时似乎没有收到心跳。
我很迷茫,我想这可能是性能或网络问题,因为在其他受控环境中这有效,那么,我可以检查什么?
答案1
好吧,令人惊讶的是,最明显的原因似乎是实际原因:云计算平台中的虚拟网络被损坏。
调试过程是如何完成的(为了说服网络工程师检查):
- 应用来自不同网络的网络分析工具(traceroute、nmap)。在客户端和服务器之间完成连接的地方,某些端口出现故障。
- 从不同虚拟机到同一目的地的 SSH 和 SCP...从某些网络,它可以工作,但在客户端和服务器之间完成连接的网络中,它失败 - 登录失败,可能是在握手协商中,登录期间管道损坏,连接已建立,但一旦输入任何内容,管道就会断开......
- [大量日志和屏幕截图来证明这一点并指导网络工程师]
这是我停止研究 Rabbit 配置/参数等的时候。
最后,强制使用另一个网络进行云部署,并且成功了。
这最终确认是网络问题,并将问题转移给网络工程师。