主流互聯網架構

基礎知識點:php

Squid:css

Squid cache(簡稱爲Squid)是一個流行的自由軟件,它符合GNU通用公共許可證。Squid做爲網頁服務器的前置cache服務器,能夠代理用戶向web服務器請求數據並進行緩存,也能夠用在局域網中,使局域網用戶經過代理上網。Squid主要設計用於在Linux一類系統運行。html

 

Memcached :前端

Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升動態、數據庫驅動網站的速度。Memcached基於一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,可是客戶端能夠用任何語言來編寫,並經過memcached協議與守護進程通訊。java

ESI 動態緩存技術:python

任何一個Web網站的內容都是在不斷更新和變化,但這並不意味這這個網站的內容就是動態內容,事實上,動態的內容是指用戶每次點擊 相同的連接時取的的內容是由Web服務器應用程序生成的,如常見得ASP,JSP等,與此相對應,靜態內容通常就是指由文本、圖像和多媒體組成,在用戶每 次單擊相應連接時基本保持不變。如今解決動態內容緩存的最新技術就是經過ESI技術來設計網站的內容。
    ESI技術工做原理
    動態生成的內容能爲用戶帶來豐富精彩的頁面,網站開發者也能夠更容易和更靈活地控制相關的內容,但在享受這些便利的同時,也增長了 網站數據庫和應用服務器的處理壓力的。當網站的訪問量增大後,硬件和數據庫的投資是很是巨大的,即便如此,仍然有可能致使頁面的嚴重延遲甚至訪問失敗。
    用戶訪問動態生成的內容速度慢的根本緣由在於動態生成的內容須要通過一個複雜的過程,首先,根據用戶請求的不一樣將用戶的請求分配 到應用服務器相應的軟件模塊中,軟件模塊必須經過運算決定須要從數據庫中提取什麼樣的數據給用戶,而後再從數據庫中提取出相應的數據按照定義的格式傳給用 戶。這些冗長的過程致使用戶訪問速度變慢,同時增長了服務器的負載。
    在實際環境中,一個動態生成的頁面,當中可能只有少許的內容是頻繁變化的或是個性化的,對於傳統的Cache服務器來講,爲了能 夠保證頁面的時效性,卻因爲頁面中這些少許的動態內容而沒法將整個頁面進行緩存。ESI(Edge Side Include)經過使用簡單的標記語言來對那些能夠加速和不能加速的網頁中的內容片段進行描述,每一個網頁都被劃分紅不一樣的小部分分別賦予不一樣的緩存控制 策略,使Cache服務器能夠根據這些策略在將完整的網頁發送給用戶以前將不一樣的小部分動態地組合在一塊兒。經過這種控制,能夠有效地減小從服務器抓取整個 頁面的次數,而只用從原服務器中提取少許的不能緩存的片段,所以能夠有效下降原服務器的負載,同時提升用戶訪問的響應時間。
    ESI是一種簡單的標識語言,開發人員可使用它標誌內容片段以便經過相應的Cache服務器來加速緩存。同時ESI還定義了一 套內容效驗標準,能夠實現原服務器對Cache服務器中緩存內容的管理,提升了網站對內容的控制能力。CDN網絡也能夠利用在分佈全國各地的節點中安裝支 持ESI的Cache服務器來提供對網站動態內容提供CDN服務
 
****************************************************************************************************************************
 

第一步:物理分離webserver和數據庫

剛開始咱們的網站可能搭建在一臺服務器上,這個時候因爲網站具有了必定的特點,吸引了部分人訪問,逐漸你發現系統的壓力愈來愈高,響應速度愈來愈慢,而這個時候比較明顯的是數據庫和應用互相影響,應用出問題了,數據庫也很容易出現問題,而數據庫出問題的時候,應用也容易出問題,因而進入了第一步演變階段:將應用和數據庫從物理上分離,變成了兩臺機器,這個時候技術上沒有什麼新的要求,但你發現確實起到效果了,系統又恢復到之前的響應速度了,而且支撐住了更高的流量,而且不會由於數據庫和應用造成互相的影響。mysql

