47

在异常高的流量高峰中生存的好方法是什么?

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

我的想法是:

  • 监控 CPU 使用率
  • 监控带宽
  • 监控请求/分钟

我熟悉缓存、切换到静态内容或内容交付网络等选项作为生存的手段,所以也许问题应该更多地关注如何检测网站何时将变得超载。(尽管其他生存方法的答案当然仍然非常受欢迎。)假设该网站在 Linux 和 PHP 上运行 Apache。这可能是最常见的配置,应该允许最大数量的人从答案中获得帮助。让我们还假设购买另一台服务器和负载平衡等昂贵的选项不可用 - 至少对我们大多数人来说,在 Slashdot 上的提及将是千载难逢的事情,而不是我们可以花钱准备的事情.

4

24 回答 24

20
  1. 安装 munin 以监控负载/内存消耗等并通知过载。
  2. 如果崩溃,安装monit以重新启动apache2
  3. 将 nginx 安装为 apache2 前端,它将在重负载下大量减少内存需求
于 2008-10-20T13:40:49.040 回答
12

值得一提的是,如果您的连接没有足够的带宽,那么巧妙的缓存和低带宽模式将毫无用处,因此请确保与服务器的连接足够宽。例如,不要将其托管在您的家庭 DSL 连接上。

我是根据被slashdotted的经验说话的。当您根本无法访问 Internet 时,这并不有趣,因为成千上万的人同时试图下载您的室友安装在 George Foreman 烤架内的计算机的照片。再多的防火墙也救不了你。

于 2008-10-20T13:51:46.473 回答
11

基础知识:

  1. 除非您是真正的Windows 专家,否则不要尝试在 Windows 上托管大量网站。这是可以做到的,但这是一个时间与成本的问题。
  2. 尽可能使用静态内容(即无数据库查询)。
  3. 了解缓存控制标头并将它们正确用于图像和其他静态资产。
  4. 至少,使用 Apache,但如果可以,使用 lighttpd 或其他高性能网络服务器。

真实答案:

  1. 真正了解您的 SQL,并花时间分析慢查询。大多数页面加载不需要超过一秒钟的直接查询。
  2. 确定你的负载到底在哪里。如果它是一个媒体密集型网站,请考虑在其他地方托管内容(如 Akamai 或其他一些服务)。如果它是一个数据库密集型站点,请考虑复制。
  3. 知道什么样的复制对你有用。如果你有一个重读的站点,标准的 MySQL 主/从复制应该没问题。如果您有大量写入操作,您将需要某种多主机设置,例如 MySQL 集群(或研究“级联”或“瀑布式”复制)。
  4. 如果可以,请避免调用 PHP - 即拥有页面的缓存静态 (HTML) 副本(这是大多数 Wordpress 缓存插件所做的)。Apache 提供静态文件的速度甚至比最简单的 hello world PHP 脚本还要快。
于 2008-09-16T20:44:02.200 回答
9

这是一篇相当冗长但内容丰富的文章,关于幸存的“闪电人群”。

这是他们提出的解决方案所针对的情况的场景:

在本文中,我们通过我们称为车库创新者的角色的眼睛来考虑缩放问题。车库创新者富有创造力、精通技术和雄心勃勃。她对网络上的 Next Big Thing 有一个好主意,并使用车库中的一些备用服务器来实现它。该服务已启动并运行,不时吸引新访问者,并从广告和订阅中获得微薄的收入。也许有一天,她的网站会中大奖。或许会登上 Slashdot 或 Digg 的首页;也许 Valleywag 或纽约时报会提到它。

我们的创新者可能只会在广泛宣传中获得一枪。如果发生这种情况,成千上万的人将访问她的网站。由于她的想法如此新颖,许多人将成为创收客户并推荐朋友。但众所周知,闪电般的人群是善变的。如果站点在其负载下崩溃,结果将不会那么理想。如果网站第一次不工作,很多人都不会费心返回。尽管如此,如果网站突然出现负载高峰,就很难证明为资源支付数万美元是合理的。快闪人群既是车库创新者的祸根,也是她的目标。

当代效用计算已经启用了解决这个难题的一种方法。

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

于 2008-10-20T14:21:52.590 回答
7

我重写了几个流行站点引用的所有 URL,以通过珊瑚 CDN 重定向。

阿帕奇的一个例子:

<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>
于 2008-09-17T13:17:02.123 回答
6

除非您对其进行压力测试,否则根本无法知道您的网站是否能够承受重负载。使用siege 之类的东西,看看你的性能问题在哪里。它在内存中增长太快了吗?它会随着一堆并发连接而开始变慢吗?是否开始永远访问数据库?

一旦你知道性能问题在哪里,那么就变成了摆脱它们的问题。不幸的是,如果不了解您的具体情况,很难更详细地介绍,但请记住,您在这里谈论的是优化。因此,只有在知道存在性能问题时才应该采取行动。

而且我认为你不一定只是为一生一次的事件做准备。DOS 攻击仍然会发生,因此即使您的网站没有受到攻击,也最好做好准备。

我能想到的唯一能在几乎所有情况下都对你有帮助的事情是,如果你对你的内容进行 gzip 压缩。这将节省大量带宽,并且所有现代浏览器都将支持它而不会出现太多性能问题。

于 2008-10-20T13:31:04.800 回答
5

我认为这个前提是错误的:你真的很想得到点点滴滴,否则你一开始就没有网站。一个更好的问题是您如何处理额外的流量?甚至这实际上是两个问题:

  1. 您如何从技术上管理额外的服务器负载?
  2. 你如何迎接新用户,这样你才能有希望让他们中的一些人留下来?
