天天看點

轉:大規模網站架構技術原理透析

來自:http://tech.it168.com/a2009/0904/674/000000674253.shtml

跟朋友聊天的時候,發現很多人對大型網站系統架構非常感興趣,我也很感興趣,經常會在家裡2台筆記本和1台伺服器組成的區域網路環境裡作些實驗。我進入IT行業的時間,大約是97,98年吧,那時候PC用戶端軟體最為盛行,做軟體開發是一份很體面也很喜歡的工作。我從Win3.1上的VC1.5開始一直到VC6.0,然後轉為.Net開發,基本上都是從事用戶端軟體開發。本人的性格是危機意識向來嚴重,是以深感網際網路必将盛行,傳統軟體必将走向沒落,于是轉向了WEB開發。記得以前去某Portal網站應聘的時候,主考官就問我:你認為用戶端開發和網際網路開發有什麼不同。我當時的回答是:網際網路開發比用戶端軟體開發簡單多了,我再也不用考慮那麼多的使用者環境因素了,一點部署,何時何地都可用。

    很多年過去了,我再想起當初我的回答,依然覺得那個回答是正确的。就産品開發層面來講,網際網路開發确實簡單多了。這裡首先澄清一個概念,我所說的網際網路開發并不是指所有的B/S應用,例如B/S方式的銀行内部業務系統。我所說的網際網路應用是指在網際網路上服務于公衆的應用。企業級的業務系統,它的特點是業務邏輯是比較複雜的,但使用者一般不太大;網際網路應用則相反,業務邏輯一般很簡單,但面對的是海量使用者。

    既然網際網路應用開發的業務邏輯不複雜,但為什麼大型網站都投入了那麼多的技術人員呢?主要是因為營運的環境太複雜,這種複雜性形成的原因以下:

    1、公開性

    網站的服務是公開的,任何人都可以來通路,是以就會直接面對大量的不良使用者,系統資料的安全面臨很大的風險,一旦系統被攻入,結果将是災難性的。

    2、通路量大

    通路量大,就意味着網站必須能夠承受高并發大流量的考驗,如果網站的服務能力和健壯性等達不到要求,你的系統就會被沖垮。

    3、使用者體驗

    使用者體驗要好,除了産品設計的因素之外,就要求通路網站的速度要快,具有高可用性,别用一會就挂。

    網站各子系統如何進行部署,如何提高系統的健壯性和高可用性,如何實作網站的安全,如何提高通路速度,如何進行負載均衡,甚至于采用什麼的硬體裝置,另外,網站發展的不同時期會可能會采用不同的架構,如何實作架構的平滑過渡,如何使目前的架構具有彈性,具備可擴充的能力,這都是大型網站必須解決的問題,也是小網站成長過程中遲早會遇到的問題。我後面的文章将會逐漸就這個話題展開。

    網站機構包括網站的軟體架構和系統架構兩部分,軟體架構主要是指子系統和邏輯層的劃分結構;系統架構,一般是系統部署結構。

    系統架構師的知識體系比較龐雜,所謂的見多識廣,多數是由運維工程師成長起來的,他們開發能力不強,編碼不多,但動手能力很強,腳本編寫非常熟練,經常會做各種類型的實驗,密切跟蹤最新技術最新産品的相關資訊。當然,一個大型的網站,需要一個架構師團隊,他們各自承擔擅長領域的架構設計,比如安全架構、存儲架構等等。

    我覺得一般的開發人員還是很難走上這條路的,這份工作需要經驗,需要不斷實踐,但如果開發人員一旦走上了這條路,會有很大的發展,主要源于開發人員的思考習慣和技術的深度。我的這系列文章,開發人員可以作為參考,比如如何開發可分布式部署的系統,另外很多朋友都是身兼數職,從開發到實施,到部署全部包辦。我個人深感精力有限,是以又特意找了幾個朋友從Unix/Linux系統和Windows系統不同角度進行探索,以造福正在摸索中的朋友,有興趣的朋友也可以參與。

    其實,這部分内容我一直在寫,比如PHP深度探索系列,寫了大量的關于apache的内容,我已經大體把apache代碼閱讀了一遍,很費時間,進度緩慢,但我想這有助于我們了解apache的配置和調優。

 在介紹網站架構之前,我們先介紹一些網站架構中最基礎和常見的概念,以便更好的了解後面的有關 負載均衡和分布式 存儲等技術。第一個,首先講講CDN。

    1、CDN是什麼

    CDN(Content Delivery Network),就是内容釋出網或者内容分發網,它的主要目的:通過在現有的Internet中增加一層新的網絡架構,将網站的内容釋出到最接近使用者的網絡邊緣,使使用者可以就近取得所需的内容,進而提高使用者通路網站的響應速度,提升使用者體驗,同時能夠分散通路壓力,把本來使用者集中通路分散到各地去。網站的内容提供商(比如新浪、搜狐、網易等等)使用CDN,就可以在宏觀層解決一部分大流量、海量使用者并發等令人頭疼的問題。

    2、CDN的組成

    内容釋出網(CDN)是一個經政策性部署的整體系統,包括分布式存儲、負載均衡、網絡請求的重定向和内容管理4個要件,而内容管理和全局的網絡流量管理是CDN的核心所在。通過使用者就近性和伺服器負載的判斷,CDN確定内容以一種極為高效的方式為使用者的請求提供服務,達到使用者所要求的服務距使用者僅有"一跳"(Single Hop)之遙。

    我們通常的内容釋出模式都是将網站資料放到一處,然後應對來自世界各地的通路,我們多數考慮的是軟體部署架構,很少考慮網絡硬體架構。與之形成對比的是,CDN則強調了網絡在内容釋出中的重要性。通過引入主動的内容管理層的和全局負載均衡,CDN從根本上差別于傳統的内容釋出模式。

    内容提供商承擔了他們不該幹也幹不好的内容釋出服務。

    3、網際網路服務的産業鍊

    縱觀整個寬帶服務的價值鍊,内容提供商和使用者位于整個價值鍊的兩端,中間依靠網絡服務提供商将其串接起來。随着網際網路工業的成熟和商業模式的變革,在這條價值鍊上的角色越來越多也越來越細分,出現了内容營運商、托管服務提供商、骨幹網絡服務提供商、接入服務提供商等等。在這一條價值鍊上的每一個角色都要分工合作、各司其職才能為客戶提供良好的服務,進而帶來多赢的局面。從内容與網絡的結合模式上看,内容的釋出已經走過了ICP的内容(應用)伺服器和IDC這兩個階段。IDC的熱潮也催生了托管服務提供商這一角色。但是,IDC并不能解決内容的有效釋出問題。内容位于網絡的中心并不能解決骨幹帶寬的占用和建立IP網絡上的流量秩序。是以将内容推到網絡的邊緣,為使用者提供就近性的邊緣服務,進而保證服務的品質和整個網絡上的通路秩序就成了一種顯而易見的選擇,這就是CDN服務模式。CDN的建立解決了困擾内容營運商的内容"集中與分散"的兩難選擇,無疑對于建構良好的網際網路價值鍊是有價值的,也是不可或缺的最優網站加速服務。

    4、CDN服務提供商

    ChinaCache是中國最大的CDN服務提供商,是不是唯一未可知也。要想成為CDN服務提供商,恐怕要擺平電信、網通、鐵通等等營運商,這得需要什麼樣的能力和背景不得而知。它的服務節點在全球已經超過130個,其中國内節點超過80個,覆寫全國主要6大網絡(所謂6線機房,就是這麼來的)的主要省份,象各大門戶網站,比如新浪、網易等等都是租用了他們的服務。是以,你無論是在南方,或者北方,還是在北美,通路這些門戶網站,感覺速度都很快,最主要的原因之一就是CDN發揮了效果。一般小網站是用不起這服務的,是以慢點就慢點了吧,可以租用互聯互通的6線機房,如果網絡足夠寬的話,使用者也可以忍受。如果想繼續提升使用者體驗的話,就需要做一些網站鏡像,部署在具有代表性的幾個大城市,比如華南可以部署在廣州,華東可以部署在上海,華北可以部署在北京,不過内容鏡像的過程,就需要自己去部署和維護。還有的網站,采用内容分割的方式,比如建立針對各地的分站,業務情況不同,可能部署的政策不同。CDN可以認為是基礎網絡建設的一種政策。