clip_image005

圖3.1jquery

3.2第二步:增長頁面緩存

好景不長,隨着訪問的人愈來愈多,你發現響應速度又開始變慢了,查找緣由,發現是訪問數據庫的操做太多,致使數據鏈接競爭激烈,因此響應變慢,但數據庫鏈接又不能開太多,不然數據庫機器壓力會很高,所以考慮採用緩存機制來減小數據庫鏈接資源的競爭和對數據庫讀的壓力,這個時候首先也許會選擇採用squid等相似的機制來將系統中相對靜態的頁面(例如一兩天才會有更新的頁面)進行緩存(固然,也能夠採用將頁面靜態化的方案),這樣程序上能夠不作修改,就可以很好的減小對webserver的壓力以及減小數據庫鏈接資源的競爭,OK,因而開始採用squid來作相對靜態的頁面的緩存。linux

clip_image007

圖3.2nginx

3.3第三步:增長頁面片斷緩存

增長了squid作緩存後,總體系統的速度確實是提高了,webserver的壓力也開始降低了,但隨着訪問量的增長,發現系統又開始變的有些慢了,在嚐到了squid之類的動態緩存帶來的好處後,開始想能不能讓如今那些動態頁面裏相對靜態的部分也緩存起來呢,所以考慮採用相似ESI之類的頁面片斷緩存策略,OK,因而開始採用ESI來作動態頁面中相對靜態的片斷部分的緩存。

clip_image009

圖3.3

3.4第四步:數據緩存

在採用ESI之類的技術再次提升了系統的緩存效果後,系統的壓力確實進一步下降了,但一樣,隨着訪問量的增長,系統仍是開始變慢,通過查找,可能會發現系統中存在一些重複獲取數據信息的地方,像獲取用戶信息等,這個時候開始考慮是否是能夠將這些數據信息也緩存起來呢,因而將這些數據緩存到本地內存,改變完畢後,徹底符合預期,系統的響應速度又恢復了,數據庫的壓力也再度下降了很多。可使用的技術有:memcached。

clip_image011

圖3.4

3.5第五步:增長webserver

好景不長,發現隨着系統訪問量的再度增長,webserver機器的壓力在高峯期會上升到比較高,這個時候開始考慮增長一臺webserver,這也是爲了同時解決可用性的問題,避免單臺的webserver down機的話就無法使用了,在作了這些考慮後,決定增長一臺webserver,增長一臺webserver時,會碰到一些問題,典型的有:

一、如何讓訪問分配到這兩臺機器上,這個時候一般會考慮的方案是Apache自帶的負載均衡方案,或LVS這類的軟件負載均衡方案;

二、如何保持狀態信息的同步,例如用戶session等,這個時候會考慮的方案有寫入數據庫、寫入存儲、cookie或同步session信息等機制等;

三、如何保持數據緩存信息的同步,例如以前緩存的用戶數據等,這個時候一般會考慮的機制有緩存同步或分佈式緩存;

四、如何讓上傳文件這些相似的功能繼續正常,這個時候一般會考慮的機制是使用共享文件系統或存儲等;

在解決了這些問題後,終因而把webserver增長爲了兩臺,系統終因而又恢復到了以往的速度。

clip_image013

圖3.5

3.6第六步:分庫

享受了一段時間的系統訪問量高速增加的幸福後,發現系統又開始變慢了,此次又是什麼情況呢,通過查找,發現數據庫寫入、更新的這些操做的部分數據庫鏈接的資源競爭很是激烈,致使了系統變慢,這下怎麼辦呢,此時可選的方案有數據庫集羣和分庫策略,集羣方面像有些數據庫支持的並非很好,所以分庫會成爲比較廣泛的策略,分庫也就意味着要對原有程序進行修改,一通修改實現分庫後,不錯,目標達到了,系統恢復甚至速度比之前還快了。

clip_image015

圖3.6

3.7第七步:分表、DAL和分佈式緩存

