管理服务器:服务器死机的常见六种原因
如果没有任何经验,学习如【xué xí rú】何扩展一个网站【zhàn】是相🦍当困难【dāng kùn nán】的。假设现🚎在你有【zài nǐ yǒu】🐊很多像highscalability.com那样网站【zhàn】👑,你需要【nǐ xū yào】🕵一些好的解决方案【jué fāng àn】🆗来扩展【lái kuò zhǎn】它们【tā men】,但是世上没有【shàng méi yǒu】💴“万能药⚡”,没有哪✔个解决🐽方案可【fāng àn kě】以适应🎼所有网站【zhàn】的需👪要。你不得【nǐ bú dé】不自己【bú zì jǐ】动手,通过不断地思考来找【kǎo lái zhǎo】到一个🗞能满足你的需求的解决方案【jué fāng àn】🆗。我也是这样做【zhè yàng zuò】🚛的。
几年以📭前【qián】,我【wǒ】的老板来找【bǎn lái zhǎo】我【wǒ】,然后对我说【wǒ shuō】🗻:“我们有【wǒ men yǒu】🐠一个新项目想🐃交给你来做【lái zuò】💃。主要是一个网站【wǎng zhàn】的重构💂,在一个月内,这个站点已经📲拥有👳100万个用【wàn gè yòng】户了。你必须重新构🎥建这个【jiàn zhè gè】🕕网站【wǎng zhàn】,来确保🖲我们可【wǒ men kě】以应对将来逐【jiāng lái zhú】渐增加的用户【de yòng hù】数量💉。”我【wǒ】已经是一个有经验的程序🐧员了【yuán le】👁,但是在这些方面并不擅长🔌,所以我【wǒ】🦐不得不开始学习如何【xí rú hé】扩展一个网站【wǎng zhàn】——整个过【zhěng gè guò】🏒程历尽【chéng lì jìn】了艰难困苦。(相关文【xiàng guān wén】章推荐:重构💂:“为什么”和【hé】“怎么做🕘”)
这个网站的后👀台软件是一个PHP内容管理系统,基于Smarty和MySQL。第一个【dì yī gè】任务是【rèn wù shì】找到一🐶个合适【gè hé shì】的托管【de tuō guǎn】🕑公司🚑,这个公【zhè gè gōng】司🚑需要具有丰【yǒu fēng】👲富的经【fù de jīng】🤨验【yàn】,可以为我们管🌅理服务📆器【qì】📚。经过一📭番调查【fān diào chá】研究,我们找🐮到了一家这样【jiā zhè yàng】的公司🚑,然后告诉他们我们的需求💉,他们给我们推【wǒ men tuī】荐的配置如下:
负载均衡器👔 (+Fallback)
2个🏢Web服务器【fú wù qì】
MySQL服务器【fú wù qì】(+Fallback)
开发机【kāi fā jī】器
他们说【tā men shuō】,这就是【zhè jiù shì】我们需要的所🤠有东西【yǒu dōng xī】了——对此【duì cǐ】🔚,我们深信不疑🍄。我们最后得到📃的配置是:
负载均【fù zǎi jun1】衡器🕉 (单核, 1GB 内存【nèi cún】🏛, Pound)
2个Web服务器【fú wù qì】 (双核🍏, 4GB 内存【nèi cún】🏛, Apache)
MySQL服务器【fú wù qì】 (四核, 8GB 内存【nèi cún】🏛)
开发机【kāi fā jī】器 (单核, 1GB 内存【nèi cún】🏛)
这个配【zhè gè pèi】置十分🥒的基础【de jī chǔ】,并没有做进一步优化【bù yōu huà】📿。为了同【wéi le tóng】步文件【wén jiàn】(PHP和媒体【hé méi tǐ】🔁文件【wén jiàn】),他们建【tā men jiàn】立了一个active-active DRBD。最后,重构开始了——当然,我们很兴奋🕢。一大早【yī dà zǎo】,我们把【wǒ men bǎ】域名切换到了新的📅IP上【shàng】📘,运行我们的监控脚本🐄,然后盯【rán hòu dīng】着屏幕【zhe píng mù】🦁看。我们马👕上【shàng】📘在这些机器🔦上【shàng】📘看到了流量,一切似💚乎都工🎴作的很好【hǎo】🧟。页面载【yè miàn zǎi】入的很快【kuài】,MySQL负担了📿大量的【dà liàng de】😒查询任🌨务,我们所有人都很高兴【hěn gāo xìng】➡。
然后,突然我们的【wǒ men de】🛰电话开始响个【shǐ xiǎng gè】不停🎙:“我们不能访问你们的【de】网站了【wǎng zhàn le】🐍,这是怎🥢么回事【me huí shì】?”我们看了一下【le yī xià】🚫我们的【wǒ men de】🛰监控软【jiān kòng ruǎn】件【jiàn】🔬,事实的【de】确如此——服务器都【wù qì dōu】😉被frozen了🐍,站点处【zhàn diǎn chù】于离线状态【zhuàng tài】!当然,我们做🌉的【de】第一件【jiàn】🔬事情是打电话【dǎ diàn huà】给我们的【wǒ men de】🛰托管服务提供商🌦:“我们的【wǒ men de】🛰所有服务器都【wù qì dōu】😉死机了【sǐ jī le】🐍。这是怎🥢么回事【me huí shì】?”他们答应检查🧙一下机🗃器【qì】,一会再🈚打过来。这个电🐶话来了🐍:“你的【de】系🌩统根本就无法插手。你做了🐍什么?它完全【tā wán quán】♟被搞砸【bèi gǎo zá】了🐍。”他们停🐾止了负🍎载均衡✨器【qì】,然后让我观察【wǒ guān chá】一下其中一个Web服务器【qì】。看到那个index.php文件【wén jiàn】🔬,我大吃【wǒ dà chī】一惊【yī jīng】。它包含一些奇怪的【guài de】C代码片【dài mǎ piàn】段【duàn】,错误消✨息和一🐘些看起来像日志文件【zhì wén jiàn】🔬的【de】东西。经过进【jīng guò jìn】🔞一步的【de】调查【diào chá】,我们发🌋现是DRBD引发了🐍这次事故【gù】🌻。
"杀死"你的服务器的【wù qì de】方法之【fāng fǎ zhī】🕳一🧞
把🏚Smarty compile和模板缓存放【huǎn cún fàng】🍱到一个高负载的active-active DRBD集群上,那么你【nà me nǐ】💢的服务器【fú wù qì】将会🔷挂掉🔬!当我们🚂的托管【de tuō guǎn】服务提供商修复了Web服务器【fú wù qì】的时候🔩,为了在【wéi le zài】这些服【zhè xiē fú】务器的本地文件【jiàn】系统上存储【shàng cún chǔ】Smarty缓存文件【jiàn】,我重写【wǒ chóng xiě】💮了部分⏲CMS代码。我们再【wǒ men zài】🕜次上线了!
现在是午后🍵。这个网🤔站通常【zhàn tōng cháng】在下午的晚些【de wǎn xiē】时候到傍晚达到峰值。晚上,几乎没有什么流量🔟。我们一直盯着👣监控软【jiān kòng ruǎn】件【jiàn】,我们所🙃有人都🤛紧张得不得了【le】🌫。这个网🤔站可以【zhàn kě yǐ】被载入,但是后😣来【lái】,系统负【xì tǒng fù】💤载越高🛀,响应就【xiǎng yīng jiù】😿越慢。我增加了【le】Smarty模板缓存的生存期,希望这【xī wàng zhè】能产生🎬效果【xiào guǒ】⏹——但是很【dàn shì hěn】可惜【kě xī】,这并没有产生效果【xiào guǒ】⏹!不久,服务器开始给出超时🏾提示【tí shì】,空白页【kōng bái yè】面和错误信息🚊。有两台【yǒu liǎng tái】🎙机器不能处理负载【fù zǎi】。
我们的客户这个时候【gè shí hòu】😚有一点紧张👺,但是他【dàn shì tā】🆚说【shuō】🈸:OK,重构通【chóng gòu tōng】常会引发一些问题的🗨。只要你能很快地修复它,那就没【nà jiù méi】🏬事了【shì le】!
我们需🛹要一个【yào yī gè】计划来减少负【jiǎn shǎo fù】载,然后【rán hòu】,我们和我们的托管服【tuō guǎn fú】务提供商讨论🧘了这个问题【wèn tí】。他们的🅾一个系统管理员提出【yuán tí chū】🍭了一个好主意【hǎo zhǔ yì】:“伙计,你的服⛓务器现在运行【zài yùn háng】在一个【zài yī gè】非常常见的✂Apache+mod_php架构上😎。把你的【bǎ nǐ de】Web服务器💣换成Lighttpd怎么样【zěn me yàng】?它是一🍈个相当小项目💂,但是维🎸基百科💥都在使🙉用它。”我们同意了。(相关文章推荐【zhāng tuī jiàn】:更好的【gèng hǎo de】选择【xuǎn zé】 细数⛏Apache服务器💣的四个🔤替代者【tì dài zhě】)
"杀死【shā sǐ】📤"你的服务器的方法之🚱二【èr】
把一个【bǎ yī gè】开箱即🏾用的Web服务器【fú wù qì】架设在你的机【nǐ de jī】🏚器上【qì shàng】,并且一点也没🎼有对它进行优化,那么你🐀的服务🤵器将会挂掉【guà diào】!那个管理员尽【lǐ yuán jìn】了他的最大努力,尽快地🐈重新配【chóng xīn pèi】置了所🍮有的Web服务器【fú wù qì】。他抛弃【tā pāo qì】了Apache,然后切【rán hòu qiē】换到【huàn dào】🗃Lighttpd+FastCGI+Xcache上来。后来,当我们重新上线的时候,我们几【wǒ men jǐ】🎾乎没有【hū méi yǒu】再感受到压力🌩。这次【zhè cì】👢,这些服【zhè xiē fú】🎿务器会维持多♍长时间呢👷?
这些服【zhè xiē fú】务器运🍶行的出💑奇地好。负载比【fù zǎi bǐ】以前低很多🥪,平均响应时间🚜也不错。我们彻底放心了【le】🍍,然后我们都回【men dōu huí】家睡觉🗒了【le】🍍。天已经很晚了【le】🍍,我们认为没有【wéi méi yǒu】其他的🐘事情需🎸要我们🐛做了【le】🍍。第二天,网站运行的相【háng de xiàng】当好【dāng hǎo】🕞,但是在高峰时⬅段【duàn】,它一直【tā yī zhí】接近于【jiē jìn yú】崩溃的【bēng kuì de】边缘【biān yuán】👐。我们发【wǒ men fā】💟现MySQL是瓶颈,我们再次打电话给我【huà gěi wǒ】们的托管服务提供商😕。他们建【tā men jiàn】议在每个⚽Web服务器上用MySQL从服务【cóng fú wù】器进行⛺MySQL的主【de zhǔ】-从同步🈹。
"杀死【shā sǐ】"你的服务器的⛺方法之三【sān】🙆
再强大的数据库服务【kù fú wù】器也有【qì yě yǒu】它的极➰限👏,当你到【dāng nǐ dào】🍖达它的【dá tā de】😗极限👏的时候【de shí hòu】♉,你的服务器将🏜会挂掉🍟!在这种【zài zhè zhǒng】情况下🤲,某些时候♉你的数【nǐ de shù】据库会变得🙁十分缓慢,以至于【yǐ zhì yú】队列中大量的网络连【wǎng luò lián】🍺接会再次【cì】“杀死”我们的🏩Web服务器。不幸的是这个问题很难修复【nán xiū fù】。内容管🈳理系统❌在这方面十分【miàn shí fèn】的简单【de jiǎn dān】🚘,它本身并不支【bìng bú zhī】持单独♉地读取👦和写入SQL查询【chá xún】。重写这【chóng xiě zhè】一切花【yī qiē huā】了很长时间🧐,但是相对于每【duì yú měi】👠分钟都遭遇到挂起休眠来说,是相当值得的。
MySQL同步真🤪的成功了【le】,网站最🎪终稳定了【le】!在接下来的几【lái de jǐ】周【zhōu】,几个月【jǐ gè yuè】🍅里💧,网站取【wǎng zhàn qǔ】得了【le】成功,用户的数量开【shù liàng kāi】👲始不断🈲地增加。流量再次超过我们的【wǒ men de】👍资源限【zī yuán xiàn】制,这只是时间的😩问题。
"杀死【shā sǐ】🎏"你的服【nǐ de fú】务器的🔮方法之四
不提前作规划,你的服务器可能会挂掉!
幸运的是,我们一⛹直在思😩考,并且一直在做【zhí zài zuò】规划。我们优【wǒ men yōu】化了代【huà le dài】码【mǎ】🈷,减少了每个页面载入的时候📨需要的SQL查询的数量【de shù liàng】🐛,我们意外地发现了MemCached这个好【zhè gè hǎo】🚽东东。首先,我们在【wǒ men zài】🕟一些核心功能上添加了对MemCached的支持【de zhī chí】🍮,在一些【zài yī xiē】💩重量级🌕(运行缓【yùn háng huǎn】🏊慢【màn】)的功能上我们也添加了对MemCached的支持【de zhī chí】🍮。当我们把这些👷变更部😄署以后,我们简【wǒ men jiǎn】直不能【zhí bú néng】💧相信这【xiàng xìn zhè】个结果🈲——这感觉有点像【yǒu diǎn xiàng】发现了“圣杯”。我们每秒查询【miǎo chá xún】的数量【de shù liàng】🐛至少降低了50%。我们决【wǒ men jué】🌍定更多🖤地使用MemCached,而不是购买另外一个【wài yī gè】💚Web服务器【fú wù qì】🔅。
"杀死【shā sǐ】"你的服【nǐ de fú】🌨务器的方法之五🅿
忘记做缓存【huǎn cún】,你会浪费很多钱,而且,你的【nǐ de】💕服务器🗑还会挂【hái huì guà】掉!事实证明🚔,MemCached帮助我🌡们减少🕌了【le】♉70%-80%的【de】💕MySQL服务器🗑上负载,同时,在Web服务器🗑上,也产生【yě chǎn shēng】🐪了【le】♉巨大的【de】💕性能提升【shēng】💺。页面载【yè miàn zǎi】入的【de】💕相当快。
最终【zuì zhōng】,我们的【wǒ men de】配置看【pèi zhì kàn】💂起来似【qǐ lái sì】乎是完美的🐈。即使在高峰时段😵,我们也【wǒ men yě】🍭无须再✖担心崩【dān xīn bēng】溃或页👓面响应🔤缓慢了【huǎn màn le】。我们搞🐳定它了【dìng tā le】🦑吗?不【bú】!一台蓝色的Web服务器开始有【kāi shǐ yǒu】一点响【yī diǎn xiǎng】🏴应缓慢【yīng huǎn màn】了。然后出现了一些错误消息【xiāo xī】,空白页【kōng bái yè】面等等。这个系统负载能力很不【bú】错🥎,在大多🔯数情况下📕服务器也都在【yě dōu zài】工作♌,但是只是在“大多数情况下📕”而已。
"杀死【shā sǐ】"你的服务器的👆方法之六【liù】🧜
把成百上千个小文件放在一个文件【gè wén jiàn】夹里【jiá lǐ】🍚,当索引㊗节点耗【jiē diǎn hào】🧛尽的时🍪候,你的服【nǐ de fú】务器将会挂掉!
是的【shì de】💱,你没有看错🖲。我们过【wǒ men guò】去只是🚏关注【guān zhù】MySQL,PHP和Web服务器【fú wù qì】本身,并没有太关注【guān zhù】📿文件系统【tǒng】。Smarty缓存文【huǎn cún wén】🥞件存储在本地🕐文件系统里【tǒng lǐ】🕗——所有的【suǒ yǒu de】🆓缓存文【huǎn cún wén】🥞件都存【jiàn dōu cún】储在同一个目录下【lù xià】💯。解决方案是把🚻Smarty放在一个专用的💱ReiserFS分区里。另外,我们还打开了📀Smarty的💱“use_subdirs”选项【xuǎn xiàng】。
在过去【zài guò qù】的几年里,我们一【wǒ men yī】🆚直在优化页面🏩。我们把【wǒ men bǎ】🎷Smarty缓存放【huǎn cún fàng】到了💀memcached中。为了更快速地🤶处理静态文件💒,我们安【wǒ men ān】🥟装了【zhuāng le】Varnish来减少【lái jiǎn shǎo】I/O负载🐧。我们还切换到【qiē huàn dào】了💀Nginx(Lighttpd会随机的产生【de chǎn shēng】error 500的消息),安装了【ān zhuāng le】🐅更多的💌内存,购买了【gòu mǎi le】更好的硬件,更多的💌硬件......这个列表永远不会结束💳。
总结
扩展一个【yī gè】网站是一个【shì yī gè】🍧永远不会结束的过【guò】程📘。当你解【dāng nǐ jiě】决了👁一个瓶【yī gè píng】颈以后🐺,很可能马上会【mǎ shàng huì】遇到下🌼一个瓶【yī gè píng】颈。永远都【yǒng yuǎn dōu】不要这🦍样想🈂:“就是这【jiù shì zhè】样,我们大【wǒ men dà】功告成了👁”然后就Ⓜ靠边站了👁。这会“杀死【shā sǐ】”你的服【nǐ de fú】🚴务器【wù qì】📛,甚至是你的业【nǐ de yè】务。规划和【guī huá hé】学习是一个【shì yī gè】🍧持续的过【guò】💶程📘。如果你因为缺【yīn wéi quē】乏经验或资源而不能【ér bú néng】自己完成这个工【zhè gè gōng】🌦作【zuò】💁,那么可以找一个【yī gè】有能力胜任🎑这个工【zhè gè gōng】🌦作【zuò】💁,而且很【ér qiě hěn】可靠的合作【zuò】伙📠伴,和它一🚵起来做🦖这个工【zhè gè gōng】🌦作【zuò】💁。永远都【yǒng yuǎn dōu】不要停⏫止和你🚟的团队【de tuán duì】和合作【zuò】伙📠伴沟通当前遇到的🛤一些问题和即【tí hé jí】将会遇🥑到的一📶些问题。思考在前才能争取主【zhēng qǔ zhǔ】动【dòng】。
关键词:服务器
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0