我怎样才能检测和生存“Slashdotted”?
什么是生存exception高stream量高峰的好方法?
我的想法是,在一些触发器,我的网站应该暂时切换到“低带宽”模式:切换到基本的HTML页面,最小的graphics,禁用可能会给数据库不必要的负载的小部件,等等。
我的想法是:
- 监视CPU使用情况
- 监控带宽
- 监视请求/分钟
编辑:我熟悉像caching,切换到静态内容或内容交付networking等选项作为生存的手段,所以也许这个问题应该更多地关注如何检测网站即将过载。 (尽pipe对其他生存方式的回答当然还是值得欢迎的。)比方说,该网站在Linux和PHP上运行Apache。 这可能是最常见的configuration,应该允许最大数量的人从答案中获得帮助。 让我们假设昂贵的选项,如购买另一台服务器和负载平衡是不可用的 – 对于我们大多数人来说,至less在Slashdot提到将是一生一次的事情,而不是我们可以花钱准备。
- 不要给任何人的url
- build立这样没用的东西,如果规则1被打破,没有人会来。
- 安装munin监控负载/内存消耗等,并通知超载。
- 如果崩溃,请安装monit以重新启动apache2
- 安装nginx作为apache2前端,它会大量减less重负载下的内存需求
值得一提的是,如果你的连接没有足够的带宽,那么聪明的caching和低带宽模式将是无用的,所以确保连接到你的服务器是足够的。 例如,不要将其托pipe在家庭DSL连接上。
我从被奴役的经历中讲话。 因为成千上万的人同时试图下载你的室友装在乔治·福尔曼(George Foreman)烧烤炉里的电脑照片,所以当你无法上网的时候并不是很有趣。 没有任何防火墙会为您节省。
基础:
- 除非你是一个真正的 Windows大师,否则不要试图在Windows上托pipe大容量的站点。 它可以完成,但这是一个时间与成本的问题。
- 在任何地方都可以使用静态内容(即无数据库查询)。
- 了解caching控制标题,并正确使用它们用于图像和其他静态资源。
- 至less,使用Apache,但如果可以的话,使用lighttpd或其他高性能networking服务器。
真正的答案是:
- 真的知道你的SQL,并花时间分析慢速查询。 大多数页面加载不应该需要超过一秒钟的直接查询。
- 确定你的负载真的在哪里。 如果这是一个媒体大量的网站,请考虑在其他地方托pipe内容(如Akamai或其他服务)。 如果这是一个数据库大的站点,请考虑复制。
- 知道什么样的复制将为你工作。 如果你有一个读取大量的网站,标准的MySQL主/从复制应该没问题。 如果你有很多的写操作,你需要一些多主设置,比如MySQL Cluster(或者调查“级联”或“瀑布”复制)。
- 如果可以的话,避免调用PHP – 即有一个页面的caching静态(HTML)副本(这是大多数的WordPress的caching插件做的)。 Apache甚至比最简单的hello world PHP脚本更快地提供静态文件。
这里有一篇相当长的,但非常翔实的文章关于幸存的“闪光人群”。
以下是他们提出的解决scheme所针对的情况:
在本文中,我们考虑通过我们称之为车库创新者的angular色来扩展的问题。 车库创新者富有创造力,技术精湛,雄心勃勃。 她对networking上的下一件事情有一个好主意,并使用一些坐在车库里的备用服务器来实现它。 该服务正在运行,不时吸引新的访问者,并从广告和订阅赚取一些微薄的收入。 有一天,也许,她的网站将中奖。 也许它会到达Slashdot或Digg的首页; 也许Valleywag或纽约时报会提到它。
我们的创新者在广泛的宣传中可能只有一次。 如果发生这种情况,数万人将访问她的网站。 由于她的想法如此新颖,许多人将成为创收的顾客并引荐朋友。 但是闪光的人群是臭名昭着的, 如果站点在其负载下崩溃,结果将不会像田园般的。 如果网站第一次不能正常工作的话,很多人都不会回来。 尽pipe如此,为了防止网站突然出现负载,很难certificate为数万美元的资源付费。 闪光的人群既是车库创新者的祸根,也是她的目标。
当代效用计算使得这个难题成为可能。
然后文章提出了车库创新者可以采取的一些步骤,比如使用存储交付networking和实施高度可扩展的数据库。
我重写了几个受欢迎的网站引用的所有URL,通过coralCDNredirect。
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>
没有办法知道你的网站是否能承受重负荷,除非你压力testing。 使用类似围攻的东西,看看你的performance问题在哪里。 记忆太快了吗? 它是否开始减速与一堆并发连接? 是否开始永久访问数据库?
一旦你知道性能问题在哪里,那就成为摆脱它们的问题。 不幸的是,如果不了解更多关于您的具体情况的信息,就很难进行更详细的介绍,但请记住,您正在讨论优化。 因此,只有当您知道存在性能问题时才应采取行动。
而且我会争辩说,你不一定只是为了一生一次的事情准备。 DOS攻击仍然会发生,所以即使你的网站没有得到批准,也要做好准备。
我能想到的唯一能够在几乎所有情况下都能帮助你的头脑是如果你的内容是gzip的话。 这将节省大量的带宽,所有的现代浏览器将支持它,而不会有太多的性能问题。
真正的问题是“什么是最有效的方法是Slashdotted”
如果这是一个真正的问题,redirect到我的网站的stream量。
我认为前提是错误的:你真的很想得到斜杠,否则你将不会有一个网站。 一个更好的问题是,你如何处理额外的stream量? 甚至这也是两个问题:
- 你如何从技术上pipe理额外的服务器负载?
- 你如何迎接新的用户,所以你可以希望得到他们的一些坚持?
不要写内容或提供可能吸引极客的服务;)
把它放在云端!
这可能与个人博客等无关,但对于大型网站云托pipe将解决这个问题。 比如亚马逊EC2,这个策略就是要花费你一大笔钱。
在较小的范围内,对所有图像/静态内容使用CDN可能会有所帮助,再次评估价格非常重要。 亚马逊S3是我听到的最多的CDN。
对于遇到高stream量的站点, Akamai是一个很好的解决scheme,使站点可以快速,非常可扩展且可靠,尽pipe您拥有自己的基础架构。 Akamai是一项服务(而不是免费),它将caching您的网站在世界各地的位置。 在我上一份工作中,我们的电子商务目录通过他们被caching,我们的服务器可能会closures,没有人会知道,除非他们试图添加到他们的购物车。 另外,我们的映像服务器还停机一次,Akamai的caching又一次挽救了我们。
永远不会stream行
虽然这将起作用,但这不是真正有用的。 你需要什么基础设施,可以缩短很短的时间。 像谷歌齿轮或亚马逊的networking服务似乎是理想的,因为即使Slashdot不会压倒谷歌或亚马逊。 如果您想要自己的服务器,请确保您的networking提供商不会在任何预设的带宽限制下将您closures。 购买足够的硬件,使您不会为了处理突然的高峰而继续正常的stream量。
有很多方法可以做,或者至less有帮助。 search谷歌的“slashdot-proof”,你会发现其中的一些:
- 使用FreeCache进行Slashdotvalidation – Boing Boing
- 简单的想法博客现在Slashdotcertificate
等等
caching…很难。 logging命中,如果发生峰值,写出一个完全静态的页面被打的副本,然后服务。 使用良好的caching系统将数据库查询从100个减less到2个,可以在一个较弱的slashdotting中生存下来,但是如果有任何数据库查询,仍然会导致严重负载下的死亡站点不准备好。
增加从数据库caching的水平,使内容可能稍微过时,但更快访问。 当然,这只适用于内容不一定100%一致的情况。
您也可以使用Nagios来监视服务器的运行状况。 根据您的要求,在某些情况下,您可以触发现有的SQL文件来切换您网站的模式。
例如,添加“UPDATE settings_table SET bandwidth ='low';” 进入该SQL文件,并在MySQL中运行它,并做相反的条件恢复正常。
almostfreespeech.net是一个半云可以说,并帮助在这样的情况吨。 正如上面提到的,分层caching有很多帮助。 从memcached中取出数据块,而不是数据库,在你面前有一个反向代理(或一个分布式反向代理,也叫CDN,Panther Networks便宜)。
netstat -plant | awk '$4 ~ /:80\>/ {print}' | wc -l
这将显示所有到Apache服务器的连接。 您可以创build一个cgi脚本来计算Apache服务的连接总数,并在达到某个阈值时发出警告。 在这一点上做什么是另一个问题。
希望你的服务器准备好了。
使用caching!
如果您使用WordPress(例如),您可以使用WP-Super-Cache之类的东西。 如果你使用普通的PHP,你仍然可以使用许多选项,包括memcache 。 或者你可以使用普通的鱿鱼代理风格caching。
任何caching你使用将有助于防弹(或slashdot /防篡改)您的网站:-)
我知道与Digg可以联系他们,并要求他们黑名单您的网站。 你也可以用Slashdot做同样的事情。
确保你build立的所有页面是静态的,没有数据库,并且不使用图像。
事实上,这个地方并没有那么糟糕。
caching数据。
不必要的旅行到数据库显示的东西显示相同的每个负载是什么杀死一台服务器。 将其输出写入一个文件并使用它。 大多数CMS和框架内置caching(但你必须打开它),但滚动你自己并不是最具挑战性的任务。
自动redirect到珊瑚CDN,除非请求来自珊瑚cdn。
有很多方法可以做,或者至less有帮助。 search谷歌的“slashdot-proof”,你会发现其中的一些:
- 使用FreeCache进行Slashdotvalidation – Boing Boing
- 简单的想法博客现在Slashdotcertificate
等等
的.htaccess:
RewriteEngine on RewriteCond %{HTTP_REFERER} slashdot\.org [NC] RewriteRule .* - [F]
一个字:Knipex
没有人提到负载均衡… haproxy等。优化,caching和负载平衡应该能够存活几乎任何东西。 这就是说,我不知道如果stackoverflow后面的负载平衡器;)
关于幸存的你是对的:切换或redirectslashdotted链接到一个静态的HTML页面没有graphics。 你甚至可能想把这个页面放在另一个web服务器上,所以你的原始服务器不会承受太多的负载。
我会为此使用临时redirect,并在stream量消失时删除redirect。
但是,如何检测这个,我也想知道! 只是在最后几秒内计算点击可能是不够的?
确保您的页面支持Last-Modified&If-Modified-Since和/或ETag&If-None-Match标题。 有了这些,你可以避免许多计算和转移。
searchHTTP条件GET获取更多信息。