大規(guī)模網(wǎng)站架構(gòu)技術(shù)原理透析
51CTO推薦 視頻專題:大型網(wǎng)站架構(gòu)專家談
跟朋友聊天的時(shí)候,發(fā)現(xiàn)很多人對大型網(wǎng)站系統(tǒng)架構(gòu)非常感興趣,我也很感興趣,經(jīng)常會在家里2臺筆記本和1臺服務(wù)器組成的局域網(wǎng)環(huán)境里作些實(shí)驗(yàn)。我進(jìn)入IT行業(yè)的時(shí)間,大約是97,98年吧,那時(shí)候PC客戶端軟件最為盛行,做軟件開發(fā)是一份很體面也很喜歡的工作。我從Win3.1上的VC1.5開始一直到VC6.0,然后轉(zhuǎn)為.Net開發(fā),基本上都是從事客戶端軟件開發(fā)。本人的性格是危機(jī)意識向來嚴(yán)重,所以深感互聯(lián)網(wǎng)必將盛行,傳統(tǒng)軟件必將走向沒落,于是轉(zhuǎn)向了WEB開發(fā)。記得以前去某Portal網(wǎng)站應(yīng)聘的時(shí)候,主考官就問我:你認(rèn)為客戶端開發(fā)和互聯(lián)網(wǎng)開發(fā)有什么不同。我當(dāng)時(shí)的回答是:互聯(lián)網(wǎng)開發(fā)比客戶端軟件開發(fā)簡單多了,我再也不用考慮那么多的用戶環(huán)境因素了,一點(diǎn)部署,何時(shí)何地都可用。
很多年過去了,我再想起當(dāng)初我的回答,依然覺得那個回答是正確的。就產(chǎn)品開發(fā)層面來講,互聯(lián)網(wǎng)開發(fā)確實(shí)簡單多了。這里首先澄清一個概念,我所說的互聯(lián)網(wǎng)開發(fā)并不是指所有的B/S應(yīng)用,例如B/S方式的銀行內(nèi)部業(yè)務(wù)系統(tǒng)。我所說的互聯(lián)網(wǎng)應(yīng)用是指在互聯(lián)網(wǎng)上服務(wù)于公眾的應(yīng)用。企業(yè)級的業(yè)務(wù)系統(tǒng),它的特點(diǎn)是業(yè)務(wù)邏輯是比較復(fù)雜的,但用戶一般不太大;互聯(lián)網(wǎng)應(yīng)用則相反,業(yè)務(wù)邏輯一般很簡單,但面對的是海量用戶。
既然互聯(lián)網(wǎng)應(yīng)用開發(fā)的業(yè)務(wù)邏輯不復(fù)雜,但為什么大型網(wǎng)站都投入了那么多的技術(shù)人員呢?主要是因?yàn)檫\(yùn)營的環(huán)境太復(fù)雜,這種復(fù)雜性形成的原因以下:
1、公開性
網(wǎng)站的服務(wù)是公開的,任何人都可以來訪問,所以就會直接面對大量的不良用戶,系統(tǒng)數(shù)據(jù)的安全面臨很大的風(fēng)險(xiǎn),一旦系統(tǒng)被攻入,結(jié)果將是災(zāi)難性的。
2、訪問量大
訪問量大,就意味著網(wǎng)站必須能夠承受高并發(fā)大流量的考驗(yàn),如果網(wǎng)站的服務(wù)能力和健壯性等達(dá)不到要求,你的系統(tǒng)就會被沖垮。
3、用戶體驗(yàn)
用戶體驗(yàn)要好,除了產(chǎn)品設(shè)計(jì)的因素之外,就要求訪問網(wǎng)站的速度要快,具有高可用性,別用一會就掛。
網(wǎng)站各子系統(tǒng)如何進(jìn)行部署,如何提高系統(tǒng)的健壯性和高可用性,如何實(shí)現(xiàn)網(wǎng)站的安全,如何提高訪問速度,如何進(jìn)行負(fù)載均衡,甚至于采用什么的硬件設(shè)備,另外,網(wǎng)站發(fā)展的不同時(shí)期會可能會采用不同的架構(gòu),如何實(shí)現(xiàn)架構(gòu)的平滑過渡,如何使目前的架構(gòu)具有彈性,具備可擴(kuò)展的能力,這都是大型網(wǎng)站必須解決的問題,也是小網(wǎng)站成長過程中遲早會遇到的問題。我后面的文章將會逐步就這個話題展開。
網(wǎng)站機(jī)構(gòu)包括網(wǎng)站的軟件架構(gòu)和系統(tǒng)架構(gòu)兩部分,軟件架構(gòu)主要是指子系統(tǒng)和邏輯層的劃分結(jié)構(gòu);系統(tǒng)架構(gòu),一般是系統(tǒng)部署結(jié)構(gòu)。
系統(tǒng)架構(gòu)師的知識體系比較龐雜,所謂的見多識廣,多數(shù)是由運(yùn)維工程師成長起來的,他們開發(fā)能力不強(qiáng),編碼不多,但動手能力很強(qiáng),腳本編寫非常熟練,經(jīng)常會做各種類型的實(shí)驗(yàn),密切跟蹤最新技術(shù)最新產(chǎn)品的相關(guān)信息。當(dāng)然,一個大型的網(wǎng)站,需要一個架構(gòu)師團(tuán)隊(duì),他們各自承擔(dān)擅長領(lǐng)域的架構(gòu)設(shè)計(jì),比如安全架構(gòu)、存儲架構(gòu)等等。
我覺得一般的開發(fā)人員還是很難走上這條路的,這份工作需要經(jīng)驗(yàn),需要不斷實(shí)踐,但如果開發(fā)人員一旦走上了這條路,會有很大的發(fā)展,主要源于開發(fā)人員的思考習(xí)慣和技術(shù)的深度。我的這系列文章,開發(fā)人員可以作為參考,比如如何開發(fā)可分布式部署的系統(tǒng),另外很多朋友都是身兼數(shù)職,從開發(fā)到實(shí)施,到部署全部包辦。我個人深感精力有限,所以又特意找了幾個朋友從Unix/Linux系統(tǒng)和Windows系統(tǒng)不同角度進(jìn)行探索,以造福正在摸索中的朋友,有興趣的朋友也可以參與。
其實(shí),這部分內(nèi)容我一直在寫,比如PHP深度探索系列,寫了大量的關(guān)于apache的內(nèi)容,我已經(jīng)大體把a(bǔ)pache代碼閱讀了一遍,很費(fèi)時(shí)間,進(jìn)度緩慢,但我想這有助于我們理解apache的配置和調(diào)優(yōu)。
在介紹網(wǎng)站架構(gòu)之前,我們先介紹一些網(wǎng)站架構(gòu)中最基礎(chǔ)和常見的概念,以便更好的理解后面的有關(guān)負(fù)載均衡和分布式存儲等技術(shù)。第一個,首先講講CDN。
1、CDN是什么
CDN(Content Delivery Network),就是內(nèi)容發(fā)布網(wǎng)或者內(nèi)容分發(fā)網(wǎng),它的主要目的:通過在現(xiàn)有的Internet中增加一層新的網(wǎng)絡(luò)架構(gòu),將網(wǎng)站的內(nèi)容發(fā)布到最接近用戶的網(wǎng)絡(luò)邊緣,使用戶可以就近取得所需的內(nèi)容,從而提高用戶訪問網(wǎng)站的響應(yīng)速度,提升用戶體驗(yàn),同時(shí)能夠分散訪問壓力,把本來用戶集中訪問分散到各地去。網(wǎng)站的內(nèi)容提供商(比如新浪、搜狐、網(wǎng)易等等)使用CDN,就可以在宏觀層解決一部分大流量、海量用戶并發(fā)等令人頭疼的問題。
2、CDN的組成
內(nèi)容發(fā)布網(wǎng)(CDN)是一個經(jīng)策略性部署的整體系統(tǒng),包括分布式存儲、負(fù)載均衡、網(wǎng)絡(luò)請求的重定向和內(nèi)容管理4個要件,而內(nèi)容管理和全局的網(wǎng)絡(luò)流量管理是CDN的核心所在。通過用戶就近性和服務(wù)器負(fù)載的判斷,CDN確保內(nèi)容以一種極為高效的方式為用戶的請求提供服務(wù),達(dá)到用戶所要求的服務(wù)距用戶僅有"一跳"(Single Hop)之遙。
我們通常的內(nèi)容發(fā)布模式都是將網(wǎng)站數(shù)據(jù)放到一處,然后應(yīng)對來自世界各地的訪問,我們多數(shù)考慮的是軟件部署架構(gòu),很少考慮網(wǎng)絡(luò)硬件架構(gòu)。與之形成對比的是,CDN則強(qiáng)調(diào)了網(wǎng)絡(luò)在內(nèi)容發(fā)布中的重要性。通過引入主動的內(nèi)容管理層的和全局負(fù)載均衡,CDN從根本上區(qū)別于傳統(tǒng)的內(nèi)容發(fā)布模式。
內(nèi)容提供商承擔(dān)了他們不該干也干不好的內(nèi)容發(fā)布服務(wù)。
3、互聯(lián)網(wǎng)服務(wù)的產(chǎn)業(yè)鏈
縱觀整個寬帶服務(wù)的價(jià)值鏈,內(nèi)容提供商和用戶位于整個價(jià)值鏈的兩端,中間依靠網(wǎng)絡(luò)服務(wù)提供商將其串接起來。隨著互聯(lián)網(wǎng)工業(yè)的成熟和商業(yè)模式的變革,在這條價(jià)值鏈上的角色越來越多也越來越細(xì)分,出現(xiàn)了內(nèi)容運(yùn)營商、托管服務(wù)提供商、骨干網(wǎng)絡(luò)服務(wù)提供商、接入服務(wù)提供商等等。在這一條價(jià)值鏈上的每一個角色都要分工合作、各司其職才能為客戶提供良好的服務(wù),從而帶來多贏的局面。從內(nèi)容與網(wǎng)絡(luò)的結(jié)合模式上看,內(nèi)容的發(fā)布已經(jīng)走過了ICP的內(nèi)容(應(yīng)用)服務(wù)器和IDC這兩個階段。IDC的熱潮也催生了托管服務(wù)提供商這一角色。但是,IDC并不能解決內(nèi)容的有效發(fā)布問題。內(nèi)容位于網(wǎng)絡(luò)的中心并不能解決骨干帶寬的占用和建立IP網(wǎng)絡(luò)上的流量秩序。因此將內(nèi)容推到網(wǎng)絡(luò)的邊緣,為用戶提供就近性的邊緣服務(wù),從而保證服務(wù)的質(zhì)量和整個網(wǎng)絡(luò)上的訪問秩序就成了一種顯而易見的選擇,這就是CDN服務(wù)模式。CDN的建立解決了困擾內(nèi)容運(yùn)營商的內(nèi)容"集中與分散"的兩難選擇,無疑對于構(gòu)建良好的互聯(lián)網(wǎng)價(jià)值鏈?zhǔn)怯袃r(jià)值的,也是不可或缺的最優(yōu)網(wǎng)站加速服務(wù)。
4、CDN服務(wù)提供商
ChinaCache是中國最大的CDN服務(wù)提供商,是不是唯一未可知也。要想成為CDN服務(wù)提供商,恐怕要擺平電信、網(wǎng)通、鐵通等等運(yùn)營商,這得需要什么樣的能力和背景不得而知。它的服務(wù)節(jié)點(diǎn)在全球已經(jīng)超過130個,其中國內(nèi)節(jié)點(diǎn)超過80個,覆蓋全國主要6大網(wǎng)絡(luò)(所謂6線機(jī)房,就是這么來的)的主要省份,象各大門戶網(wǎng)站,比如新浪、網(wǎng)易等等都是租用了他們的服務(wù)。所以,你無論是在南方,或者北方,還是在北美,訪問這些門戶網(wǎng)站,感覺速度都很快,最主要的原因之一就是CDN發(fā)揮了效果。一般小網(wǎng)站是用不起這服務(wù)的,所以慢點(diǎn)就慢點(diǎn)了吧,可以租用互聯(lián)互通的6線機(jī)房,如果網(wǎng)絡(luò)足夠?qū)挼脑挘脩粢部梢匀淌?。如果想繼續(xù)提升用戶體驗(yàn)的話,就需要做一些網(wǎng)站鏡像,部署在具有代表性的幾個大城市,比如華南可以部署在廣州,華東可以部署在上海,華北可以部署在北京,不過內(nèi)容鏡像的過程,就需要自己去部署和維護(hù)。還有的網(wǎng)站,采用內(nèi)容分割的方式,比如建立針對各地的分站,業(yè)務(wù)情況不同,可能部署的策略不同。CDN可以認(rèn)為是基礎(chǔ)網(wǎng)絡(luò)建設(shè)的一種策略。
#p#
前面介紹了cdn的一些原理和概念,以及提供cdn基礎(chǔ)網(wǎng)絡(luò)服務(wù)的途徑。cdn看起來對于靜態(tài)內(nèi)容的,比如html,js,image是非常合適的,通過cdn的部署,用戶只需要一跳就可以訪問到網(wǎng)站的內(nèi)容。那對于動態(tài)內(nèi)容怎么辦呢?我回答一下:
動態(tài)內(nèi)容按照存在形態(tài)可以分為三類。
第一類:內(nèi)容長時(shí)間不需變化,這類內(nèi)容一般是通過網(wǎng)頁靜化技術(shù),實(shí)現(xiàn)動態(tài)內(nèi)容轉(zhuǎn)換成靜態(tài)內(nèi)容,從而達(dá)到cdn部署,典型的就是內(nèi)容類網(wǎng)站,比如新浪、搜狐、網(wǎng)易等等的內(nèi)容發(fā)布系統(tǒng)cms,內(nèi)容的增刪改等管理工作被準(zhǔn)實(shí)時(shí)同步到各個節(jié)點(diǎn)。
第二類:內(nèi)容可能會短時(shí)間內(nèi)發(fā)生變動,但是最終會穩(wěn)定。比如論壇、博客等應(yīng)用,這類服務(wù)提供的內(nèi)容按照一定的時(shí)間間隔,實(shí)現(xiàn)批量靜化,當(dāng)然也有實(shí)時(shí)靜化,像Mop的大雜燴、網(wǎng)易社區(qū)就是使用了這樣的策略。
第三類:內(nèi)容會實(shí)時(shí)變化,非常個性化。比如郵箱應(yīng)用,這類服務(wù)提供的內(nèi)容無法實(shí)現(xiàn)靜化,只能通過實(shí)行分區(qū)域部署和負(fù)載均衡等手段進(jìn)行優(yōu)化。
對于提供cdn服務(wù)的廠商來講,靜態(tài)內(nèi)容的cdn自然沒有問題,對于第三類服務(wù),只能從通信鏈路層進(jìn)行相應(yīng)的優(yōu)化。
對于很多網(wǎng)站的偽靜化,有的出于Seo的考慮,有的出于安全性的考慮,手段基本上是rewrite Url。它只不過是一種外在的表現(xiàn)形式,與Html靜化是兩回事,它依然是一種動態(tài)內(nèi)容。
1. 負(fù)載均衡的分類
負(fù)載均衡技術(shù)在網(wǎng)站運(yùn)營過程中應(yīng)用非常普遍,技術(shù)也很成熟。負(fù)載均衡技術(shù)按照軟硬件形式分為軟均衡和硬均衡。軟均衡就是基于軟件技術(shù)的均衡,硬均衡是基于硬件技術(shù)的均衡;
按照網(wǎng)絡(luò)協(xié)議劃分又分為四層均衡和七層均衡。四層均衡就是基于OSI網(wǎng)絡(luò)層的數(shù)據(jù)均衡,七層均衡是基于OSI應(yīng)用層的數(shù)據(jù)均衡。
各種均衡方式在大型網(wǎng)站中均有采用,而且大多數(shù)情況下,是多種均衡方式的組合。
2. DNS輪詢均衡
這種方式,算是比較獨(dú)立的一種方式,不在上述劃分之列,但使用比較廣泛,一般用在網(wǎng)站最前端。你可以做個試驗(yàn),在dos命令行中運(yùn)行nslook命令。比如:nslookup www。163。com,你會看到命令給出了一堆解析后的IP地址。這些地址就是www.163.com這個域名綁定的多條A記錄。我們從瀏覽器發(fā)起的訪問請求http://www.163.com/,那么你輸入的域名首先需要經(jīng)過DNS服務(wù)器進(jìn)行解析,Dns服務(wù)器的解析的過程就是按照A記錄的順序,依次分配IP地址。Dns輪詢方式實(shí)現(xiàn)均衡就是利用這個原理,在一個域名下面綁定N個IP地址,訪問請求被均衡到不同的設(shè)備。Dns輪詢方式提供的IP地址,在大型網(wǎng)站中往往是一個集群的地址,可能是均衡交換機(jī)也可能是均衡服務(wù)器。對于小網(wǎng)站的話,掛接多臺服務(wù)器也沒有問題。
DNS輪詢均衡的優(yōu)點(diǎn):
1、零成本:只是在Dns服務(wù)器上綁定幾個A記錄,域名注冊商一般都提供;
2、部署簡單:就是在網(wǎng)絡(luò)拓?fù)溥M(jìn)行設(shè)備擴(kuò)增,然后在Dns服務(wù)器上添加記錄。
DNS輪詢均衡的缺點(diǎn):
1、流量分配不均:Dns解析過程其實(shí)環(huán)節(jié)很多,而且是一種層層緩存的機(jī)制,你的dns服務(wù)器雖然進(jìn)行更新,但是客戶機(jī)、以及網(wǎng)絡(luò)上其它的dns服務(wù)器不會實(shí)時(shí)更新,所以流量很難保證100%的平均。目前,dns服務(wù)器都提供了多種手段可以調(diào)整dns輪詢分配的策略,但是確實(shí)無法保證很完美的均衡。
2、健康檢查:Dns服務(wù)器中A記錄地址中的某一臺服務(wù)器宕機(jī),DNS服務(wù)器是無法知道的,仍舊會將訪問分配到此服務(wù)器。所以需要人員或者工具進(jìn)行實(shí)時(shí)檢測,在某臺機(jī)器宕機(jī)之后,把備份機(jī)推上生產(chǎn)線,如果想要從A記錄地址摘除某個地址,這個通知過程需要幾個小時(shí)甚至更久才能擴(kuò)散到所有的客戶機(jī)。
Dns輪詢方式推到服務(wù)的最前端還是很有效的,它通過最原始的方式,把訪問用戶映射到不同的服務(wù)集群上。對于大型網(wǎng)站來講,對外服務(wù)的IP地址是不可能經(jīng)常變動的,而且后端的集群一旦宕掉,可以迅速推上冗余集群。再加上,一般都是經(jīng)過CDN部署,服務(wù)被拆分到各個局部,所以在運(yùn)營過程中不會產(chǎn)生太大的影響。
3. OSI七層模型
我們接下來講講七層均衡。要理解四七層均衡的原理,就先要回憶一下大學(xué)課本里學(xué)的網(wǎng)絡(luò)七層模型(OSI)。
OSI是一個開放性的通行系統(tǒng)互連參考模型,他是一個定義的非常好的協(xié)議規(guī)范。OSI模型有7層結(jié)構(gòu),每層都可以有幾個子層。
OSI七層模型是一個很好的理論模型,但是在實(shí)際應(yīng)用中都做了裁剪。尤其是TCP/IP的盛行,把7層結(jié)構(gòu)壓成了4層,
所以很多人都批評OSI七層模型過于復(fù)雜,但是作為一個完整的全面的網(wǎng)絡(luò)模型,還是被大家非常認(rèn)可的。OSI的7層從上到下分別是應(yīng)用層、表示層、會話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層。
OSI 7層的功能描述:
(1)應(yīng)用層:與其他計(jì)算機(jī)進(jìn)行通訊的一個應(yīng)用,它是對應(yīng)應(yīng)用程序的通信服務(wù)的。例如,一個沒有通信功能的字處理程序就不能執(zhí)行通信的代碼,從事字處理工作的程序員也不關(guān)心OSI的第7層。但是,如果添加了一個傳輸文件的選項(xiàng),那么字處理器的程序員就需要實(shí)現(xiàn)OSI的第7層。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。
(2)表示層:這一層的主要功能是定義數(shù)據(jù)格式及加密。例如,F(xiàn)TP允許你選擇以二進(jìn)制或ASII格式傳輸。如果選擇二進(jìn)制,那么發(fā)送方和接收方不改變文件的內(nèi)容。如果選擇ASII格式,發(fā)送方將把文本從發(fā)送方的字符集轉(zhuǎn)換成標(biāo)準(zhǔn)的ASII后發(fā)送數(shù)據(jù)。在接收方將標(biāo)準(zhǔn)的ASII轉(zhuǎn)換成接收方計(jì)算機(jī)的字符集。示例:加密,ASII等。
(3)會話層:他定義了如何開始、控制和結(jié)束一個會話,包括對多個雙向小時(shí)的控制和管理,以便在只完成連續(xù)消息的一部分時(shí)可以通知應(yīng)用,從而使表示層看到的數(shù)據(jù)是連續(xù)的,在某些情況下,如果表示層收到了所有的數(shù)據(jù),則用數(shù)據(jù)代表表示層。示例:RPC,SQL等。
(4)傳輸層:這層的功能包括是否選擇差錯恢復(fù)協(xié)議還是無差錯恢復(fù)協(xié)議,及在同一主機(jī)上對不同應(yīng)用的數(shù)據(jù)流的輸入進(jìn)行復(fù)用,還包括對收到的順序不對的數(shù)據(jù)包的重新排序功能。示例:TCP,UDP,SPX。
(5)網(wǎng)絡(luò)層:這層對端到端的包傳輸進(jìn)行定義,他定義了能夠標(biāo)識所有結(jié)點(diǎn)的邏輯地址,還定義了路由實(shí)現(xiàn)的方式和學(xué)習(xí)的方式。為了適應(yīng)最大傳輸單元長度小于包長度的傳輸介質(zhì),網(wǎng)絡(luò)層還定義了如何將一個包分解成更小的包的分段方法。示例:IP,IPX等。
(6)數(shù)據(jù)鏈路層:他定義了在單個鏈路上如何傳輸數(shù)據(jù)。這些協(xié)議與被討論的歌種介質(zhì)有關(guān)。示例:ATM,F(xiàn)DDI等。
(7)物理層:OSI的物理層規(guī)范是有關(guān)傳輸介質(zhì)的特性標(biāo)準(zhǔn),這些規(guī)范通常也參考了其他組織制定的標(biāo)準(zhǔn)。連接頭、針、針的使用、電流、電流、編碼及光調(diào)制等都屬于各種物理層規(guī)范中的內(nèi)容。物理層常用多個規(guī)范完成對所有細(xì)節(jié)的定義。
【編輯推薦】