隨着系統的不斷運行,數據量開始大幅度增加,這個時候發現分庫後查詢仍然會有些慢,因而按照分庫的思想開始作分表的工做,固然,這不可避免的會須要對程序進行一些修改,也許在這個時候就會發現應用本身要關心分庫分表的規則等,仍是有些複雜的,因而萌生可否增長一個通用的框架來實現分庫分表的數據訪問,這個在ebay的架構中對應的就是DAL,這個演變的過程相對而言須要花費較長的時間,固然,也有可能這個通用的框架會等到分表作完後纔開始作,同時,在這個階段可能會發現以前的緩存同步方案出現問題,由於數據量太大,致使如今不太可能將緩存存在本地,而後同步的方式,須要採用分佈式緩存方案了,因而,又是一通考察和折磨,終因而將大量的數據緩存轉移到分佈式緩存上了。

clip_image017

圖3.7

3.8第八步:增長更多的webserver

在作完分庫分表這些工做後,數據庫上的壓力已經降到比較低了,又開始過着天天看着訪問量暴增的幸福生活了,忽然有一天,發現系統的訪問又開始有變慢的趨勢了,這個時候首先查看數據庫,壓力一切正常,以後查看webserver,發現apache阻塞了不少的請求,而應用服務器對每一個請求也是比較快的,看來是請求數過高致使須要排隊等待,響應速度變慢,這還好辦,通常來講,這個時候也會有些錢了,因而添加一些webserver服務器,在這個添加webserver服務器的過程,有可能會出現幾種挑戰:

一、Apache的軟負載或LVS軟負載等沒法承擔巨大的web訪問量(請求鏈接數、網絡流量等)的調度了,這個時候若是經費容許的話,會採起的方案是購買硬件負載,例如F五、Netsclar、Athelon之類的,如經費不容許的話,會採起的方案是將應用從邏輯上作必定的分類,而後分散到不一樣的軟負載集羣中;

二、原有的一些狀態信息同步、文件共享等方案可能會出現瓶頸,須要進行改進,也許這個時候會根據狀況編寫符合網站業務需求的分佈式文件系統等;

在作完這些工做後,開始進入一個看似完美的無限伸縮的時代,當網站流量增長時,應對的解決方案就是不斷的添加webserver。

clip_image019

圖3.8

3.9第九步:數據讀寫分離和廉價存儲方案

忽然有一天,發現這個完美的時代也要結束了,數據庫的噩夢又一次出如今眼前了,因爲添加的webserver太多了,致使數據庫鏈接的資源仍是不夠用,而這個時候又已經分庫分表了,開始分析數據庫的壓力情況,可能會發現數據庫的讀寫比很高,這個時候一般會想到數據讀寫分離的方案,固然,這個方案要實現並不容易,另外,可能會發現一些數據存儲在數據庫上有些浪費,或者說過於佔用數據庫資源,所以在這個階段可能會造成的架構演變是實現數據讀寫分離,同時編寫一些更爲廉價的存儲方案,例如BigTable這種。

clip_image021

圖3.9

3.10第十步:進入大型分佈式應用時代和廉價服務器羣夢想時代

通過上面這個漫長而痛苦的過程,終因而再度迎來了完美的時代,不斷的增長webserver就能夠支撐愈來愈高的訪問量了,對於大型網站而言,人氣的重要毋庸置疑,隨着人氣的愈來愈高,各類各樣的功能需求也開始爆發性的增加,這個時候忽然發現,原來部署在webserver上的那個web應用已經很是龐大了,當多個團隊都開始對其進行改動時,可真是至關的不方便,複用性也至關糟糕,基本是每一個團隊都作了或多或少重複的事情,並且部署和維護也是至關的麻煩,由於龐大的應用包在N臺機器上覆制、啓動都須要耗費很多的時間,出問題的時候也不是很好查,另一個更糟糕的情況是頗有可能會出現某個應用上的bug就致使了全站都不可用,還有其餘的像調優很差操做(由於機器上部署的應用什麼都要作,根本就沒法進行鍼對性的調優)等因素,根據這樣的分析,開始痛下決心,將系統根據職責進行拆分,因而一個大型的分佈式應用就誕生了,一般,這個步驟須要耗費至關長的時間,由於會碰到不少的挑戰:

一、拆成分佈式後須要提供一個高性能、穩定的通訊框架,而且須要支持多種不一樣的通訊和遠程調用方式;

二、將一個龐大的應用拆分須要耗費很長的時間,須要進行業務的整理和系統依賴關係的控制等;

三、如何運維(依賴管理、運行情況管理、錯誤追蹤、調優、監控和報警等)好這個龐大的分佈式應用。

通過這一步,差很少系統的架構進入相對穩定的階段,同時也能開始採用大量的廉價機器來支撐着巨大的訪問量和數據量,結合這套架構以及這麼屢次演變過程吸收的經驗來採用其餘各類各樣的方法來支撐着愈來愈高的訪問量。

clip_image023

圖3.10

4.分析

隨着平臺作大作強,極可能會走向定製操做系統,定製數據庫,甚至定製硬件,定製任何能夠定製的東西這樣一條路。

在服務器、架構、組件等技術選擇方面,主要有兩個方向:1選擇成熟商用。2選擇開源+自主研發。下面就這兩個方向逐一進行簡單分析。

1商用的優缺點

l 商用的優勢之一是成熟,穩定,搭建快速。

l 商用的缺點之一是費用高,隨着服務器的增長,license的費用上升,成本偏高。

l 商用的產品是通用化的,缺少定製性,不能知足個性須要。

2開源+自主研發的優缺點

l 源碼開放,可控性好,出現問題,能夠從底層解決,擴展性好。

l 短時間時間、人力投入大,初期見效慢;長期產出大,見效明顯。

l 能夠在軟件和硬件的多個層面不斷優化,充分知足個性化須要。

商用和開源+自主研發各有優缺點,各有互補性,要根據使用場景的不一樣來進行選擇,也能夠根據須要配合使用。

5.總結

目前大型網站的主流是LAMP(linux+apache+mysql+php),或者是在這基礎之上的擴展,例如增長緩存,增長中間件(中間件大多使用java,c,c++或者.NET編寫,或者購買成熟的中間件產品,IBM就有不少成熟的中間件產品);又或者替換其中的某些部分,例如前端使用python,ruby,lua這些新近流行的腳本語言,數據存儲部分使用nosql或者文件系統。這樣的選擇有歷史緣由、費用緣由、業務緣由,也有在網站發展以後須要知足新的需求而衍生出來解決特定問題的緣由。

也有初期使用微軟系(windows+.NET+MSSQL)來構建網站的,在後面又根據須要加入其餘體系的的電商,例如:京東,噹噹,凡客等。也有始終採用微軟系的網站,國外的微軟官網stackoverflow,還有曾經輝煌的myspace

其實,如今的發展趨勢是:混合體系,而非單一的體系。就是說技術體系不是單一的,也不是固定一成不變的,而是根據業務以及網站的發展,以及技術的發展,選擇合適的技術解決適當的問題。

架構的變動不是一件小事,對業務和網站的發展都很重要,不可能幾天或者一半個月就變動一下,也不可能有事沒事變動一下,應該是在關鍵的時候,有須要的時候,或者根據計劃按期升級。

我以爲有一種方式能夠幫助咱們進行選擇。就是根據咱們的目標,或者說預估的業務量,預估的成交量,預估的用戶量,劃分幾個平臺發展里程碑,或者是時間段。而後根據平臺發展的里程碑來規劃技術選型的里程碑。考慮規模的同時,還須要考慮業務的類型,產生的數據的類型,對這些數據的處理需求等因素。

能夠先定幾個里程碑,這個里程碑的時間,能夠根據前面的業務預估來裁定。先根據第一個里程碑要知足的業務需求,來選擇當前的技術架構,而且進行存儲空間規劃。而後針對第一個到第二個里程碑的過分,進行預留設計,保證未來的平穩過渡。或者只是預留擴展的餘地,這方面有時候有點難度,不過應該儘可能作。