前面介紹了cdn的一些原理和概念,以及提供cdn基礎網絡服務的途徑。cdn看起來對于靜态内容的,比如html,js,image是非常合适的,通過cdn的部署,使用者隻需要一跳就可以通路到網站的内容。那對于動态内容怎麼辦呢?我回答一下:

    動态内容按照存在形态可以分為三類。

    第一類:内容長時間不需變化,這類内容一般是通過網頁靜化技術,實作動态内容轉換成靜态内容,進而達到cdn部署,典型的就是内容類網站,比如新浪、搜狐、網易等等的内容釋出系統cms,内容的增删改等管理工作被準實時同步到各個節點。

    第二類:内容可能會短時間内發生變動,但是最終會穩定。比如論壇、部落格等應用,這類服務提供的内容按照一定的時間間隔,實作批量靜化,當然也有實時靜化,像Mop的大雜燴、網易社群就是使用了這樣的政策。

    第三類:内容會實時變化,非常個性化。比如郵箱應用,這類服務提供的内容無法實作靜化,隻能通過實行分區域部署和負載均衡等手段進行優化。

    對于提供cdn服務的廠商來講,靜态内容的cdn自然沒有問題,對于第三類服務,隻能從通信鍊路層進行相應的優化。

    對于很多網站的僞靜化,有的出于Seo的考慮,有的出于安全性的考慮,手段基本上是rewrite Url。它隻不過是一種外在的表現形式,與Html靜化是兩回事,它依然是一種動态内容。

    1. 負載均衡的分類

    負載均衡技術在網站營運過程中應用非常普遍,技術也很成熟。負載均衡技術按照軟硬體形式分為軟均衡和硬均衡。軟均衡就是基于軟體技術的均衡,硬均衡是基于硬體技術的均衡;

    按照網絡協定劃分又分為四層均衡和七層均衡。四層均衡就是基于OSI網絡層的資料均衡,七層均衡是基于OSI應用層的資料均衡。

    各種均衡方式在大型網站中均有采用,而且大多數情況下,是多種均衡方式的組合。

    2. DNS輪詢均衡

    這種方式,算是比較獨立的一種方式,不在上述劃分之列,但使用比較廣泛,一般用在網站最前端。你可以做個試驗,在dos指令行中運作nslook指令。比如:nslookup www。163。com,你會看到指令給出了一堆解析後的IP位址。這些位址就是www.163.com這個域名綁定的多條A記錄。我們從浏覽器發起的通路請求http://www.163.com/,那麼你輸入的域名首先需要經過DNS伺服器進行解析,Dns伺服器的解析的過程就是按照A記錄的順序,依次配置設定IP位址。Dns輪詢方式實作均衡就是利用這個原理,在一個域名下面綁定N個IP位址,通路請求被均衡到不同的裝置。Dns輪詢方式提供的IP位址,在大型網站中往往是一個叢集的位址,可能是均衡交換機也可能是均衡伺服器。對于小網站的話,挂接多台伺服器也沒有問題。

    DNS輪詢均衡的優點:

    1、零成本:隻是在Dns伺服器上綁定幾個A記錄,域名注冊商一般都提供;

    2、部署簡單:就是在網絡拓撲進行裝置擴增,然後在Dns伺服器上添加記錄。

    DNS輪詢均衡的缺點:

    1、流量配置設定不均:Dns解析過程其實環節很多,而且是一種層層緩存的機制,你的dns伺服器雖然進行更新,但是客戶機、以及網絡上其它的dns伺服器不會實時更新,是以流量很難保證100%的平均。目前,dns伺服器都提供了多種手段可以調整dns輪詢配置設定的政策,但是确實無法保證很完美的均衡。

    2、健康檢查:Dns伺服器中A記錄位址中的某一台伺服器當機,DNS伺服器是無法知道的,仍舊會将通路配置設定到此伺服器。是以需要人員或者工具進行實時檢測,在某台機器當機之後,把備份機推上生産線,如果想要從A記錄位址摘除某個位址,這個通知過程需要幾個小時甚至更久才能擴散到所有的客戶機。

    Dns輪詢方式推到服務的最前端還是很有效的,它通過最原始的方式,把通路使用者映射到不同的服務叢集上。對于大型網站來講,對外服務的IP位址是不可能經常變動的,而且後端的叢集一旦宕掉,可以迅速推上備援叢集。再加上,一般都是經過CDN部署,服務被拆分到各個局部,是以在營運過程中不會産生太大的影響。

 3. OSI七層模型

    我們接下來講講七層均衡。要了解四七層均衡的原理,就先要回憶一下大學課本裡學的網絡七層模型(OSI)。

    OSI是一個開放性的通行系統互連參考模型,他是一個定義的非常好的協定規範。OSI模型有7層結構,每層都可以有幾個子層。

    OSI七層模型是一個很好的理論模型,但是在實際應用中都做了裁剪。尤其是TCP/IP的盛行,把7層結構壓成了4層,

    是以很多人都批評OSI七層模型過于複雜,但是作為一個完整的全面的網絡模型,還是被大家非常認可的。OSI的7層從上到下分别是應用層、表示層、會話層、傳輸層、網絡層、資料鍊路層、實體層。

    OSI 7層的功能描述:

    (1)應用層:與其他計算機進行通訊的一個應用,它是對應應用程式的通信服務的。例如,一個沒有通信功能的字處理程式就不能執行通信的代碼,從事字處理工作的程式員也不關心OSI的第7層。但是,如果添加了一個傳輸檔案的選項,那麼字處理器的程式員就需要實作OSI的第7層。示例:telnet,HTTP,FTP,WWW,NFS,SMTP等。

    (2)表示層:這一層的主要功能是定義資料格式及加密。例如,FTP允許你選擇以二進制或ASII格式傳輸。如果選擇二進制,那麼發送方和接收方不改變檔案的内容。如果選擇ASII格式,發送方将把文本從發送方的字元集轉換成标準的ASII後發送資料。在接收方将标準的ASII轉換成接收方計算機的字元集。示例:加密,ASII等。

    (3)會話層:他定義了如何開始、控制和結束一個會話,包括對多個雙向小時的控制和管理,以便在隻完成連續消息的一部分時可以通知應用,進而使表示層看到的資料是連續的,在某些情況下,如果表示層收到了所有的資料,則用資料代表表示層。示例:RPC,SQL等。

    (4)傳輸層:這層的功能包括是否選擇差錯恢複協定還是無差錯恢複協定,及在同一主機上對不同應用的資料流的輸入進行複用,還包括對收到的順序不對的資料包的重新排序功能。示例:TCP,UDP,SPX。

    (5)網絡層:這層對端到端的包傳輸進行定義,他定義了能夠辨別所有結點的邏輯位址,還定義了路由實作的方式和學習的方式。為了适應最大傳輸單元長度小于包長度的傳輸媒體,網絡層還定義了如何将一個包分解成更小的包的分段方法。示例:IP,IPX等。

    (6)資料鍊路層:他定義了在單個鍊路上如何傳輸資料。這些協定與被讨論的歌種媒體有關。示例:ATM,FDDI等。

    (7)實體層:OSI的實體層規範是有關傳輸媒體的特性标準,這些規範通常也參考了其他組織制定的标準。連接配接頭、針、針的使用、電流、電流、編碼及光調制等都屬于各種實體層規範中的内容。實體層常用多個規範完成對所有細節的定義。