李智慧老師的大型網(wǎng)站架構(gòu)已經(jīng)買了兩年了,之前大體看過一次,不過還未內(nèi)化為自己的本領(lǐng),最近項(xiàng)目空閑,決定盡力掌握這部分的知識,以跟上大師的節(jié)奏。今天是兒童節(jié),祝自己和大家心態(tài)永遠(yuǎn)年輕,即使沒有年輕的身體,也一定要有純凈的靈魂。
電腦培訓(xùn),計算機(jī)培訓(xùn),平面設(shè)計培訓(xùn),網(wǎng)頁設(shè)計培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

發(fā)展歷程

網(wǎng)站的發(fā)展和生物一樣,都會經(jīng)歷不同的階段,通過不斷的成長而塑造成一個成熟的個體。也就是說大型網(wǎng)站不是生來就有的,也是跟隨著公司業(yè)務(wù)的發(fā)展,不斷推進(jìn)的。畢竟網(wǎng)站是公司業(yè)務(wù)的載體,而不是主體,這和純技術(shù)公司有很大的不同。李老師說的好,"是業(yè)務(wù)成就了技術(shù),是事業(yè)成就了人"。在實(shí)際的設(shè)計中,一定謹(jǐn)記溝通的重要性,不能為了技術(shù)而技術(shù),有時候合理的溝通,通過業(yè)務(wù)流程合理的改變可以解決很多技術(shù)無法解決的問題,比如12306網(wǎng)站通過分時段銷售,排隊等策略很好的解決了春運(yùn)購票高峰的問題。接下來,以時間為序簡單介紹一下大型網(wǎng)站野蠻生長的發(fā)展歷程。

  1. 初始階段:比如常見lamp,再Linux環(huán)境中,使用php構(gòu)建網(wǎng)站,mysql數(shù)據(jù)庫,部署在apache上。

  2. 應(yīng)用服務(wù)和數(shù)據(jù)服務(wù)分離:隨著業(yè)務(wù)的發(fā)展,越來越多的uv導(dǎo)致性能下降,越來越多的數(shù)據(jù)導(dǎo)致存儲空間不足,因此需要將系統(tǒng)分為3個部分,分別是數(shù)據(jù)庫服務(wù)器(內(nèi)存和硬盤空間大),應(yīng)用服務(wù)器(更強(qiáng)大CPU),文件服務(wù)器(圖片等靜態(tài)資源,更大的硬盤容量)。

  3. 使用緩存改善性能:網(wǎng)站訪問也遵循”28定律“,比如網(wǎng)上購物,大家都會集中瀏覽成交數(shù)高、評價良好的少數(shù)商品。既然業(yè)務(wù)訪問集中在小部分?jǐn)?shù)據(jù)上,就可以將這部分?jǐn)?shù)據(jù)緩存起來,減少數(shù)據(jù)庫的壓力,提高網(wǎng)站性能。以物理上來劃分,緩存可以分為本地緩存和緩存在分布式緩存服務(wù)器上的遠(yuǎn)程緩存,前者高效但空間小,后者容量理論上可以無限擴(kuò)展。

  4. 使用應(yīng)用服務(wù)器集群改善網(wǎng)站并發(fā)能力:在使用緩存后,數(shù)據(jù)訪問壓力減小,但單一應(yīng)用服務(wù)器能處理的并發(fā)請求仍然有限,因此需要構(gòu)建應(yīng)用服務(wù)器集群,通過負(fù)載均衡服務(wù)器來分發(fā)請求。

  5. 數(shù)據(jù)庫的讀寫分離:雖然之前增加了緩存,但部分的讀操作(未命中)和全部的寫操作還是要訪問數(shù)據(jù)庫,當(dāng)規(guī)模進(jìn)一步增加時,數(shù)據(jù)庫依然會成為瓶頸,因此可以通過數(shù)據(jù)庫主從熱備的方式來實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,通過主數(shù)據(jù)進(jìn)行寫操作,從數(shù)據(jù)庫進(jìn)行讀操作。

  6. 使用反向代理和CDN加速網(wǎng)站響應(yīng):隨著業(yè)務(wù)版圖的進(jìn)一步擴(kuò)展,用戶分布越來越廣泛,不同地區(qū)訪問網(wǎng)站時速度差別會很大。而訪問延遲和用戶流失率正相關(guān),因此需要通過CDN和反向代理等手段,為用戶提供更好的服務(wù)。兩者的基礎(chǔ)都是緩存,CDN部署在網(wǎng)絡(luò)提供商的機(jī)房,當(dāng)用戶訪問時可以從距離最近的機(jī)房獲取數(shù)據(jù),反向代理部署在網(wǎng)站中心機(jī)房,訪問首先由反向代理服務(wù)器處理,如果緩存中有客戶所需數(shù)據(jù),直接返回即可。

  7. 使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng):分布式數(shù)據(jù)庫時網(wǎng)站數(shù)據(jù)庫拆分的最后手段,只有在單表數(shù)據(jù)規(guī)模特別大時才使用,通常應(yīng)該采用業(yè)務(wù)分庫,既簡單也合理。分布式文件系統(tǒng)比較常見,比如Hadoop的基礎(chǔ)HDFS。

  8. 使用NoSQL和搜索引擎:NoSql和搜索引擎技術(shù)具有可伸縮的分布式特性,應(yīng)用服務(wù)器可以通過統(tǒng)一的數(shù)據(jù)訪問磨礦訪問各種數(shù)據(jù),減輕應(yīng)用程序管理數(shù)據(jù)源的麻煩。

  9. 業(yè)務(wù)拆分:對于大型網(wǎng)站,分而治之是最棒的手段,比如電商網(wǎng)站,可以將商鋪、訂單、買家、賣家、支付等拆分為不同的產(chǎn)品線,歸屬不同業(yè)務(wù)團(tuán)隊。每個應(yīng)用獨(dú)立部署維護(hù)(docker),應(yīng)用間通過鏈接建立關(guān)系,相互間可以通過消