在第二個里程碑以前的1-2個月進行第二個里程碑技術架構的討論和設計,由於這時候相比原有的第二個里程碑的業務估計可能會有變更,或者技術上有了新的選擇,均可以及時考慮到本次的設計中來。以此類推後面的里程碑技術架構變動。

還有就是突發狀況,由於總會有一些意料以外的狀況發生,有的是業務發展的須要,有的是被動的須要。針對這些突發狀況,也會進行架構的升級。

 

****************************************************************************************************************************

 

clip_image003

             較爲完整的系統架構圖

2.系統使用的主要技術

下列排名不分前後

2.1前端

JavaScript,html,css,silverlight,flash

Jquery

Javascript類庫,用來簡化html的操做,事件處理,動畫,異步訪問,用於web的快速開發。最新版本是1.7.1,分爲開發環境(大小爲229k)和生產環境(大小爲31k)。特色是輕量,體積小;css兼容1-3;跨瀏覽器。凡客,噹噹,亞馬遜。

若是從框架角度分級的話,能夠有如下分類:

  • 零級,完成base工做,包括擴展原有對象的方法,Ajax通信部分,比較精簡
  • 一級,完成effect工做,包括增長經常使用效果轉換函數,如tween、drag、maskLayer、fade等的特效
  • 二級,完成component工做,包括對話框、列表、樹、日曆等的組件
  • 三級,完成application工做,包括完整的前端平臺,容許用戶定義能實現必定功能的模塊

一些UI控件和開發框架只作零級Prototype.js,和一級jQuery/Mootools;一些作到了三級,如Dojo和EXT。

Kissky

小巧靈活,簡潔實用,使用起來讓人感受愉悅。淘寶,騰訊。

2.2後端

Php,Perl,asp,ruby,python,.net,java,jsp(java server page)

靜態語言:java, .net

動態語言(腳本語言):php, asp, jsp, perl, python, ruby

Php是老牌的腳本語言,儘管出現了不少的新語言,可是php仍是大多數網站的首選,聽說全世界70%的網站都使用php。LAMP(linux+apache+mysql+php)是經典組合。

ASP是Active Server Page的縮寫,意爲「動態服務器頁面」。ASP是微軟公司開發的代替CGI腳本程序的一種應用,它能夠與數據庫和其它程序進行交互,是一種簡單、方便的編程工具。ASP的網頁文件的格式是。經常使用於各類動態網站中。

JSP(Java Server Pages)是由Sun Microsystems公司倡導、許多公司參與一塊兒創建的一種動態網頁技術標準。JSP技術有點相似ASP技術,它是在傳統的網頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而造成JSP文件(*.jsp)。 用JSP開發的Web應用是跨平臺的,既能在Linux下運行,也能在其餘操做系統上運行。

Pythonruby是近幾年崛起的開源語言,特色是容易上手,能快速完成原型。同時也是較爲成熟腳本語言。Python是豆瓣的主要語言,google,youtube等網站也都在使用。

http://www.python.org/about/quotes/

Twitter的前端主要使用ruby,motorola和NASA也都使用了ruby。

http://www.ruby-lang.org/en/documentation/success-stories

2.3緩存

Squid cache

開源。

Squid服務器羣,把它做爲web服務器端的前置cache服務器,緩存相關請求來提升web服務器速度。Squid將大部分靜態資源(圖片,js,css等)緩存起來,也能夠緩存頻繁訪問的網頁,直接返回給訪問者,減小應用服務器的負載。

memcached

開源。

WikipediaFlickrTwitterYoutube

memcached服務器羣,一款分佈式緩存產品,不少大型網站在應用; 它能夠應對任意多個鏈接,使用非阻塞的網絡IO。因爲它的工做機制是在內存中開闢一塊空間,而後創建一個HashTable,Memcached自管理這些HashTable。由於一般網站應用程序中最耗費時間的任務是數據在數據庫的檢索,而多個用戶查詢相同的SQL時,數據庫壓力會增大,而經過memcached的查詢緩存命中,數據直接從memcached內存中取,每次緩存命中將替換到數據庫服務器的一次往返,到達數據庫服務器的請求更少,間接地提升了數據庫服務器的性能,從而使應用程序運行得更快。它經過基於內存緩存對象來減小數據庫查詢的方式改善網站系統的反應,其最吸引人的一個特性就是支持分佈式部署。

