我有几个使用 nginx 的服务器,有大量的传出流量。当带宽耗尽(1Gbit)时,我无法从这些服务器连接到我的 mysql 服务器。
连接总是失败并显示以下消息:
mysql 连接失败,SQLSTATE[HY000] [2013] 在“读取授权包”时与 MySQL 服务器失去连接,
带宽已耗尽,但我希望连接和数据传输速度会更慢。但连接完全失败。经过几次尝试后,有时会成功。一旦连接,它就可以正常工作。
所有其他服务(Ssh、http)也运行良好。
我该如何解决这个问题以及为什么会发生这种情况?
答案1
如果连接真的饱和到无法再往管道中塞入更多数据的程度,您就会丢失数据包。如果短时间内同一连接丢失了足够多的数据包,那么根据已知的 TCP 机制,该连接可能会被丢弃。
如何解决...
首先,显而易见的是:获取一个可以处理流量的连接。如果超载,那就超载吧。
其次,如果可能的话,你可以/应该为数据库连接设置专用连接。隔离流量,这样一条千兆链路的占满不会干扰另一条链路。
第三,找出真正占用所有带宽的流量。如果是不需要的流量,请阻止它。如果它来自整个互联网,请让您的上游/带宽提供商阻止它。
答案2
由于您与 mysql 服务器的连接存在错误,连接可能会因“握手错误”而被服务器断开。您之所以会看到此错误,是因为服务器将决定不再向套接字写入任何内容,因为它没有从客户端看到任何内容,并且将强制执行标志“net->error= 2”(这可以在 net_serv.cc 中的函数“my_real_read”中看到)。
此标志的作用是,即使服务器调用一个函数将实际记录的错误写入网络并返回给客户端,该错误也会被丢弃。通常记录的“糟糕的握手”错误是由于饱和的网络超时造成的。
Mysql 连接超时非常小。我认为默认情况下是 5 秒,您可以在 my.cnf 中使用“connect_timeout”系统变量将其从默认的 5 增加到 20。这应该会有所帮助,一旦建立连接,您将在饱和网络中超时时退出。设置到 DB 服务器的第二个网络路径。