- 簡(jiǎn)體
- 簡(jiǎn)體中文 English
百萬(wàn)級(jí)訪問(wèn)量網(wǎng)站的技術(shù)準(zhǔn)備工作
當(dāng)今從純網(wǎng)站技術(shù)上來(lái)說(shuō),因?yàn)殚_(kāi)源模式的發(fā)展,現(xiàn)在建一個(gè)小網(wǎng)站已經(jīng)很簡(jiǎn)單也很便宜,所以很多人都把創(chuàng)業(yè)方向定位在互聯(lián)網(wǎng)應(yīng)用。這些人里大多數(shù)不是很懂技術(shù),或者不是那么精通,而網(wǎng)站開(kāi)發(fā)維護(hù)方面的知識(shí)又很分散,學(xué)習(xí)成本太高,所以這篇文章將這些知識(shí)點(diǎn)結(jié)合起來(lái),系統(tǒng)的來(lái)說(shuō),一個(gè)從日幾千訪問(wèn)的小小網(wǎng)站,到日訪問(wèn)一兩百萬(wàn)的小網(wǎng)站,中間可能會(huì)產(chǎn)生什么問(wèn)題,以及怎么才能在一開(kāi)始做足工作盡量避免這些問(wèn)題。
你的網(wǎng)站因?yàn)榕?jīng)營(yíng),訪問(wèn)量逐漸升高,在升高的過(guò)程中,問(wèn)題也可能開(kāi)始顯現(xiàn)了。因?yàn)閹挼脑黾?、硬件的擴(kuò)展、人員的擴(kuò)張所帶來(lái)的成本提高是顯而易見(jiàn)的,而還有相當(dāng)大的一部分成本是因?yàn)榇a重構(gòu)、架構(gòu)重構(gòu),甚至底層開(kāi)發(fā)語(yǔ)言更換引起的,最壞的情況就是數(shù)據(jù)丟失,所有努力付之一炬。這類成本支出大多數(shù)在一開(kāi)始就可以避免,先打好基礎(chǔ),往后可以省很多精力,少操很多心。
對(duì)于不同的初期投資成本,技術(shù)路線的選擇是不同的。這里假設(shè)網(wǎng)站剛剛只是一個(gè)構(gòu)想,計(jì)劃第一年服務(wù)器硬件帶寬投入5萬(wàn)左右。對(duì)于這個(gè)資金額度,有很多種方案可選擇,例如租用虛擬主機(jī)、租用單獨(dú)服務(wù)器,或者流行的私有云,或者托管服務(wù)器。前兩種選擇,網(wǎng)站發(fā)展到一定規(guī)模時(shí)需遷移,那時(shí)再重做規(guī)劃顯然影響更大。服務(wù)器托管因?yàn)榕渲米灾鳌⒛芡耆莆湛刂茩?quán),所以有一定規(guī)模的網(wǎng)站基本都是這種模式。采用自己托管服務(wù)器的網(wǎng)站,一開(kāi)始要注意以下幾點(diǎn)——
一、開(kāi)發(fā)語(yǔ)言
一般來(lái)說(shuō),技術(shù)人員(程序員)都是根據(jù)自己技術(shù)背景選擇自己最熟悉的語(yǔ)言,不過(guò)不可能永遠(yuǎn)是一個(gè)人寫程序,所以在語(yǔ)言的選擇上還要是要費(fèi)些心思。首先明確一點(diǎn),無(wú)論用什么語(yǔ)言,最終代碼質(zhì)量是看管理,因此我們從前期開(kāi)發(fā)成本分析?,F(xiàn)在國(guó)內(nèi)流行的適用于網(wǎng)站的語(yǔ)言,大概有java、php、.net、python、ruby這五大陣營(yíng)。python和ruby因?yàn)樵趪?guó)內(nèi)流行的比較晚,現(xiàn)在人員還是相對(duì)難招一些。.net平臺(tái)的人相對(duì)多,但是到后期需要解決性能問(wèn)題時(shí),對(duì)人員技能的要求比較高。剩余的java、php用人可以說(shuō)是最多的。java和php無(wú)法從語(yǔ)言層面做比較,但對(duì)于初期,應(yīng)用幾乎都是靠前端支撐的網(wǎng)站來(lái)說(shuō),php入門簡(jiǎn)單、編寫快速,優(yōu)勢(shì)相對(duì)大一點(diǎn)。至于后端例如行為分析、銀行接口、異步消息處理等,等真正需要時(shí),就要根據(jù)不同業(yè)務(wù)需求來(lái)選擇不同語(yǔ)言了。
二、代碼版本管理
稍微有點(diǎn)規(guī)模的網(wǎng)站就需要使用代碼版本管理了。代碼版本管理兩點(diǎn)最大的好處,一是方便協(xié)同工作,二是有歷史記錄可查詢比較。代碼版本管理軟件有很多,vss/cvs/svn/hg等,目前國(guó)內(nèi)都比較流行,其中svn的普及度還是很高的。
假設(shè)選了svn,那么有幾點(diǎn)考慮。一是采用什么樹(shù)結(jié)構(gòu)。初期可能只有一條主干,往后就需要建立分支,例如一條開(kāi)發(fā)分支,一條上線分支,再往后,可能要每個(gè)小組一個(gè)分支。建議一開(kāi)始人少時(shí)選擇兩條分支,開(kāi)發(fā)和線上,每個(gè)功能本地測(cè)試無(wú)誤后提交到開(kāi)發(fā)分支,最后統(tǒng)一測(cè)試,可以上線時(shí)合并到上線分支。如果每人都建自己的分支,合并時(shí)會(huì)浪費(fèi)很大精力,對(duì)于幾乎每天都要修改幾次的WEB應(yīng)用來(lái)說(shuō),所費(fèi)時(shí)間太多。
向服務(wù)器部署代碼,可以手工部署也可以自動(dòng)部署。手工部署相對(duì)簡(jiǎn)單,一般可直接在服務(wù)器上svn update,或者找個(gè)新目錄svn checkout,再把web root給ln -s過(guò)去。應(yīng)用越復(fù)雜,部署越復(fù)雜,沒(méi)有什么統(tǒng)一標(biāo)準(zhǔn),只是別再用ftp上傳那種形式,一是上傳時(shí)文件引用不一致錯(cuò)誤率增加,二是很容易出現(xiàn)開(kāi)發(fā)人員的版本跟線上版本不一致,導(dǎo)致本來(lái)想改個(gè)錯(cuò)字結(jié)果變成回滾。如果有多臺(tái)服務(wù)器還是建議自動(dòng)部署,更換代碼的機(jī)器從當(dāng)前服務(wù)池中臨時(shí)撤出,更新完畢后再重新加入。
三、服務(wù)器硬件
在各個(gè)機(jī)房里,靠一臺(tái)服務(wù)器孤獨(dú)支撐的網(wǎng)站數(shù)不清,但如果資金稍微充足,建議至少三臺(tái)的標(biāo)準(zhǔn)配置,分別用作web處理、數(shù)據(jù)庫(kù)、備份。web服務(wù)器至少要8G內(nèi)存,雙sata raid1,如果經(jīng)濟(jì)稍微寬松,或靜態(tài)文件或圖片多,則15k sas raid10。數(shù)據(jù)庫(kù)至少16G內(nèi)存,15k sas raid 10。備份服務(wù)器最好跟數(shù)據(jù)庫(kù)服務(wù)器同等配置。硬件可以上整套品牌,也可以兼容機(jī),也可以半品牌半組裝,取決于經(jīng)濟(jì)能力。當(dāng)然,這是典型的搭配,有些類型應(yīng)用的性能瓶頸首先出現(xiàn)在web上,那種情況就要單獨(dú)分析了。
web服務(wù)器可以既跑程序又當(dāng)內(nèi)存緩存,數(shù)據(jù)庫(kù)服務(wù)器則只跑主數(shù)據(jù)庫(kù)(假如是MySQL的話),備份服務(wù)器所承擔(dān)就相對(duì)多一些,web配置、緩存配置、數(shù)據(jù)庫(kù)配置都要跟前兩臺(tái)一致,這樣WEB和數(shù)據(jù)庫(kù)任意一臺(tái)出問(wèn)題,很容易就可以將備份服務(wù)器切換過(guò)去臨時(shí)頂替,直到解決完問(wèn)題。要注意,硬件是隨時(shí)可能壞掉的,特別是硬盤,所以寧可WEB服務(wù)器跟數(shù)據(jù)庫(kù)服務(wù)器放在一起,也一定不能省掉備份,備份一定要異機(jī),并且有異步,電力故障、誤操作都可能導(dǎo)致一臺(tái)機(jī)器上的所有數(shù)據(jù)丟失。很多的開(kāi)源備份方案可選擇,最簡(jiǎn)單的就是rsync,寫crontab里,定時(shí)同步。備份和切換,建議多做測(cè)試,選最安全最適合業(yè)務(wù)的,并且盡可能異地備份。
四、機(jī)房
三種機(jī)房盡量不要選:聯(lián)通訪問(wèn)特別慢的電信機(jī)房、電信訪問(wèn)特別慢的聯(lián)通機(jī)房、電信聯(lián)通訪問(wèn)特別慢的移動(dòng)或鐵通機(jī)房。機(jī)房要盡可能多的實(shí)地參觀,多測(cè)試,找個(gè)網(wǎng)絡(luò)質(zhì)量好,管理嚴(yán)格的機(jī)房。機(jī)房可以說(shuō)是非常重要,直接關(guān)系到網(wǎng)站訪問(wèn)速度,網(wǎng)站訪問(wèn)速度直接關(guān)系到用戶體驗(yàn),訪問(wèn)速度很慢的網(wǎng)站,很難獲得用戶青睞。
五、架構(gòu)
在大方向上,被熟知的架構(gòu)是web負(fù)載均衡+數(shù)據(jù)庫(kù)主從+緩存+分布式存儲(chǔ)+隊(duì)列。在一開(kāi)始,按照可擴(kuò)展的原則設(shè)計(jì)和編程就可以。只是要多考慮緩存失效時(shí)的雪崩效應(yīng)、主從同步的數(shù)據(jù)一致性和時(shí)間差、隊(duì)列的穩(wěn)定性和失敗后的重試策略、文件存儲(chǔ)的效率和備份方式等等意外情況。緩存失效、數(shù)據(jù)庫(kù)復(fù)制中斷、隊(duì)列寫入錯(cuò)誤、電源損壞,在實(shí)際運(yùn)維中經(jīng)常發(fā)生,如果不注意這些,出現(xiàn)問(wèn)題時(shí)恢復(fù)期可能會(huì)超出預(yù)期很長(zhǎng)時(shí)間。
六、服務(wù)器軟件
操作系統(tǒng)Linux很流行。在沒(méi)有專業(yè)運(yùn)維人員的情況下,應(yīng)傾向于擇使用的人多、社區(qū)活躍、配置方便、升級(jí)方便的發(fā)行版,例如RH系列、debian、ubuntu server等,硬件和操作系統(tǒng)要一起選擇,看是否有適合的驅(qū)動(dòng),如果確定用某種商業(yè)軟件或解決方案,也要提前知曉其對(duì)哪種操作系統(tǒng)支持最佳。web服務(wù)器方面,apache、nginx、lighttpd三大系列中,apache占有量還是最大,但是想把性能調(diào)教好還是需要很專業(yè)的,nginx和lighttpd在不需要太多調(diào)整的情況下可以達(dá)到一個(gè)比較不錯(cuò)的性能。無(wú)論選擇什么軟件,除非改過(guò)這些軟件或你的程序真的不兼容新版本,否則盡量版本越新越好,版本新,意味著新特性增多、BUG減少、性能增加。一個(gè)典型的php網(wǎng)站,基本上大多數(shù)人都沒(méi)改過(guò)任何服務(wù)器軟件源代碼,絕大多數(shù)情況是能平穩(wěn)的升級(jí)到新版本的。類似于jdk5到 jdk6,python2到python3這類變動(dòng)比較大的升級(jí)還是比較少見(jiàn)的??纯碈hangeLog,看看升級(jí)說(shuō)明,結(jié)合自己情況評(píng)估測(cè)試一下,越早升級(jí)越好,升級(jí)的越晚,所花費(fèi)的成本越高。對(duì)于軟件包,盡量使用發(fā)行版內(nèi)置的包管理工具,沒(méi)有特殊要求時(shí)不建議自己編譯,那樣對(duì)將來(lái)運(yùn)維不利。
七、數(shù)據(jù)庫(kù)
幾乎所有操作最后都要落到數(shù)據(jù)庫(kù)身上,它又最難擴(kuò)展(存儲(chǔ)也挺難)。數(shù)據(jù)庫(kù)常見(jiàn)的擴(kuò)展方法有復(fù)制、分片,設(shè)計(jì)時(shí)要考慮到每種應(yīng)用的數(shù)據(jù)如何復(fù)制、分片,當(dāng)然這種考慮一般會(huì)推遲到技術(shù)設(shè)計(jì)時(shí)期。在初期進(jìn)行數(shù)據(jù)庫(kù)結(jié)構(gòu)設(shè)計(jì)時(shí),要根據(jù)不同的業(yè)務(wù)類型和增長(zhǎng)量預(yù)期來(lái)考慮是否要分庫(kù)、分區(qū),并且盡量不要使用聯(lián)合查詢、不使用自增ID以方便分片。復(fù)制延時(shí)問(wèn)題、主從數(shù)據(jù)庫(kù)數(shù)據(jù)一致性問(wèn)題,可以自己寫或者用已有的運(yùn)維工具進(jìn)行檢測(cè)。
用存儲(chǔ)過(guò)程是比較難擴(kuò)展的,這種情形多發(fā)生于傳統(tǒng)C/S,特別是OA系統(tǒng)轉(zhuǎn)換過(guò)來(lái)的開(kāi)發(fā)人員。低成本網(wǎng)站不是一兩臺(tái)小型機(jī)跑一個(gè)數(shù)據(jù)庫(kù)處理所有業(yè)務(wù)的模式,是機(jī)海作戰(zhàn)。方便水平擴(kuò)展比那點(diǎn)預(yù)分析時(shí)間和網(wǎng)絡(luò)傳輸流量要重要的多的多。
另外,現(xiàn)在流行一種概念叫NoSQL,可以理解為非傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)。實(shí)際應(yīng)用中,網(wǎng)站有著越來(lái)越多的密集寫操作、上億的簡(jiǎn)單關(guān)系數(shù)據(jù)讀取、熱備等,這都不是傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)所擅長(zhǎng)的,于是就產(chǎn)生了很多非關(guān)系型數(shù)據(jù)庫(kù),比如Redis/TC&TT/MongoDB/Memcachedb等,在測(cè)試中,這些幾乎都達(dá)到了每秒至少一萬(wàn)次的寫操作,內(nèi)存型的甚至5萬(wàn)以上。在設(shè)計(jì)時(shí),可根據(jù)業(yè)務(wù)特點(diǎn)和性能要求來(lái)選擇是否使用這類數(shù)據(jù)庫(kù)。例如MongoDB,幾句配置就可以組建一個(gè)復(fù)制+自動(dòng)分片+failover的環(huán)境,文檔化的存儲(chǔ)也簡(jiǎn)化了傳統(tǒng)設(shè)計(jì)庫(kù)結(jié)構(gòu)再開(kāi)發(fā)的模式。但是當(dāng)你決定采用一項(xiàng)技術(shù)時(shí),一定要真正了解其優(yōu)劣,例如可能你所選擇的技術(shù)并不能支持你所需要的事務(wù)和數(shù)據(jù)一致性要求。
八、文件存儲(chǔ)
存儲(chǔ)的分布幾乎跟數(shù)據(jù)庫(kù)擴(kuò)展一樣困難,不過(guò)只有百萬(wàn)的PV的情況下,磁盤IO方面一般不會(huì)成大問(wèn)題,一兩臺(tái)采用SATA做條帶RAID的機(jī)器可以應(yīng)付,反而是自己做異步備份比較復(fù)雜,因?yàn)樾∥募唷H绻挥幸慌_(tái)機(jī)器做存儲(chǔ),可以做簡(jiǎn)單的優(yōu)化,例如放最小縮略圖的分區(qū)和放中等縮略圖的分區(qū),根據(jù)平均大小調(diào)整一下塊大小。存儲(chǔ)要規(guī)劃好目錄結(jié)構(gòu),否則文件增多后維護(hù)起來(lái)復(fù)雜,也不利于擴(kuò)展。同時(shí)還要考慮將來(lái)擴(kuò)容,例如采用LVM,或者把文件根據(jù)不同規(guī)則散列到不同機(jī)器。磁盤IO繁重的情況下更容易出現(xiàn)故障,所以要做好備份,若發(fā)現(xiàn)有盤壞掉,要馬上行動(dòng)更換,很多人的硬盤都是壞了一塊之后,接二連三的壞下去。
為了將來(lái)圖片走cdn做準(zhǔn)備,一開(kāi)始最好就將圖片的域名分開(kāi),且不用主域名。因?yàn)楹芏嗑W(wǎng)站都將cookie設(shè)置到了.domain.ltd,如果圖片也在這個(gè)域名下,很可能因?yàn)閏ookie而造成緩存失效,并且占多余流量,還可能因?yàn)闉g覽器并發(fā)線程限制造成訪問(wèn)緩慢。
九、程序
一定硬件條件下,應(yīng)用能承載多少訪問(wèn)量,很大一部分也取決于程序如何寫。程序?qū)懙牟缓茫赡芤蝗f(wàn)的訪問(wèn)都承載不了,寫的好,可能一兩臺(tái)機(jī)器就能承擔(dān)幾百萬(wàn)PV。越是復(fù)雜、數(shù)據(jù)實(shí)時(shí)性要求越高的應(yīng)用,優(yōu)化起來(lái)越難,但對(duì)普通網(wǎng)站有一個(gè)統(tǒng)一的思路,就是盡量向前端優(yōu)化、減少數(shù)據(jù)庫(kù)操作、減少磁盤IO。向前端優(yōu)化指的是,在不影響功能和體驗(yàn)的情況下,能在瀏覽器執(zhí)行的不要在服務(wù)端執(zhí)行,能在緩存服務(wù)器上直接返回的不要到應(yīng)用服務(wù)器,程序能直接取得的結(jié)果不要到外部取得,本機(jī)內(nèi)能取得的數(shù)據(jù)不要到遠(yuǎn)程取,內(nèi)存能取到的不要到磁盤取,緩存中有的不要去數(shù)據(jù)庫(kù)查詢。減少數(shù)據(jù)庫(kù)操作指減少更新次數(shù)、緩存結(jié)果減少查詢次數(shù)、將數(shù)據(jù)庫(kù)執(zhí)行的操作盡可能的讓你的程序完成(例如join查詢),減少磁盤IO指盡量不使用文件系統(tǒng)作為緩存、減少讀寫文件次數(shù)等。程序優(yōu)化永遠(yuǎn)要優(yōu)化慢的部分,換語(yǔ)法是無(wú)法“優(yōu)化”的。
然而編程時(shí)不應(yīng)該把重點(diǎn)放在優(yōu)化上,應(yīng)該關(guān)注擴(kuò)展性。當(dāng)今的WEB應(yīng)用,需求變化非常之快,適應(yīng)多種需求的架構(gòu)是不存在的,我們的擴(kuò)展性就要把要點(diǎn)放在跟底層交互的架構(gòu)上,例如持久化數(shù)據(jù)的存取規(guī)則、緩存的存取規(guī)則等,還有一些共用服務(wù),例如用戶信息等。先把不變的部分做完善,剩下的部分就很容易將精力放在業(yè)務(wù)邏輯上面了。
關(guān)于作者
劉志一,從1999年做個(gè)人網(wǎng)站開(kāi)始一直專注于互聯(lián)網(wǎng),目前就職于一家垂直行業(yè)C2C網(wǎng)站,做產(chǎn)品和開(kāi)發(fā)方面工作。
建站流程
-
網(wǎng)站需求
-
網(wǎng)站策劃方案
-
頁(yè)面設(shè)計(jì)風(fēng)格
-
確認(rèn)交付使用
-
資料錄入優(yōu)化
-
程序設(shè)計(jì)開(kāi)發(fā)
-
后續(xù)跟蹤服務(wù)
-
聯(lián)系電話
010-60259772
熱門標(biāo)簽
- 網(wǎng)站建設(shè)
- 食品網(wǎng)站建設(shè)
- 微信小程序開(kāi)發(fā)
- 小程序開(kāi)發(fā)
- 無(wú)錫網(wǎng)站建設(shè)
- 研究所網(wǎng)站建設(shè)
- 沈陽(yáng)網(wǎng)站建設(shè)
- 廊坊網(wǎng)站建設(shè)
- 鄭州網(wǎng)站建設(shè)
- 婚紗攝影網(wǎng)站建設(shè)
- 手機(jī)端網(wǎng)站建設(shè)
- 高校網(wǎng)站制作
- 天津網(wǎng)站建設(shè)
- 教育網(wǎng)站建設(shè)
- 品牌網(wǎng)站建設(shè)
- 政府網(wǎng)站建設(shè)
- 北京網(wǎng)站建設(shè)
- 網(wǎng)站設(shè)計(jì)
- 網(wǎng)站制作
最新文章
推薦新聞
更多行業(yè)-
網(wǎng)絡(luò)證券交易的基本特點(diǎn)
網(wǎng)絡(luò)證券交易之所以能夠有如此誘人的前景,與目前通行的柜臺(tái)委托交易、自助...
2014-09-10 -
網(wǎng)站建設(shè)中圖片都有哪些使用方法?
網(wǎng)站建設(shè)中圖片使用方法,經(jīng)常上網(wǎng)的人都會(huì)預(yù)覽成千上萬(wàn)網(wǎng)站,會(huì)感覺(jué)到有的...
2020-02-07 -
什么是ICP?
根據(jù)中華人民共和國(guó)國(guó)務(wù)院第291號(hào)《中華人民共和國(guó)電信條例》、第292...
2019-07-15 -
外貿(mào)網(wǎng)站建設(shè)必須要做好哪些工作?
在之前的網(wǎng)站設(shè)計(jì)發(fā)表的文章中,提到了客戶也要懂得網(wǎng)站建設(shè)的常識(shí),因?yàn)樵?..
2020-11-18 -
局域網(wǎng)的構(gòu)成及特點(diǎn)是什么
1.局域網(wǎng) 局域網(wǎng)指在一定區(qū)域內(nèi)由多臺(tái)計(jì)算機(jī)近距離互連在一起的計(jì)...
2014-06-28 -
深圳網(wǎng)站建設(shè)完成后網(wǎng)站名稱可以隨意更改嗎?
首先我們要明確一點(diǎn),不要把修改你網(wǎng)站的標(biāo)題作為最后的手段,因?yàn)楹苡锌赡?..
2021-07-30
預(yù)約專業(yè)咨詢顧問(wèn)溝通!
免責(zé)聲明
非常感謝您訪問(wèn)我們的網(wǎng)站。在您使用本網(wǎng)站之前,請(qǐng)您仔細(xì)閱讀本聲明的所有條款。
1、本站部分內(nèi)容來(lái)源自網(wǎng)絡(luò),涉及到的部分文章和圖片版權(quán)屬于原作者,本站轉(zhuǎn)載僅供大家學(xué)習(xí)和交流,切勿用于任何商業(yè)活動(dòng)。
2、本站不承擔(dān)用戶因使用這些資源對(duì)自己和他人造成任何形式的損失或傷害。
3、本聲明未涉及的問(wèn)題參見(jiàn)國(guó)家有關(guān)法律法規(guī),當(dāng)本聲明與國(guó)家法律法規(guī)沖突時(shí),以國(guó)家法律法規(guī)為準(zhǔn)。
4、如果侵害了您的合法權(quán)益,請(qǐng)您及時(shí)與我們,我們會(huì)在第一時(shí)間刪除相關(guān)內(nèi)容!
聯(lián)系方式:010-60259772
電子郵件:394588593@qq.com