如何检测和应对"Slashdotted"?

47

如何应对异常高的访问量峰值?

我的想法是,在某个触发点,我的网站应该暂时切换到“低带宽”模式:切换到基本的HTML页面,最小化图形,禁用可能给数据库带来不必要负载的小部件等。

我的想法是:

  • 监控CPU使用率
  • 监控带宽
  • 监控每分钟请求次数

我熟悉像缓存、切换到静态内容或内容分发网络等选项作为生存手段,因此也许问题应该更关注如何检测网站即将超载的情况。(当然,其他生存方法的答案仍然非常受欢迎。)假设网站在Linux上运行Apache和PHP,这可能是最常见的配置,并且应该允许尽可能多的人从答案中获得帮助。同时,我们也假设昂贵的选择,如购买另一台服务器和负载平衡不可用 - 对于我们大多数人来说,出现在Slashdot上只会是一生中的一次事件,而不是我们可以花钱准备的事情。

24个回答

20
  1. 安装 munin 监控系统负载、内存占用等信息,并在超载时发出通知。
  2. 安装 monit 以重新启动 Apache2 服务,防止它崩溃。
  3. 安装 Nginx 作为 Apache2 的前端,可以大幅降低在高负载下的内存需求。

12
值得一提的是,如果您的连接带宽不足,则聪明的缓存和低带宽模式将毫无用处,因此请确保连接到您的服务器的带宽足够充裕。例如,不要在家庭DSL连接上托管它。
我从被Slashdot攻击的经历中说起。当数千人同时尝试下载您的室友在George Foreman烧烤器内安装的计算机的照片时,无法访问互联网并不好玩。任何防火墙也无法拯救您。

1
为什么这个一直被点赞?显然这是一个非常重要的信息,但是楼主说他正在寻找检测“slashdotting”的方法,而不是减轻其影响。@gsmd用Monit命中了要害-它可以检测Apache负载的峰值。 - Andrew Taylor
在我的辩护中,这个问题不仅仅是要求如何检测流量峰值,还要求如何应对它们。虽然我的回答显然是为了幽默,但也有一个严肃的方面。大多数人没有经历过这些网站真正产生的带宽,我认为很难理解。它确实会淹没你的连接,使其完全无用。 - Simon Howard

11

基础知识:

  1. 除非你是真正的Windows专家,否则不要尝试在Windows上托管高流量站点。虽然可以做到,但这是一个时间成本问题。
  2. 尽可能使用静态内容(即没有数据库查询)。
  3. 了解缓存控制头并正确地用于图像和其他静态资源。
  4. 至少使用Apache,但如果可以,请使用Lighttpd或其他高性能Web服务器。

真正的答案:

  1. 真正了解你的SQL,并花时间分析慢查询。大多数页面加载不应需要超过一秒钟的直接查询。
  2. 确定你的负载真正所在的位置。如果是媒体重的站点,考虑将内容托管到其他地方(如Akamai或其他服务)。如果是数据库重的站点,请考虑复制。
  3. 了解哪种复制对你有效。如果你有一个读重的站点,标准的MySQL主/从复制应该就可以了。如果有很多写入操作,则需要一些多主设置,例如MySQL Cluster(或研究“级联”或“瀑布”复制)。
  4. 如果可以的话,避免调用PHP - 即有一个缓存的静态(HTML)页面副本(这就是大多数WordPress缓存插件所做的)。Apache在提供静态文件方面比最简单的hello world PHP脚本快得多。

9

这篇文章是一篇关于如何应对“闪电人群”的较长但信息量极高的文章。

下面是他们所提出解决方案所针对的情景:

在这篇论文中,我们通过一个名为“车库创新者”的角色来考虑扩展性问题。车库创新者富有创造力、技术娴熟并且雄心勃勃。她有一个关于网络上“下一个大事”的绝妙想法,并利用车库里的一些闲置服务器来实现它。该服务已经上线运行,不时吸引新访客,并从广告和订阅中获得一些微薄的收入。也许有一天,她的网站会大获成功。也许它会登上Slashdot或Digg的首页;也许Valleywag或纽约时报会提及它。

