我们有两台服务器,即
host1.example.com
host2.example.com
其中一个充当我们两个主要网站 example.com 和 example2.com 的主要 Web 服务器。另一个充当备份,我们可以通过更改 DNS 记录将流量切换到该备份。
example.com 和 example2.com 是两个独立的网站,但它们各自依赖对方的 API。因此,example.com 上的页面通常会向以下形式的端点发出 curl 请求https://example2.com/api/endpointa,example2.com 上的页面将向以下形式的端点发出 curl 请求https://example.com/api/endpointb。这些是从后端 php 代码发出的 curl 请求。
直到最近,这一切都没有问题。然而,最近这些请求偶尔会失败。我们每天大约会收到 5 次此类站点间 API 请求失败的日志消息,每个站点每天发出大约 10 万个此类请求。
查看服务器的 dom 日志,在故障期间没有记录任何传入请求,因此它们实际上并没有作为传入请求到达 Apache。在发送方,curl 请求~基本上是即时出错,没有收到 http 状态代码。~实际上看起来它们正在超时。通常它们几乎立即返回,但现在它们正在达到(长时间)超时。但同样,这种情况只会非常间歇地发生。
这些故障仅发生在发送到 host1 的请求中,无论这些请求是源自 host1 本身还是 host2。(我尝试在 host1 上运行 example.com,在 host2 上运行 example2.com,反之亦然,并在两个主机上运行两个站点,以确认这一点。)
据我所知,它们似乎不是服务器负载的症状。CPU 负载和内存使用量都比服务器过去成功处理的要低得多。Apache 线程也是如此(尽管如果那是问题所在,我希望在 apache dom 日志和错误日志中看到已收到请求的一些迹象)。
它似乎就像网络问题一样,因为它是间歇性的,请求似乎永远无法到达服务器。此外,由于这些服务器几乎相同,而且这种情况只发生在其中一台服务器上。但奇怪的是,即使两个站点都托管在同一台服务器上,这种情况也会发生。在这种情况下,我不确定为什么请求会通过外部网络路由。
所以,我有点不知道该测试什么。当使用外部域向托管在同一服务器上的站点发出 curl 请求时,外部网络会起作用吗?也就是说,可能是数据中心的交换机丢包了或者类似的东西?如果不是,我还可以检查什么?
编辑:另一个线索是,这些故障与一天中的繁忙时段不符,此时流量约为平均水平的两倍,远高于夜间水平。当流量较低时,它们似乎也经常发生,这再次向我表明这是服务器之外的问题。只是想弄清楚服务器之外的什么可能导致从 host1.example.com 到托管在同一服务器上的 example.com 上的页面的 curl 请求被丢弃。
答案1
事实证明,问题在于我们每天多次下载大型 feed 文件并将其导入 MariaDB。文件导入不会造成问题,因为它们自然会受到互联网的限制。但是,我们还在服务器之间设置了复制,当导入每个大型表时,它会将大量数据放入二进制日志中,然后这些数据会被拉到其他服务器。这些网络流量峰值非常大,因为服务器相邻,没有外部瓶颈来减慢传输速度,这与我们看到的连接断开相吻合。
如果有必要,我们可以从复制中删除此数据库,并以另一种方式分发导入的文件。不过,首先我要研究一下我们是否可以限制或降低数据库复制流量的优先级,以免连接达到最大值。
编辑:看起来我们可以使用这个全新的 MariaDB 设置来限制 binlog 读取速度:https://mariadb.com/kb/en/library/restricting-speed-of-reading-binlog-from-master-by-a-slave/