如何打造一個(gè)高可用,高性能,易擴(kuò)展,可伸縮且安全的網(wǎng)站?這是很多大型互聯(lián)網(wǎng)企業(yè)和其架構(gòu)師們應(yīng)該關(guān)注的問(wèn)題。在拜閱了李神的《大型網(wǎng)站技術(shù)架構(gòu)》一書(shū)以及結(jié)合自己對(duì)于互聯(lián)網(wǎng)的淺薄理解,決定對(duì)其每一章做個(gè)學(xué)習(xí)筆記,供大家交流學(xué)習(xí),也希望大家能夠做出批評(píng)和建議,在構(gòu)建大型網(wǎng)站以及成為架構(gòu)師之路上有所幫助~
第一章:大型網(wǎng)站架構(gòu)演化
九層之臺(tái),始于壘土;千里之行,始于足下。
對(duì)于網(wǎng)站的發(fā)展,亦是如此,從上世紀(jì)90年代開(kāi)始,互聯(lián)網(wǎng)經(jīng)歷了20多年的發(fā)展,發(fā)生了翻天覆地的變化,今天,全球有一半的人使用互聯(lián)網(wǎng),從信息檢索到實(shí)時(shí)通信,從電子購(gòu)物到文化娛樂(lè),互聯(lián)網(wǎng)滲透到了生活的每一個(gè)角落。但是,構(gòu)建一個(gè)高性能的網(wǎng)站,絕非一朝一夕可以完成,我們來(lái)看下,作為一個(gè)大型網(wǎng)站系統(tǒng)應(yīng)有的特點(diǎn):
1.大型網(wǎng)站系統(tǒng)應(yīng)有的特點(diǎn)
高并發(fā),大流量:需要面對(duì)高并發(fā)用戶(hù),大流量訪問(wèn)。舉個(gè)例子,去往迪拜的飛機(jī)有200張票,但是有100w人都擠進(jìn)系統(tǒng)買(mǎi)票,如何讓這100w人能夠看到票務(wù)的實(shí)時(shí)更新,以及順利的買(mǎi)到一張票,都是一個(gè)網(wǎng)站架構(gòu)師應(yīng)該考慮的問(wèn)題。這也許對(duì)于淘寶的“雙十一”1000w的一分鐘獨(dú)立訪問(wèn)用戶(hù)量來(lái)說(shuō),是個(gè)微不足道的數(shù)字,但是對(duì)于用戶(hù)的體驗(yàn)以及網(wǎng)站的口碑來(lái)說(shuō),都是一項(xiàng)不小的挑戰(zhàn)。
高可用:相對(duì)于高并發(fā)來(lái)說(shuō),高可用并不是一個(gè)比較有規(guī)律的參數(shù),7*24 是每個(gè)網(wǎng)站的夢(mèng)想,但是你并不知道,在某一刻,他就沒(méi)理由的宕機(jī)了。
海量數(shù)據(jù):存儲(chǔ),管理海量的數(shù)據(jù),需要使用大量的服務(wù)器。FaceBook每周上傳的照片接近10億,沒(méi)有一個(gè)大型的存儲(chǔ)服務(wù)器的支撐,相信用戶(hù)量不會(huì)一直飆升。
用戶(hù)分布廣泛,網(wǎng)絡(luò)情況復(fù)雜:許多大型的互聯(lián)網(wǎng)都是為全球用戶(hù)提供服務(wù)的,用戶(hù)分布范圍廣,各地網(wǎng)絡(luò)情況千差萬(wàn)別。各個(gè)運(yùn)行商之間的互通,各個(gè)國(guó)家的數(shù)據(jù)連接等等。
安全環(huán)境惡劣:由于互聯(lián)網(wǎng)的開(kāi)放性,使得互聯(lián)網(wǎng)更容易受到攻擊,包括各種省份證信息被竊取等事件屢見(jiàn)不鮮。
漸進(jìn)式發(fā)展:幾乎所有的大型互聯(lián)網(wǎng)網(wǎng)站都是從一個(gè)小網(wǎng)站開(kāi)始,漸進(jìn)發(fā)展起來(lái)的,好的互聯(lián)網(wǎng)產(chǎn)品都是慢慢運(yùn)營(yíng)出來(lái)的。
2.大型網(wǎng)站架構(gòu)演化發(fā)展歷程
大型網(wǎng)站的技術(shù)挑戰(zhàn)來(lái)自于龐大的用戶(hù),高并發(fā)的訪問(wèn)和海量的數(shù)據(jù),任何簡(jiǎn)單的業(yè)務(wù)一旦需要處理數(shù)以P計(jì)的數(shù)據(jù)和面對(duì)數(shù)以?xún)|計(jì)的用戶(hù),問(wèn)題就會(huì)變的和棘手,我們來(lái)看下網(wǎng)站架構(gòu)發(fā)展的歷程:
階段1 :初始階段的網(wǎng)站架構(gòu):
小型網(wǎng)站最開(kāi)始時(shí)沒(méi)有太多人訪問(wèn),只需要一臺(tái)服務(wù)器綽綽有余,此階段網(wǎng)站架構(gòu)如圖:
應(yīng)用程序,數(shù)據(jù)庫(kù),文件等所有資源都放在一臺(tái)服務(wù)器上,通常服務(wù)器視野Linux,應(yīng)用程序使用PHP,然后部署在Apache上,數(shù)據(jù)庫(kù)MySQL.
階段2:應(yīng)用服務(wù)和數(shù)據(jù)庫(kù)分離:
隨著網(wǎng)站業(yè)務(wù)的發(fā)展,一臺(tái)服務(wù)器逐漸不能滿足需求,越來(lái)越多的用戶(hù)訪問(wèn)導(dǎo)致性能越來(lái)越差,越來(lái)越多的數(shù)據(jù)導(dǎo)致存儲(chǔ)空間不足,這時(shí)候,就需要將應(yīng)用和數(shù)據(jù)分離,此時(shí)整個(gè)網(wǎng)站使用三臺(tái)服務(wù)器:應(yīng)用服務(wù)器,文件服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器,三臺(tái)服務(wù)器對(duì)硬件資源要求各不相同:應(yīng)用服務(wù)器需要處理大量的業(yè)務(wù)邏輯,因此需要更快更強(qiáng)大的CPU,數(shù)據(jù)庫(kù)服務(wù)器需要快速磁盤(pán)檢索和數(shù)據(jù)緩存,因此需要更快的硬盤(pán)和更大的內(nèi)存,文件服務(wù)器需要存儲(chǔ)大量的用戶(hù)上傳文件,因此需要更大的硬盤(pán)。
階段3:使用緩存改善網(wǎng)站性能:
網(wǎng)站使用的緩存可以分為兩種:緩存在應(yīng)用服務(wù)器的本地緩存和緩存在專(zhuān)門(mén)的分布式緩存服務(wù)器上的遠(yuǎn)程緩存。本地緩存的訪問(wèn)速度更快一些,但是受應(yīng)用服務(wù)器內(nèi)存限制,緩存數(shù)據(jù)量有限。遠(yuǎn)程分布式緩存可以使用集群的方式,部署大內(nèi)存的服務(wù)器作為專(zhuān)門(mén)的緩存服務(wù)器,可以在理論上做到不受內(nèi)存容量的限制:
階段4:使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力:
當(dāng)有一臺(tái)服務(wù)器的處理能力、存儲(chǔ)空間不足時(shí),不要企圖去更換更強(qiáng)大的服務(wù)器,對(duì)于大型網(wǎng)站而言,不管多么強(qiáng)大的服務(wù)器,都滿足不了網(wǎng)站持續(xù)增長(zhǎng)的業(yè)務(wù)需求。此時(shí),應(yīng)該考慮增加一臺(tái)服務(wù)器分擔(dān)原有服務(wù)器的訪問(wèn)以及存儲(chǔ)壓力:
階段5:數(shù)據(jù)庫(kù)讀寫(xiě)分離:
目前大部分的主流數(shù)據(jù)庫(kù)都提供主從熱備功能,通過(guò)配置兩臺(tái)數(shù)據(jù)庫(kù)主從關(guān)系,可以將一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器的數(shù)據(jù)更新同步到另外一臺(tái)服務(wù)器上,網(wǎng)站利用這一功能,實(shí)現(xiàn)數(shù)據(jù)庫(kù)讀寫(xiě)分離,從而改善數(shù)據(jù)庫(kù)負(fù)載壓力:
階段6:使用反向代理和CDN加速網(wǎng)站響應(yīng):
CDN和反向代理的基本原理都是緩存,區(qū)別在于CDN部署在網(wǎng)絡(luò)提供商的機(jī)房,用戶(hù)在請(qǐng)求時(shí),能從最近的機(jī)房獲取到資源;反向代理部署在網(wǎng)站的中心機(jī)房,當(dāng)用戶(hù)請(qǐng)求到達(dá)中心機(jī)房后,首先訪問(wèn)的是機(jī)房的反向代理服務(wù)器,如果反向代理服務(wù)器中存儲(chǔ)了用戶(hù)請(qǐng)求的資源,那么優(yōu)先返回該部分資源給用戶(hù)。
階段7:使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫(kù)系統(tǒng):
數(shù)據(jù)庫(kù)經(jīng)過(guò)讀寫(xiě)分離后,從一臺(tái)服務(wù)器分成兩臺(tái)服務(wù)器,但是隨著網(wǎng)站業(yè)務(wù)的發(fā)展,依然不能滿足需求,這是就需要使用分布式數(shù)據(jù)庫(kù),文件系統(tǒng)也是如此:
分布式數(shù)據(jù)庫(kù)是網(wǎng)站數(shù)據(jù)庫(kù)拆分的最后手段,只有在單表數(shù)據(jù)規(guī)模非常大的時(shí)候才使用。一般情況下,網(wǎng)站更常用的數(shù)據(jù)庫(kù)拆分手段是業(yè)務(wù)分庫(kù),將不同業(yè)務(wù)的數(shù)據(jù)庫(kù)部署在不同的服務(wù)器上。
階段8:使用NoSQL和搜索引擎:
隨著網(wǎng)站業(yè)務(wù)越來(lái)越復(fù)雜,對(duì)數(shù)據(jù)存儲(chǔ)和檢索的需求也越來(lái)越復(fù)雜,網(wǎng)站需要采用一些非關(guān)系數(shù)據(jù)庫(kù)技術(shù)如NoSQL和非數(shù)據(jù)庫(kù)查詢(xún)技術(shù)如搜索引擎:
階段9:業(yè)務(wù)拆分:
大型網(wǎng)站為了應(yīng)對(duì)日益復(fù)雜的業(yè)務(wù)場(chǎng)景,通過(guò)使用分而治之的手段將整個(gè)網(wǎng)站業(yè)務(wù)分成不同的產(chǎn)品線,如大型購(gòu)物網(wǎng)站會(huì)將首頁(yè),商鋪,訂單,買(mǎi)家等拆分成不通的產(chǎn)品線,分歸不通的業(yè)務(wù)團(tuán)隊(duì)負(fù)責(zé)。具體到技術(shù)上,也會(huì)根據(jù)產(chǎn)品線劃分,將一個(gè)網(wǎng)站拆分成許多不同的應(yīng)用,每個(gè)獨(dú)立部署維護(hù)。應(yīng)用之間可以通過(guò)一個(gè)超鏈接建立關(guān)系,也可以通過(guò)消息隊(duì)列進(jìn)行數(shù)據(jù)分發(fā),當(dāng)然最多的還是通過(guò)訪問(wèn)同一個(gè)數(shù)據(jù)存儲(chǔ)系統(tǒng)來(lái)構(gòu)成一個(gè)關(guān)聯(lián)的完整系統(tǒng):
階段10:分布式服務(wù):
隨著業(yè)務(wù)拆分越來(lái)越小,存儲(chǔ)系統(tǒng)越來(lái)越龐大,應(yīng)用系統(tǒng)的整體復(fù)雜程度呈指數(shù)級(jí)增加,部署維護(hù)越來(lái)越困難,由于所有的應(yīng)用要和所有的數(shù)據(jù)庫(kù)系統(tǒng)連接,在數(shù)萬(wàn)臺(tái)服務(wù)器規(guī)模的網(wǎng)站中,這些連接的數(shù)目是服務(wù)器規(guī)模的平方,導(dǎo)致數(shù)據(jù)庫(kù)連接資源不足,拒絕服務(wù)。
既然每一個(gè)應(yīng)用系統(tǒng)都需要執(zhí)行許多相同的業(yè)務(wù)操作,比如用戶(hù)管理,商品管理等,那么可以將這些共用的業(yè)務(wù)提取出來(lái),獨(dú)立部署。由這些可復(fù)用的業(yè)務(wù)連接數(shù)據(jù)庫(kù),提供共用業(yè)務(wù)服務(wù),而應(yīng)用系統(tǒng)只需要管理用戶(hù)界面,通過(guò)分布式服務(wù)調(diào)用共用業(yè)務(wù)服務(wù)完成具體業(yè)務(wù)操作。
大型網(wǎng)站的架構(gòu)演化到這里,基本上大多數(shù)的技術(shù)問(wèn)題都可以得到解決,諸如跨數(shù)據(jù)中心的實(shí)時(shí)數(shù)據(jù)同步和具體網(wǎng)站業(yè)務(wù)相關(guān)的問(wèn)題也可以通過(guò)組合改進(jìn)現(xiàn)有的技術(shù)架構(gòu)來(lái)解決。
3.總結(jié):
這個(gè)世界沒(méi)有那個(gè)網(wǎng)站從誕生起就是大型網(wǎng)站,也沒(méi)有哪個(gè)網(wǎng)站從發(fā)布起就有龐大的用戶(hù),高并發(fā)的訪問(wèn)以及海量的用戶(hù),大型網(wǎng)站都是從小型網(wǎng)站發(fā)展而來(lái)的。大型網(wǎng)站架構(gòu)技術(shù)的核心價(jià)值不是從無(wú)到有建立一個(gè)網(wǎng)站,而是能夠伴隨小型網(wǎng)站業(yè)務(wù)的逐步發(fā)展,慢慢演化成一個(gè)大型網(wǎng)站,在此過(guò)程中,不需要放棄什么,不需要推翻什么,不需要?jiǎng)×业母锩吐陌岩粋€(gè)有=只有一臺(tái)服務(wù)器,幾百個(gè)用戶(hù)的小網(wǎng)站演化成一個(gè)幾十萬(wàn)臺(tái)服務(wù)器,數(shù)十億用戶(hù)的大型網(wǎng)站。