我们的创新者可能只有一次机会获得广泛的宣传。如果那时成千上万的人访问她的网站,由于她的想法非常新颖,许多人将成为产生收益的客户并向朋友推荐。但闪电人群是非常靠不住的;如果网站在负载下崩溃,结果将远非理想化。如果网站第一次无法正常工作,许多人将不再回来。然而,为了应对突发的负载峰值,很难合理地支付数万美元的资源费用。闪电人群既是车库创新者的祸害,也是她的目标。

当代实用计算使得摆脱这种困境成为可能。

文章随后提出了一些车库创新者可以采取的措施,例如使用存储交付网络和实现高度可扩展的数据库。


7

我会将一些流行网站引用的所有URL重写,以便通过coralCDN进行重定向。

以下是Apache的示例:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_USER_AGENT} !^Googlebot
RewriteCond %{HTTP_USER_AGENT} !^CoralWebPrx
RewriteCond %{QUERY_STRING} !(^|&)coral-no-serve$
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?digg\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?slashdot\.org [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?slashdot\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?fark\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?somethingawful\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?kuro5hin\.org [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?engadget\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?boingboing\.net [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?del\.icio\.us [OR]
RewriteCond %{HTTP_REFERER} ^http://([^/]+\.)?delicious\.com
RewriteRule ^(.*)?$ http://example.com.nyud.net/$1 [R,L]
</IfModule>

6
除非您进行压力测试,否则无法确定您的网站是否能够承受重负。使用类似 siege 的工具来查看性能问题所在。它是否会快速增加内存?当有大量并发连接时,它是否开始变慢?它是否需要很长时间才能访问数据库?
一旦您知道性能问题所在,就可以着手解决。不幸的是,如果不了解您的特定情况,很难提供更多细节,但请记住,您正在谈论优化。因此,只有在确信存在性能问题时才应采取行动。
我认为您不仅仅是为一次性事件做准备。DOS攻击仍然会发生,因此即使您的网站没有被疯狂点击,也应有所准备。
我能想到的唯一一件几乎适用于所有情况的事情是压缩您的内容。这将节省大量带宽,并且所有现代浏览器都支持它,而且不会对性能产生太大影响。

5

我认为前提是错误的:你真的非常希望被Slashdot囊括,否则你首先就不会有一个网站。一个更好的问题是如何处理额外的流量?甚至这其实是两个问题:

  1. 你如何技术上管理额外的服务器负载?
  2. 你如何欢迎新用户,以便你能够希望留住他们中的一些人?

2

把它放到云端吧!

对于个人博客等小型网站来说,这可能并不相关,但对于大型网站来说,云托管解决了这个问题。例如,亚马逊EC2,这种策略的问题是会花费你大量的资金。

在较小的规模上,针对所有图像/静态内容使用CDN也可能有所帮助,但需要评估价格。亚马逊S3是我听说最多的CDN。


2
对于高流量的网站来说,Akamai 是一个很好的解决方案,可以使网站在自己的基础设施不足的情况下快速、可扩展和可靠。 Akamai 是一项付费服务,它会在世界各地的位置缓存您的网站。在我的上一份工作中,我们的电子商务目录是通过他们缓存的,我们的服务器可能会崩溃,除非他们尝试添加到购物车,否则没有人会知道。此外,我们的图像服务器曾经崩溃过一次,而 Akamai 的缓存再次拯救了我们。

1

netstat -plant | awk '$4 ~ /:80\>/ {print}' | wc -l

这将显示所有连接到Apache服务器的连接。您可以创建一个cgi脚本,计算连接到Apache服务的总数,并在达到某个阈值时发出警告。那时该怎么办是另一个问题。

希望您的服务器已经做好了准备。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接