如何打造一個高可用谚咬,高性能烘嘱,易擴展昆禽,可伸縮且安全的網(wǎng)站蝗蛙?這是很多大型互聯(lián)網(wǎng)企業(yè)和其架構(gòu)師們應(yīng)該關(guān)注的問題。在拜閱了李神的《大型網(wǎng)站技術(shù)架構(gòu)》一書以及結(jié)合自己對于互聯(lián)網(wǎng)的淺薄理解醉鳖,決定對其每一章做個學習筆記歼郭,供大家交流學習,也希望大家能夠做出批評和建議辐棒,在構(gòu)建大型網(wǎng)站以及成為架構(gòu)師之路上有所幫助~
第一章:大型網(wǎng)站架構(gòu)演化
九層之臺病曾,始于壘土;千里之行漾根,始于足下泰涂。
對于網(wǎng)站的發(fā)展,亦是如此辐怕,從上世紀90年代開始逼蒙,互聯(lián)網(wǎng)經(jīng)歷了20多年的發(fā)展,發(fā)生了翻天覆地的變化寄疏,今天是牢,全球有一半的人使用互聯(lián)網(wǎng),從信息檢索到實時通信陕截,從電子購物到文化娛樂驳棱,互聯(lián)網(wǎng)滲透到了生活的每一個角落。但是农曲,構(gòu)建一個高性能的網(wǎng)站社搅,絕非一朝一夕可以完成,我們來看下乳规,作為一個大型網(wǎng)站系統(tǒng)應(yīng)有的特點:
1.大型網(wǎng)站系統(tǒng)應(yīng)有的特點
高并發(fā)形葬,大流量:需要面對高并發(fā)用戶,大流量訪問暮的。舉個例子笙以,去往迪拜的飛機有200張票,但是有100w人都擠進系統(tǒng)買票冻辩,如何讓這100w人能夠看到票務(wù)的實時更新猖腕,以及順利的買到一張票,都是一個網(wǎng)站架構(gòu)師應(yīng)該考慮的問題微猖。這也許對于淘寶的“雙十一”1000w的一分鐘獨立訪問用戶量來說谈息,是個微不足道的數(shù)字,但是對于用戶的體驗以及網(wǎng)站的口碑來說凛剥,都是一項不小的挑戰(zhàn)侠仇。
高可用:相對于高并發(fā)來說,高可用并不是一個比較有規(guī)律的參數(shù),7*24 是每個網(wǎng)站的夢想逻炊,但是你并不知道互亮,在某一刻,他就沒理由的宕機了余素。
海量數(shù)據(jù):存儲豹休,管理海量的數(shù)據(jù),需要使用大量的服務(wù)器桨吊。FaceBook每周上傳的照片接近10億威根,沒有一個大型的存儲服務(wù)器的支撐,相信用戶量不會一直飆升视乐。
用戶分布廣泛洛搀,網(wǎng)絡(luò)情況復雜:許多大型的互聯(lián)網(wǎng)都是為全球用戶提供服務(wù)的,用戶分布范圍廣佑淀,各地網(wǎng)絡(luò)情況千差萬別留美。各個運行商之間的互通,各個國家的數(shù)據(jù)連接等等伸刃。
安全環(huán)境惡劣:由于互聯(lián)網(wǎng)的開放性谎砾,使得互聯(lián)網(wǎng)更容易受到攻擊,包括各種省份證信息被竊取等事件屢見不鮮捧颅。
漸進式發(fā)展:幾乎所有的大型互聯(lián)網(wǎng)網(wǎng)站都是從一個小網(wǎng)站開始景图,漸進發(fā)展起來的,好的互聯(lián)網(wǎng)產(chǎn)品都是慢慢運營出來的隘道。
2.大型網(wǎng)站架構(gòu)演化發(fā)展歷程
大型網(wǎng)站的技術(shù)挑戰(zhàn)來自于龐大的用戶症歇,高并發(fā)的訪問和海量的數(shù)據(jù),任何簡單的業(yè)務(wù)一旦需要處理數(shù)以P計的數(shù)據(jù)和面對數(shù)以億計的用戶谭梗,問題就會變的和棘手,我們來看下網(wǎng)站架構(gòu)發(fā)展的歷程:
階段1 :初始階段的網(wǎng)站架構(gòu):
小型網(wǎng)站最開始時沒有太多人訪問宛蚓,只需要一臺服務(wù)器綽綽有余激捏,此階段網(wǎng)站架構(gòu)如圖:
應(yīng)用程序,數(shù)據(jù)庫凄吏,文件等所有資源都放在一臺服務(wù)器上远舅,通常服務(wù)器視野Linux,應(yīng)用程序使用PHP,然后部署在Apache上痕钢,數(shù)據(jù)庫MySQL.
階段2:應(yīng)用服務(wù)和數(shù)據(jù)庫分離:
隨著網(wǎng)站業(yè)務(wù)的發(fā)展图柏,一臺服務(wù)器逐漸不能滿足需求,越來越多的用戶訪問導致性能越來越差任连,越來越多的數(shù)據(jù)導致存儲空間不足蚤吹,這時候,就需要將應(yīng)用和數(shù)據(jù)分離,此時整個網(wǎng)站使用三臺服務(wù)器:應(yīng)用服務(wù)器裁着,文件服務(wù)器和數(shù)據(jù)庫服務(wù)器繁涂,三臺服務(wù)器對硬件資源要求各不相同:應(yīng)用服務(wù)器需要處理大量的業(yè)務(wù)邏輯,因此需要更快更強大的CPU二驰,數(shù)據(jù)庫服務(wù)器需要快速磁盤檢索和數(shù)據(jù)緩存扔罪,因此需要更快的硬盤和更大的內(nèi)存,文件服務(wù)器需要存儲大量的用戶上傳文件桶雀,因此需要更大的硬盤矿酵。
階段3:使用緩存改善網(wǎng)站性能:
網(wǎng)站使用的緩存可以分為兩種:緩存在應(yīng)用服務(wù)器的本地緩存和緩存在專門的分布式緩存服務(wù)器上的遠程緩存。本地緩存的訪問速度更快一些矗积,但是受應(yīng)用服務(wù)器內(nèi)存限制全肮,緩存數(shù)據(jù)量有限。遠程分布式緩存可以使用集群的方式漠魏,部署大內(nèi)存的服務(wù)器作為專門的緩存服務(wù)器倔矾,可以在理論上做到不受內(nèi)存容量的限制:
階段4:使用應(yīng)用服務(wù)器集群改善網(wǎng)站的并發(fā)處理能力:
當有一臺服務(wù)器的處理能力、存儲空間不足時柱锹,不要企圖去更換更強大的服務(wù)器哪自,對于大型網(wǎng)站而言,不管多么強大的服務(wù)器禁熏,都滿足不了網(wǎng)站持續(xù)增長的業(yè)務(wù)需求壤巷。此時,應(yīng)該考慮增加一臺服務(wù)器分擔原有服務(wù)器的訪問以及存儲壓力:
階段5:數(shù)據(jù)庫讀寫分離:
目前大部分的主流數(shù)據(jù)庫都提供主從熱備功能瞧毙,通過配置兩臺數(shù)據(jù)庫主從關(guān)系胧华,可以將一臺數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)更新同步到另外一臺服務(wù)器上,網(wǎng)站利用這一功能宙彪,實現(xiàn)數(shù)據(jù)庫讀寫分離矩动,從而改善數(shù)據(jù)庫負載壓力:
階段6:使用反向代理和CDN加速網(wǎng)站響應(yīng):
CDN和反向代理的基本原理都是緩存,區(qū)別在于CDN部署在網(wǎng)絡(luò)提供商的機房释漆,用戶在請求時悲没,能從最近的機房獲取到資源;反向代理部署在網(wǎng)站的中心機房男图,當用戶請求到達中心機房后示姿,首先訪問的是機房的反向代理服務(wù)器,如果反向代理服務(wù)器中存儲了用戶請求的資源逊笆,那么優(yōu)先返回該部分資源給用戶栈戳。
階段7:使用分布式文件系統(tǒng)和分布式數(shù)據(jù)庫系統(tǒng):
數(shù)據(jù)庫經(jīng)過讀寫分離后,從一臺服務(wù)器分成兩臺服務(wù)器难裆,但是隨著網(wǎng)站業(yè)務(wù)的發(fā)展子檀,依然不能滿足需求,這是就需要使用分布式數(shù)據(jù)庫,文件系統(tǒng)也是如此:
分布式數(shù)據(jù)庫是網(wǎng)站數(shù)據(jù)庫拆分的最后手段命锄,只有在單表數(shù)據(jù)規(guī)模非常大的時候才使用堰乔。一般情況下,網(wǎng)站更常用的數(shù)據(jù)庫拆分手段是業(yè)務(wù)分庫脐恩,將不同業(yè)務(wù)的數(shù)據(jù)庫部署在不同的服務(wù)器上镐侯。
階段8:使用NoSQL和搜索引擎:
隨著網(wǎng)站業(yè)務(wù)越來越復雜,對數(shù)據(jù)存儲和檢索的需求也越來越復雜驶冒,網(wǎng)站需要采用一些非關(guān)系數(shù)據(jù)庫技術(shù)如NoSQL和非數(shù)據(jù)庫查詢技術(shù)如搜索引擎:
階段9:業(yè)務(wù)拆分:
大型網(wǎng)站為了應(yīng)對日益復雜的業(yè)務(wù)場景苟翻,通過使用分而治之的手段將整個網(wǎng)站業(yè)務(wù)分成不同的產(chǎn)品線,如大型購物網(wǎng)站會將首頁骗污,商鋪崇猫,訂單,買家等拆分成不通的產(chǎn)品線需忿,分歸不通的業(yè)務(wù)團隊負責诅炉。具體到技術(shù)上,也會根據(jù)產(chǎn)品線劃分屋厘,將一個網(wǎng)站拆分成許多不同的應(yīng)用涕烧,每個獨立部署維護。應(yīng)用之間可以通過一個超鏈接建立關(guān)系汗洒,也可以通過消息隊列進行數(shù)據(jù)分發(fā)议纯,當然最多的還是通過訪問同一個數(shù)據(jù)存儲系統(tǒng)來構(gòu)成一個關(guān)聯(lián)的完整系統(tǒng):
階段10:分布式服務(wù):
隨著業(yè)務(wù)拆分越來越小,存儲系統(tǒng)越來越龐大溢谤,應(yīng)用系統(tǒng)的整體復雜程度呈指數(shù)級增加瞻凤,部署維護越來越困難,由于所有的應(yīng)用要和所有的數(shù)據(jù)庫系統(tǒng)連接世杀,在數(shù)萬臺服務(wù)器規(guī)模的網(wǎng)站中阀参,這些連接的數(shù)目是服務(wù)器規(guī)模的平方,導致數(shù)據(jù)庫連接資源不足瞻坝,拒絕服務(wù)结笨。
既然每一個應(yīng)用系統(tǒng)都需要執(zhí)行許多相同的業(yè)務(wù)操作,比如用戶管理湿镀,商品管理等,那么可以將這些共用的業(yè)務(wù)提取出來伐憾,獨立部署勉痴。由這些可復用的業(yè)務(wù)連接數(shù)據(jù)庫,提供共用業(yè)務(wù)服務(wù)树肃,而應(yīng)用系統(tǒng)只需要管理用戶界面蒸矛,通過分布式服務(wù)調(diào)用共用業(yè)務(wù)服務(wù)完成具體業(yè)務(wù)操作。
大型網(wǎng)站的架構(gòu)演化到這里,基本上大多數(shù)的技術(shù)問題都可以得到解決雏掠,諸如跨數(shù)據(jù)中心的實時數(shù)據(jù)同步和具體網(wǎng)站業(yè)務(wù)相關(guān)的問題也可以通過組合改進現(xiàn)有的技術(shù)架構(gòu)來解決斩祭。
3.總結(jié):
這個世界沒有那個網(wǎng)站從誕生起就是大型網(wǎng)站,也沒有哪個網(wǎng)站從發(fā)布起就有龐大的用戶乡话,高并發(fā)的訪問以及海量的用戶摧玫,大型網(wǎng)站都是從小型網(wǎng)站發(fā)展而來的。大型網(wǎng)站架構(gòu)技術(shù)的核心價值不是從無到有建立一個網(wǎng)站绑青,而是能夠伴隨小型網(wǎng)站業(yè)務(wù)的逐步發(fā)展诬像,慢慢演化成一個大型網(wǎng)站,在此過程中闸婴,不需要放棄什么坏挠,不需要推翻什么,不需要劇烈的革命邪乍,就慢慢的把一個有=只有一臺服務(wù)器降狠,幾百個用戶的小網(wǎng)站演化成一個幾十萬臺服務(wù)器,數(shù)十億用戶的大型網(wǎng)站庇楞。