于 2008-09-16T20:31:55.270 回答
2

放到云端!

这可能与个人博客等无关,但对于更大的站点,云托管将解决这个问题。以 Amazon EC2 为例,关于这个策略的事情是它会花费你很多钱。

在较小的规模上,对所有图像/静态内容使用 CDN 也可能会有所帮助,再次评估价格很重要。Amazon S3 是我听到最多的 CDN。

于 2008-10-20T12:52:40.680 回答
2

对于流量高的站点,Akamai是一个很好的解决方案,可以使站点快速、可扩展且可靠,尽管您拥有自己的基础架构。Akamai 是一项服务(不是免费的),可将您的站点缓存在世界各地的位置。在我上一份工作中,我们的电子商务目录是通过它们缓存的,我们的服务器可能会宕机,除非他们尝试添加到购物车,否则没人会知道。此外,我们的图像服务器关闭了一次,而 Akamai 的缓存再次拯救了我们。

于 2008-10-20T13:44:58.267 回答
1

永远不要流行。

虽然这会起作用,但它并没有真正的帮助。您需要可以在很短的时间内扩展的基础架构。像 Google Gears 或 Amazon 的网络服务这样的东西似乎很适合这一点,因为即使是 Slashdot 也不会压倒 Google 或 Amazon。如果您想要自己的服务器,请确保您的网络提供商不会在任何预设的带宽限制下切断您的连接。购买足够的硬件,这样您就不会仅仅为了承载正常流量而紧张,而不会有任何松弛来处理突然的峰值。

于 2008-09-16T20:31:56.800 回答
1

使用缓存!

如果您使用的是 WordPress(例如),您可以使用类似WP-Super-Cache 的东西。如果您使用的是常规 PHP,您仍然可以使用许多选项,包括memcache。或者您可以只使用常规的 squid 代理样式缓存。

您使用的任何缓存都将有助于您的网站的防弹(或 slashdot/digg-proof):-)

于 2008-10-20T12:40:49.627 回答
1

提高数据库的缓存级别,以便内容可能会稍微过时但访问速度更快。当然,这仅适用于内容不必 100% 一致的情况。

于 2008-10-20T12:42:06.223 回答
1

您还可以使用Nagios监控服务器运行状况。根据您的要求,在某些条件下,您可以触发现有的 SQL 文件为您的网站切换模式。

例如,添加“UPDATE settings_table SET bandwidth = 'low';” 进入该 SQL 文件并在 mysql 中运行它,并在条件恢复正常时执行相反的操作。

于 2008-10-20T16:20:40.793 回答
1

缓存...很难。记录命中,如果出现峰值,写出被命中页面的完全静态副本,然后提供。使用良好的缓存系统将 DB 查询从 100 减少到 2 可以在弱斜线点中幸存下来,但是完全有任何 DB 查询仍然会导致您没有准备好在严重负载下的死站。

于 2008-09-16T20:38:36.020 回答
1

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

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

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

于 2009-01-02T17:06:25.270 回答
0

有很多方法可以做到这一点,或者至少有帮助。在 Google 上搜索“slashdot-proof”,您会发现其中的一些:

  • 使用 FreeCache 对您的服务器进行 Slashdot 验证 - Boing Boing
  • 简单的想法博客现在是 Slashdot 证明

等等

于 2008-09-16T20:32:59.730 回答
0

确保您构建的所有页面都是静态的,没有数据库,并且不使用图像。

实际上,这个地方并没有那么糟糕。

于 2008-09-16T20:33:51.927 回答
0

关于幸存你是对的:将斜线点链接切换或重定向到没有图形的静态 html 页面。您甚至可能希望将此页面放在其他网络服务器上,这样您的原始服务器就不会占用太多负载。

我会为此使用临时重定向,并在流量消失时删除重定向。

但是如何检测这个,这个我也想知道!仅计算最后几秒钟的点击数可能还不够?

于 2008-10-20T12:41:09.910 回答
0

确保您的页面支持 Last-Modified & If-Modified-Since 和/或 ETag & If-None-Match 标头。有了这些,您可以完全避免许多计算和传输。

搜索 HTTP 条件 GET 以获取更多信息。

于 2008-10-20T13:20:44.853 回答
0

缓存数据。

不必要的访问数据库以显示每次负载都显示相同的内容是杀死服务器的原因。将其输出写入文件并改用它。大多数 CMS 和框架都内置了缓存(但您必须打开它),但自己滚动并不是最具挑战性的任务。

于 2008-09-16T20:36:37.163 回答
0

自动重定向到珊瑚 CDN,除非请求来自珊瑚 CDN。

于 2008-09-16T20:46:38.887 回答
0

.ht 访问:

RewriteEngine on
RewriteCond %{HTTP_REFERER} slashdot\.org [NC]
RewriteRule .* - [F]
于 2008-09-16T20:59:09.963 回答
0

Nearfreespeech.net 可以说是一个半云,在这种情况下可以提供很多帮助。正如上面提到的其他人,分层缓存有很大帮助。从 memcached 而不是数据库中提取大量信息,在您面前有一个反向代理(或分布式反向代理,即 CDN,Panther Networks 很便宜)。

于 2008-10-21T06:48:25.207 回答
-1

没有人提到负载平衡... haproxy 等。优化、缓存和负载平衡几乎可以生存。话虽这么说,我不确定stackoverflow是否在负载均衡器后面;)

于 2008-09-16T21:49:28.907 回答