主流互联网架构
主流互聯(lián)網(wǎng)架構(gòu)
基礎(chǔ)知識點:
Squid:
Squid cache(簡稱為Squid)是一個流行的自由軟件,它符合GNU通用公共許可證。Squid作為網(wǎng)頁服務(wù)器的前置cache服務(wù)器,可以代理用戶向web服務(wù)器請求數(shù)據(jù)并進行緩存,也可以用在局域網(wǎng)中,使局域網(wǎng)用戶通過代理上網(wǎng)。Squid主要設(shè)計用于在Linux一類系統(tǒng)運行。
?
Memcached :
Memcached 是一個高性能的分布式內(nèi)存對象緩存系統(tǒng),用于動態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫負載。它通過在內(nèi)存中緩存數(shù)據(jù)和對象來減少讀取數(shù)據(jù)庫的次數(shù),從而提高動態(tài)、數(shù)據(jù)庫驅(qū)動網(wǎng)站的速度。Memcached基于一個存儲鍵/值對的hashmap。其守護進程(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,并通過memcached協(xié)議與守護進程通信。
ESI 動態(tài)緩存技術(shù):
任何一個Web網(wǎng)站的內(nèi)容都是在不斷更新和變化,但這并不意味這這個網(wǎng)站的內(nèi)容就是動態(tài)內(nèi)容,事實上,動態(tài)的內(nèi)容是指用戶每次點擊 相同的鏈接時取的的內(nèi)容是由Web服務(wù)器應(yīng)用程序生成的,如常見得ASP,JSP等,與此相對應(yīng),靜態(tài)內(nèi)容一般就是指由文本、圖像和多媒體組成,在用戶每 次單擊相應(yīng)鏈接時基本保持不變。現(xiàn)在解決動態(tài)內(nèi)容緩存的最新技術(shù)就是通過ESI技術(shù)來設(shè)計網(wǎng)站的內(nèi)容。 ESI技術(shù)工作原理 動態(tài)生成的內(nèi)容能為用戶帶來豐富精彩的頁面,網(wǎng)站開發(fā)者也可以更容易和更靈活地控制相關(guān)的內(nèi)容,但在享受這些便利的同時,也增加了 網(wǎng)站數(shù)據(jù)庫和應(yīng)用服務(wù)器的處理壓力的。當網(wǎng)站的訪問量增大后,硬件和數(shù)據(jù)庫的投資是非常巨大的,即使如此,仍然有可能導(dǎo)致頁面的嚴重延遲甚至訪問失敗。 用戶訪問動態(tài)生成的內(nèi)容速度慢的根本原因在于動態(tài)生成的內(nèi)容需要經(jīng)過一個復(fù)雜的過程,首先,根據(jù)用戶請求的不同將用戶的請求分配 到應(yīng)用服務(wù)器相應(yīng)的軟件模塊中,軟件模塊必須通過運算決定需要從數(shù)據(jù)庫中提取什么樣的數(shù)據(jù)給用戶,然后再從數(shù)據(jù)庫中提取出相應(yīng)的數(shù)據(jù)按照定義的格式傳給用 戶。這些冗長的過程導(dǎo)致用戶訪問速度變慢,同時增加了服務(wù)器的負載。 在實際環(huán)境中,一個動態(tài)生成的頁面,當中可能只有少量的內(nèi)容是頻繁變化的或是個性化的,對于傳統(tǒng)的Cache服務(wù)器來說,為了能 夠保證頁面的時效性,卻由于頁面中這些少量的動態(tài)內(nèi)容而無法將整個頁面進行緩存。ESI(Edge Side Include)通過使用簡單的標記語言來對那些可以加速和不能加速的網(wǎng)頁中的內(nèi)容片斷進行描述,每個網(wǎng)頁都被劃分成不同的小部分分別賦予不同的緩存控制 策略,使Cache服務(wù)器可以根據(jù)這些策略在將完整的網(wǎng)頁發(fā)送給用戶之前將不同的小部分動態(tài)地組合在一起。通過這種控制,可以有效地減少從服務(wù)器抓取整個 頁面的次數(shù),而只用從原服務(wù)器中提取少量的不能緩存的片斷,因此可以有效降低原服務(wù)器的負載,同時提高用戶訪問的響應(yīng)時間。 ESI是一種簡單的標識語言,開發(fā)人員可以使用它標志內(nèi)容片斷以便通過相應(yīng)的Cache服務(wù)器來加速緩存。同時ESI還定義了一 套內(nèi)容效驗標準,可以實現(xiàn)原服務(wù)器對Cache服務(wù)器中緩存內(nèi)容的管理,提高了網(wǎng)站對內(nèi)容的控制能力。CDN網(wǎng)絡(luò)也可以利用在分布全國各地的節(jié)點中安裝支 持ESI的Cache服務(wù)器來提供對網(wǎng)站動態(tài)內(nèi)容提供CDN服務(wù) ****************************************************************************************************************************第一步:物理分離webserver和數(shù)據(jù)庫
剛開始我們的網(wǎng)站可能搭建在一臺服務(wù)器上,這個時候由于網(wǎng)站具備了一定的特色,吸引了部分人訪問,逐漸你發(fā)現(xiàn)系統(tǒng)的壓力越來越高,響應(yīng)速度越來越慢,而這個時候比較明顯的是數(shù)據(jù)庫和應(yīng)用互相影響,應(yīng)用出問題了,數(shù)據(jù)庫也很容易出現(xiàn)問題,而數(shù)據(jù)庫出問題的時候,應(yīng)用也容易出問題,于是進入了第一步演變階段:將應(yīng)用和數(shù)據(jù)庫從物理上分離,變成了兩臺機器,這個時候技術(shù)上沒有什么新的要求,但你發(fā)現(xiàn)確實起到效果了,系統(tǒng)又恢復(fù)到以前的響應(yīng)速度了,并且支撐住了更高的流量,并且不會因為數(shù)據(jù)庫和應(yīng)用形成互相的影響。
圖3.1
3.2第二步:增加頁面緩存
好景不長,隨著訪問的人越來越多,你發(fā)現(xiàn)響應(yīng)速度又開始變慢了,查找原因,發(fā)現(xiàn)是訪問數(shù)據(jù)庫的操作太多,導(dǎo)致數(shù)據(jù)連接競爭激烈,所以響應(yīng)變慢,但數(shù)據(jù)庫連接又不能開太多,否則數(shù)據(jù)庫機器壓力會很高,因此考慮采用緩存機制來減少數(shù)據(jù)庫連接資源的競爭和對數(shù)據(jù)庫讀的壓力,這個時候首先也許會選擇采用squid等類似的機制來將系統(tǒng)中相對靜態(tài)的頁面(例如一兩天才會有更新的頁面)進行緩存(當然,也可以采用將頁面靜態(tài)化的方案),這樣程序上可以不做修改,就能夠很好的減少對webserver的壓力以及減少數(shù)據(jù)庫連接資源的競爭,OK,于是開始采用squid來做相對靜態(tài)的頁面的緩存。
圖3.2
3.3第三步:增加頁面片段緩存
增加了squid做緩存后,整體系統(tǒng)的速度確實是提升了,webserver的壓力也開始下降了,但隨著訪問量的增加,發(fā)現(xiàn)系統(tǒng)又開始變的有些慢了,在嘗到了squid之類的動態(tài)緩存帶來的好處后,開始想能不能讓現(xiàn)在那些動態(tài)頁面里相對靜態(tài)的部分也緩存起來呢,因此考慮采用類似ESI之類的頁面片段緩存策略,OK,于是開始采用ESI來做動態(tài)頁面中相對靜態(tài)的片段部分的緩存。
圖3.3
3.4第四步:數(shù)據(jù)緩存
在采用ESI之類的技術(shù)再次提高了系統(tǒng)的緩存效果后,系統(tǒng)的壓力確實進一步降低了,但同樣,隨著訪問量的增加,系統(tǒng)還是開始變慢,經(jīng)過查找,可能會發(fā)現(xiàn)系統(tǒng)中存在一些重復(fù)獲取數(shù)據(jù)信息的地方,像獲取用戶信息等,這個時候開始考慮是不是可以將這些數(shù)據(jù)信息也緩存起來呢,于是將這些數(shù)據(jù)緩存到本地內(nèi)存,改變完畢后,完全符合預(yù)期,系統(tǒng)的響應(yīng)速度又恢復(fù)了,數(shù)據(jù)庫的壓力也再度降低了不少。可以使用的技術(shù)有:memcached。
圖3.4
3.5第五步:增加webserver
好景不長,發(fā)現(xiàn)隨著系統(tǒng)訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一臺webserver,這也是為了同時解決可用性的問題,避免單臺的webserver down機的話就沒法使用了,在做了這些考慮后,決定增加一臺webserver,增加一臺webserver時,會碰到一些問題,典型的有:
1、如何讓訪問分配到這兩臺機器上,這個時候通常會考慮的方案是Apache自帶的負載均衡方案,或LVS這類的軟件負載均衡方案;
2、如何保持狀態(tài)信息的同步,例如用戶session等,這個時候會考慮的方案有寫入數(shù)據(jù)庫、寫入存儲、cookie或同步session信息等機制等;
3、如何保持數(shù)據(jù)緩存信息的同步,例如之前緩存的用戶數(shù)據(jù)等,這個時候通常會考慮的機制有緩存同步或分布式緩存;
4、如何讓上傳文件這些類似的功能繼續(xù)正常,這個時候通常會考慮的機制是使用共享文件系統(tǒng)或存儲等;
在解決了這些問題后,終于是把webserver增加為了兩臺,系統(tǒng)終于是又恢復(fù)到了以往的速度。
圖3.5
3.6第六步:分庫
享受了一段時間的系統(tǒng)訪問量高速增長的幸福后,發(fā)現(xiàn)系統(tǒng)又開始變慢了,這次又是什么狀況呢,經(jīng)過查找,發(fā)現(xiàn)數(shù)據(jù)庫寫入、更新的這些操作的部分數(shù)據(jù)庫連接的資源競爭非常激烈,導(dǎo)致了系統(tǒng)變慢,這下怎么辦呢,此時可選的方案有數(shù)據(jù)庫集群和分庫策略,集群方面像有些數(shù)據(jù)庫支持的并不是很好,因此分庫會成為比較普遍的策略,分庫也就意味著要對原有程序進行修改,一通修改實現(xiàn)分庫后,不錯,目標達到了,系統(tǒng)恢復(fù)甚至速度比以前還快了。
圖3.6
3.7第七步:分表、DAL和分布式緩存
隨著系統(tǒng)的不斷運行,數(shù)據(jù)量開始大幅度增長,這個時候發(fā)現(xiàn)分庫后查詢?nèi)匀粫行┞?#xff0c;于是按照分庫的思想開始做分表的工作,當然,這不可避免的會需要對程序進行一些修改,也許在這個時候就會發(fā)現(xiàn)應(yīng)用自己要關(guān)心分庫分表的規(guī)則等,還是有些復(fù)雜的,于是萌生能否增加一個通用的框架來實現(xiàn)分庫分表的數(shù)據(jù)訪問,這個在ebay的架構(gòu)中對應(yīng)的就是DAL,這個演變的過程相對而言需要花費較長的時間,當然,也有可能這個通用的框架會等到分表做完后才開始做,同時,在這個階段可能會發(fā)現(xiàn)之前的緩存同步方案出現(xiàn)問題,因為數(shù)據(jù)量太大,導(dǎo)致現(xiàn)在不太可能將緩存存在本地,然后同步的方式,需要采用分布式緩存方案了,于是,又是一通考察和折磨,終于是將大量的數(shù)據(jù)緩存轉(zhuǎn)移到分布式緩存上了。
圖3.7
3.8第八步:增加更多的webserver
在做完分庫分表這些工作后,數(shù)據(jù)庫上的壓力已經(jīng)降到比較低了,又開始過著每天看著訪問量暴增的幸福生活了,突然有一天,發(fā)現(xiàn)系統(tǒng)的訪問又開始有變慢的趨勢了,這個時候首先查看數(shù)據(jù)庫,壓力一切正常,之后查看webserver,發(fā)現(xiàn)apache阻塞了很多的請求,而應(yīng)用服務(wù)器對每個請求也是比較快的,看來是請求數(shù)太高導(dǎo)致需要排隊等待,響應(yīng)速度變慢,這還好辦,一般來說,這個時候也會有些錢了,于是添加一些webserver服務(wù)器,在這個添加webserver服務(wù)器的過程,有可能會出現(xiàn)幾種挑戰(zhàn):
1、Apache的軟負載或LVS軟負載等無法承擔巨大的web訪問量(請求連接數(shù)、網(wǎng)絡(luò)流量等)的調(diào)度了,這個時候如果經(jīng)費允許的話,會采取的方案是購買硬件負載,例如F5、Netsclar、Athelon之類的,如經(jīng)費不允許的話,會采取的方案是將應(yīng)用從邏輯上做一定的分類,然后分散到不同的軟負載集群中;
2、原有的一些狀態(tài)信息同步、文件共享等方案可能會出現(xiàn)瓶頸,需要進行改進,也許這個時候會根據(jù)情況編寫符合網(wǎng)站業(yè)務(wù)需求的分布式文件系統(tǒng)等;
在做完這些工作后,開始進入一個看似完美的無限伸縮的時代,當網(wǎng)站流量增加時,應(yīng)對的解決方案就是不斷的添加webserver。
圖3.8
3.9第九步:數(shù)據(jù)讀寫分離和廉價存儲方案
突然有一天,發(fā)現(xiàn)這個完美的時代也要結(jié)束了,數(shù)據(jù)庫的噩夢又一次出現(xiàn)在眼前了,由于添加的webserver太多了,導(dǎo)致數(shù)據(jù)庫連接的資源還是不夠用,而這個時候又已經(jīng)分庫分表了,開始分析數(shù)據(jù)庫的壓力狀況,可能會發(fā)現(xiàn)數(shù)據(jù)庫的讀寫比很高,這個時候通常會想到數(shù)據(jù)讀寫分離的方案,當然,這個方案要實現(xiàn)并不容易,另外,可能會發(fā)現(xiàn)一些數(shù)據(jù)存儲在數(shù)據(jù)庫上有些浪費,或者說過于占用數(shù)據(jù)庫資源,因此在這個階段可能會形成的架構(gòu)演變是實現(xiàn)數(shù)據(jù)讀寫分離,同時編寫一些更為廉價的存儲方案,例如BigTable這種。
圖3.9
3.10第十步:進入大型分布式應(yīng)用時代和廉價服務(wù)器群夢想時代
經(jīng)過上面這個漫長而痛苦的過程,終于是再度迎來了完美的時代,不斷的增加webserver就可以支撐越來越高的訪問量了,對于大型網(wǎng)站而言,人氣的重要毋庸置疑,隨著人氣的越來越高,各種各樣的功能需求也開始爆發(fā)性的增長,這個時候突然發(fā)現(xiàn),原來部署在webserver上的那個web應(yīng)用已經(jīng)非常龐大了,當多個團隊都開始對其進行改動時,可真是相當?shù)牟环奖?#xff0c;復(fù)用性也相當糟糕,基本是每個團隊都做了或多或少重復(fù)的事情,而且部署和維護也是相當?shù)穆闊?#xff0c;因為龐大的應(yīng)用包在N臺機器上復(fù)制、啟動都需要耗費不少的時間,出問題的時候也不是很好查,另外一個更糟糕的狀況是很有可能會出現(xiàn)某個應(yīng)用上的bug就導(dǎo)致了全站都不可用,還有其他的像調(diào)優(yōu)不好操作(因為機器上部署的應(yīng)用什么都要做,根本就無法進行針對性的調(diào)優(yōu))等因素,根據(jù)這樣的分析,開始痛下決心,將系統(tǒng)根據(jù)職責進行拆分,于是一個大型的分布式應(yīng)用就誕生了,通常,這個步驟需要耗費相當長的時間,因為會碰到很多的挑戰(zhàn):
1、拆成分布式后需要提供一個高性能、穩(wěn)定的通信框架,并且需要支持多種不同的通信和遠程調(diào)用方式;
2、將一個龐大的應(yīng)用拆分需要耗費很長的時間,需要進行業(yè)務(wù)的整理和系統(tǒng)依賴關(guān)系的控制等;
3、如何運維(依賴管理、運行狀況管理、錯誤追蹤、調(diào)優(yōu)、監(jiān)控和報警等)好這個龐大的分布式應(yīng)用。
經(jīng)過這一步,差不多系統(tǒng)的架構(gòu)進入相對穩(wěn)定的階段,同時也能開始采用大量的廉價機器來支撐著巨大的訪問量和數(shù)據(jù)量,結(jié)合這套架構(gòu)以及這么多次演變過程吸取的經(jīng)驗來采用其他各種各樣的方法來支撐著越來越高的訪問量。
圖3.10
4.分析
隨著平臺做大做強,很可能會走向定制操作系統(tǒng),定制數(shù)據(jù)庫,甚至定制硬件,定制任何可以定制的東西這樣一條路。
在服務(wù)器、架構(gòu)、組件等技術(shù)選擇方面,主要有兩個方向:1選擇成熟商用。2選擇開源+自主研發(fā)。下面就這兩個方向逐一進行簡單分析。
1商用的優(yōu)缺點
l 商用的優(yōu)點之一是成熟,穩(wěn)定,搭建快速。
l 商用的缺點之一是費用高,隨著服務(wù)器的增加,license的費用上升,成本偏高。
l 商用的產(chǎn)品是通用化的,缺乏定制性,不能滿足個性需要。
2開源+自主研發(fā)的優(yōu)缺點
l 源碼開放,可控性好,出現(xiàn)問題,可以從底層解決,擴展性好。
l 短期時間、人力投入大,初期見效慢;長期產(chǎn)出大,見效明顯。
l 可以在軟件和硬件的多個層面不斷優(yōu)化,充分滿足個性化需要。
商用和開源+自主研發(fā)各有優(yōu)缺點,各有互補性,要根據(jù)使用場景的不同來進行選擇,也可以根據(jù)需要配合使用。
5.總結(jié)
目前大型網(wǎng)站的主流是LAMP(linux+apache+mysql+php),或者是在這基礎(chǔ)之上的擴展,例如增加緩存,增加中間件(中間件大多使用java,c,c++或者.NET編寫,或者購買成熟的中間件產(chǎn)品,IBM就有很多成熟的中間件產(chǎn)品);又或者替換其中的某些部分,例如前端使用python,ruby,lua這些新近流行的腳本語言,數(shù)據(jù)存儲部分使用nosql或者文件系統(tǒng)。這樣的選擇有歷史原因、費用原因、業(yè)務(wù)原因,也有在網(wǎng)站發(fā)展之后需要滿足新的需求而衍生出來解決特定問題的原因。
也有初期使用微軟系(windows+.NET+MSSQL)來構(gòu)建網(wǎng)站的,在后面又根據(jù)需要加入其他體系的的電商,例如:京東,當當,凡客等。也有始終采用微軟系的網(wǎng)站,國外的微軟官網(wǎng),stackoverflow,還有曾經(jīng)輝煌的myspace。
其實,現(xiàn)在的發(fā)展趨勢是:混合體系,而非單一的體系。就是說技術(shù)體系不是單一的,也不是固定一成不變的,而是根據(jù)業(yè)務(wù)以及網(wǎng)站的發(fā)展,以及技術(shù)的發(fā)展,選擇合適的技術(shù)解決適當?shù)膯栴}。
架構(gòu)的變更不是一件小事,對業(yè)務(wù)和網(wǎng)站的發(fā)展都很重要,不可能幾天或者一半個月就變更一下,也不可能有事沒事變更一下,應(yīng)該是在關(guān)鍵的時候,有需要的時候,或者根據(jù)計劃定期升級。
我覺得有一種方式可以幫助我們進行選擇。就是根據(jù)我們的目標,或者說預(yù)估的業(yè)務(wù)量,預(yù)估的成交量,預(yù)估的用戶量,劃分幾個平臺發(fā)展里程碑,或者是時間段。然后根據(jù)平臺發(fā)展的里程碑來規(guī)劃技術(shù)選型的里程碑。考慮規(guī)模的同時,還需要考慮業(yè)務(wù)的類型,產(chǎn)生的數(shù)據(jù)的類型,對這些數(shù)據(jù)的處理需求等因素。
可以先定幾個里程碑,這個里程碑的時間,可以根據(jù)前面的業(yè)務(wù)預(yù)估來裁定。先根據(jù)第一個里程碑要滿足的業(yè)務(wù)需求,來選擇當前的技術(shù)架構(gòu),并且進行存儲空間規(guī)劃。然后針對第一個到第二個里程碑的過度,進行預(yù)留設(shè)計,保證將來的平穩(wěn)過渡。或者只是預(yù)留擴展的余地,這方面有時候有點難度,不過應(yīng)該盡量做。
在第二個里程碑之前的1-2個月進行第二個里程碑技術(shù)架構(gòu)的討論和設(shè)計,因為這時候相比原有的第二個里程碑的業(yè)務(wù)估計可能會有變動,或者技術(shù)上有了新的選擇,都可以及時考慮到本次的設(shè)計中來。以此類推后面的里程碑技術(shù)架構(gòu)變更。
還有就是突發(fā)情況,因為總會有一些意料之外的情況發(fā)生,有的是業(yè)務(wù)發(fā)展的需要,有的是被動的需要。針對這些突發(fā)情況,也會進行架構(gòu)的升級。
?
****************************************************************************************************************************
?
? ? ? ? ? ? ?較為完整的系統(tǒng)架構(gòu)圖
2.系統(tǒng)使用的主要技術(shù)
下列排名不分先后
2.1前端
JavaScript,html,css,silverlight,flash
Jquery
Javascript類庫,用來簡化html的操作,事件處理,動畫,異步訪問,用于web的快速開發(fā)。最新版本是1.7.1,分為開發(fā)環(huán)境(大小為229k)和生產(chǎn)環(huán)境(大小為31k)。特點是輕量,體積小;css兼容1-3;跨瀏覽器。凡客,當當,亞馬遜。
如果從框架角度分級的話,可以有以下分類:
- 零級,完成base工作,包括擴展原有對象的方法,Ajax通訊部分,比較精簡
- 一級,完成effect工作,包括增加常用效果轉(zhuǎn)換函數(shù),如tween、drag、maskLayer、fade等的特效
- 二級,完成component工作,包括對話框、列表、樹、日歷等的組件
- 三級,完成application工作,包括完整的前端平臺,允許用戶定義能實現(xiàn)一定功能的模塊
一些UI控件和開發(fā)框架只做零級Prototype.js,和一級jQuery/Mootools;一些做到了三級,如Dojo和EXT。
Kissky
小巧靈活,簡潔實用,使用起來讓人感覺愉悅。淘寶,騰訊。
2.2后端
Php,Perl,asp,ruby,python,.net,java,jsp(java server page)
靜態(tài)語言:java, .net
動態(tài)語言(腳本語言):php, asp, jsp, perl, python, ruby
Php是老牌的腳本語言,盡管出現(xiàn)了很多的新語言,但是php還是大多數(shù)網(wǎng)站的首選,據(jù)說全世界70%的網(wǎng)站都使用php。LAMP(linux+apache+mysql+php)是經(jīng)典組合。
ASP是Active Server Page的縮寫,意為“動態(tài)服務(wù)器頁面”。ASP是微軟公司開發(fā)的代替CGI腳本程序的一種應(yīng)用,它可以與數(shù)據(jù)庫和其它程序進行交互,是一種簡單、方便的編程工具。ASP的網(wǎng)頁文件的格式是。常用于各種動態(tài)網(wǎng)站中。
JSP(Java Server Pages)是由Sun Microsystems公司倡導(dǎo)、許多公司參與一起建立的一種動態(tài)網(wǎng)頁技術(shù)標準。JSP技術(shù)有點類似ASP技術(shù),它是在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件(*.jsp)。 用JSP開發(fā)的Web應(yīng)用是跨平臺的,既能在Linux下運行,也能在其他操作系統(tǒng)上運行。
Python和ruby是近幾年崛起的開源語言,特點是容易上手,能快速完成原型。同時也是較為成熟腳本語言。Python是豆瓣的主要語言,google,youtube等網(wǎng)站也都在使用。
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服務(wù)器群,把它作為web服務(wù)器端的前置cache服務(wù)器,緩存相關(guān)請求來提高web服務(wù)器速度。Squid將大部分靜態(tài)資源(圖片,js,css等)緩存起來,也可以緩存頻繁訪問的網(wǎng)頁,直接返回給訪問者,減少應(yīng)用服務(wù)器的負載。
?memcached
開源。
Wikipedia,Flickr,Twitter,Youtube
memcached服務(wù)器群,一款分布式緩存產(chǎn)品,很多大型網(wǎng)站在應(yīng)用; 它可以應(yīng)對任意多個連接,使用非阻塞的網(wǎng)絡(luò)IO。由于它的工作機制是在內(nèi)存中開辟一塊空間,然后建立一個HashTable,Memcached自管理這些HashTable。因為通常網(wǎng)站應(yīng)用程序中最耗費時間的任務(wù)是數(shù)據(jù)在數(shù)據(jù)庫的檢索,而多個用戶查詢相同的SQL時,數(shù)據(jù)庫壓力會增大,而通過memcached的查詢緩存命中,數(shù)據(jù)直接從memcached內(nèi)存中取,每次緩存命中將替換到數(shù)據(jù)庫服務(wù)器的一次往返,到達數(shù)據(jù)庫服務(wù)器的請求更少,間接地提高了數(shù)據(jù)庫服務(wù)器的性能,從而使應(yīng)用程序運行得更快。它通過基于內(nèi)存緩存對象來減少數(shù)據(jù)庫查詢的方式改善網(wǎng)站系統(tǒng)的反應(yīng),其最吸引人的一個特性就是支持分布式部署。
2.4中間件
Java,.net,c,c++
2.5存儲
2.5.1關(guān)系數(shù)據(jù)庫
Oracle,mysql,mssql,postgreSQL
postgreSQL
關(guān)系數(shù)據(jù)庫,擁有15年的歷史。免費,開源。可以運行在linux、unix和windows上,支持事物、主外鍵、連接、視圖、觸發(fā)器、存儲過程。包含大量的數(shù)據(jù)類型,也支持大對象。支持多種語言,c,c++,java,c#,perl,python,ruby等等。
2.5.2 NoSQL存儲
MongoDB,Redis,CouchDB,Cassandra,HBase
NoSQL(not only sql),不僅僅是SQL。用來彌補關(guān)系數(shù)據(jù)庫在某些方面的不足。例如:
l 高并發(fā)讀寫。每秒上萬次的讀寫,關(guān)系數(shù)據(jù)庫有點吃力。
l 海量數(shù)據(jù)的高效存儲和訪問。例如:對一張表有2億數(shù)據(jù)的表進行讀寫,效率較為低下。
l 高擴展性。對于數(shù)據(jù)庫的升級和擴展,增加節(jié)點,往往需要停機和數(shù)據(jù)遷移。
有一些地方不需要關(guān)系數(shù)據(jù)庫,例如:
l 事務(wù)一致性。某些場合不需要事務(wù),對于數(shù)據(jù)的一致性也沒有嚴格要求。
l 讀寫實時性。有些場合不需要實時的讀寫。
http://baike.baidu.com/view/2677528.htm
Mongodb
文檔型nosql,支持主從復(fù)制。有很多的大公司使用。支持多種編程語言。
http://www.mongodb.org/display/DOCS/Production+Deployments
Disney,SAP,淘寶(監(jiān)控數(shù)據(jù)),sourceforge,大眾點評(用戶行為分析,用戶、組)。
Redis
鍵值型nosql,vmware贊助,支持多種編程語言。Twitter,淘寶,新浪微博都有使用。
Couchdb,cassandra,hbase
都是apache旗下的項目。
2.5.3文件系統(tǒng)
商用中間件,自定義文件系統(tǒng)
2.6操作系統(tǒng)
Windows,linux,unix
2.7 Web應(yīng)用服務(wù)器軟件
IIS,apache,tomcat,jboss,weblogic(BEA,商用,收費),websphere(IBM,商用,收費),lighttpd,nginx
IIS
微軟windows操作系統(tǒng)專用。
Lighttpd
lighttpd,是一個德國人領(lǐng)導(dǎo)的開源軟件,其根本的目的是提供一個專門針對高性能網(wǎng)站,安全、快速、兼容性好。lighttpd并且靈活的web server環(huán)境。具有非常低的內(nèi)存開銷,cpu占用率低,效能好,以及豐富的模塊等特點。lighttpd是眾多OpenSource輕量級的web server中較為優(yōu)秀的一個。支持FastCGI, CGI, Auth, 輸出壓縮(output compress), URL重寫, Alias等重要功能,
Nginx
開源
Nginx+php(FastCGI)+Memcached+Mysql+APC 是目前主流的高性能服務(wù)器搭建方式!適合大中型網(wǎng)站,小型站長也可以采用這種組合!
Nginx 超越 Apache 的高性能和穩(wěn)定性,使得國內(nèi)使用 Nginx 作為 Web 服務(wù)器的網(wǎng)站也越來越多,其中包括國內(nèi)最大的電子地圖MapBar、新浪博客、新浪播客、網(wǎng)易新聞等門戶網(wǎng)站頻道,六間房、56.com等視頻分享網(wǎng) 站,Discuz!官方論壇、水木社區(qū)等知名論壇,豆瓣、YUPOO相冊、海內(nèi)SNS、迅雷在線等新興Web 2.0網(wǎng)站,更多的網(wǎng)站都在使用Nginx配置。
2.8 框架
Javascript:Jquery,prototype.js,Kissky,extjs。
.NET:企業(yè)庫,unity,NHibernate,Sprint.NET,ibatis,MVC,MEF,Prism,log4net,23個開源項目,lucene.NET
Java:hibernate,spring,struts,easyjf,log4j,開源項目,lucene
Python:django,flask,bottle,tornado,uliweb,web.py
Ruby:rails
PHP:PEA
總結(jié)
- 上一篇: 总结-互联网校招面试锦囊
- 下一篇: Liunx常用命令速查