2.4中間件

Java,.net,c,c++

2.5存儲

2.5.1關係數據庫

Oracle,mysql,mssql,postgreSQL

postgreSQL

關係數據庫,擁有15年的歷史。免費,開源。能夠運行在linux、unix和windows上,支持事物、主外鍵、鏈接、視圖、觸發器、存儲過程。包含大量的數據類型,也支持大對象。支持多種語言,c,c++,java,c#,perl,python,ruby等等。

2.5.2 NoSQL存儲

MongoDB,Redis,CouchDB,Cassandra,HBase

NoSQL(not only sql),不只僅是SQL。用來彌補關係數據庫在某些方面的不足。例如:

l 高併發讀寫。每秒上萬次的讀寫,關係數據庫有點吃力。

l 海量數據的高效存儲和訪問。例如:對一張表有2億數據的表進行讀寫,效率較爲低下。

l 高擴展性。對於數據庫的升級和擴展,增長節點,每每須要停機和數據遷移。

有一些地方不須要關係數據庫,例如:

l 事務一致性。某些場合不須要事務,對於數據的一致性也沒有嚴格要求。

l 讀寫實時性。有些場合不須要實時的讀寫。

http://baike.baidu.com/view/2677528.htm

Mongodb

文檔型nosql,支持主從複製。有不少的大公司使用。支持多種編程語言。

http://www.mongodb.org/display/DOCS/Production+Deployments

Disney,SAP,淘寶(監控數據),sourceforge,大衆點評(用戶行爲分析,用戶、組)。

Redis

鍵值型nosql,vmware贊助,支持多種編程語言。Twitter,淘寶,新浪微博都有使用。

Couchdbcassandrahbase

都是apache旗下的項目。

2.5.3文件系統

商用中間件,自定義文件系統

2.6操做系統

Windows,linux,unix

2.7 Web應用服務器軟件

IIS,apache,tomcat,jboss,weblogic(BEA,商用,收費),websphere(IBM,商用,收費),lighttpd,nginx

IIS

微軟windows操做系統專用。

Lighttpd

lighttpd,是一個德國人領導的開源軟件,其根本的目的是提供一個專門針對高性能網站,安全、快速、兼容性好。lighttpd而且靈活的web server環境。具備很是低的內存開銷,cpu佔用率低,效能好,以及豐富的模塊等特色。lighttpd是衆多OpenSource輕量級的web server中較爲優秀的一個。支持FastCGI, CGI, Auth, 輸出壓縮(output compress), URL重寫, Alias等重要功能,

Nginx

開源

Nginx+php(FastCGI)+Memcached+Mysql+APC 是目前主流的高性能服務器搭建方式!適合大中型網站,小型站長也能夠採用這種組合!

Nginx 超越 Apache 的高性能和穩定性,使得國內使用 Nginx 做爲 Web 服務器的網站也愈來愈多,其中包括國內最大的電子地圖MapBar、新浪博客、新浪播客、網易新聞等門戶網站頻道,六間房、56.com等視頻分享網 站,Discuz!官方論壇、水木社區等知名論壇,豆瓣、YUPOO相冊、海內SNS、迅雷在線等新興Web 2.0網站,更多的網站都在使用Nginx配置。

2.8 框架

Javascript:Jqueryprototype.jsKisskyextjs

.NET:企業庫unityNHibernateSprint.NETibatisMVCMEFPrismlog4net23個開源項目lucene.NET

Java:hibernatespringstrutseasyjflog4j開源項目lucene

Python:djangoflaskbottletornadouliwebweb.py

Ruby:rails

PHP:PEA

相關文章
相關標籤/搜索