日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

主流互联网架构

發布時間:2023/12/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 主流互联网架构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉自:http://www.cnblogs.com/wuyuankun/p/3984209.html

主流互聯網架構

基礎知識點:

Squid:

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

?

Memcached :

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

ESI 動態緩存技術:

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

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

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

圖3.1

3.2第二步:增加頁面緩存

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

圖3.2

3.3第三步:增加頁面片段緩存

增加了squid做緩存后,整體系統的速度確實是提升了,webserver的壓力也開始下降了,但隨著訪問量的增加,發現系統又開始變的有些慢了,在嘗到了squid之類的動態緩存帶來的好處后,開始想能不能讓現在那些動態頁面里相對靜態的部分也緩存起來呢,因此考慮采用類似ESI之類的頁面片段緩存策略,OK,于是開始采用ESI來做動態頁面中相對靜態的片段部分的緩存。

圖3.3

3.4第四步:數據緩存

在采用ESI之類的技術再次提高了系統的緩存效果后,系統的壓力確實進一步降低了,但同樣,隨著訪問量的增加,系統還是開始變慢,經過查找,可能會發現系統中存在一些重復獲取數據信息的地方,像獲取用戶信息等,這個時候開始考慮是不是可以將這些數據信息也緩存起來呢,于是將這些數據緩存到本地內存,改變完畢后,完全符合預期,系統的響應速度又恢復了,數據庫的壓力也再度降低了不少。可以使用的技術有:memcached。

圖3.4

3.5第五步:增加webserver

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

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

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

3、如何保持數據緩存信息的同步,例如之前緩存的用戶數據等,這個時候通常會考慮的機制有緩存同步或分布式緩存;

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

在解決了這些問題后,終于是把webserver增加為了兩臺,系統終于是又恢復到了以往的速度。

圖3.5

3.6第六步:分庫

享受了一段時間的系統訪問量高速增長的幸福后,發現系統又開始變慢了,這次又是什么狀況呢,經過查找,發現數據庫寫入、更新的這些操作的部分數據庫連接的資源競爭非常激烈,導致了系統變慢,這下怎么辦呢,此時可選的方案有數據庫集群和分庫策略,集群方面像有些數據庫支持的并不是很好,因此分庫會成為比較普遍的策略,分庫也就意味著要對原有程序進行修改,一通修改實現分庫后,不錯,目標達到了,系統恢復甚至速度比以前還快了。

圖3.6

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

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

圖3.7

3.8第八步:增加更多的webserver

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

1、Apache的軟負載或LVS軟負載等無法承擔巨大的web訪問量(請求連接數、網絡流量等)的調度了,這個時候如果經費允許的話,會采取的方案是購買硬件負載,例如F5、Netsclar、Athelon之類的,如經費不允許的話,會采取的方案是將應用從邏輯上做一定的分類,然后分散到不同的軟負載集群中;

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

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

圖3.8

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

突然有一天,發現這個完美的時代也要結束了,數據庫的噩夢又一次出現在眼前了,由于添加的webserver太多了,導致數據庫連接的資源還是不夠用,而這個時候又已經分庫分表了,開始分析數據庫的壓力狀況,可能會發現數據庫的讀寫比很高,這個時候通常會想到數據讀寫分離的方案,當然,這個方案要實現并不容易,另外,可能會發現一些數據存儲在數據庫上有些浪費,或者說過于占用數據庫資源,因此在這個階段可能會形成的架構演變是實現數據讀寫分離,同時編寫一些更為廉價的存儲方案,例如BigTable這種。

圖3.9

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

經過上面這個漫長而痛苦的過程,終于是再度迎來了完美的時代,不斷的增加webserver就可以支撐越來越高的訪問量了,對于大型網站而言,人氣的重要毋庸置疑,隨著人氣的越來越高,各種各樣的功能需求也開始爆發性的增長,這個時候突然發現,原來部署在webserver上的那個web應用已經非常龐大了,當多個團隊都開始對其進行改動時,可真是相當的不方便,復用性也相當糟糕,基本是每個團隊都做了或多或少重復的事情,而且部署和維護也是相當的麻煩,因為龐大的應用包在N臺機器上復制、啟動都需要耗費不少的時間,出問題的時候也不是很好查,另外一個更糟糕的狀況是很有可能會出現某個應用上的bug就導致了全站都不可用,還有其他的像調優不好操作(因為機器上部署的應用什么都要做,根本就無法進行針對性的調優)等因素,根據這樣的分析,開始痛下決心,將系統根據職責進行拆分,于是一個大型的分布式應用就誕生了,通常,這個步驟需要耗費相當長的時間,因為會碰到很多的挑戰:

1、拆成分布式后需要提供一個高性能、穩定的通信框架,并且需要支持多種不同的通信和遠程調用方式;

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

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

經過這一步,差不多系統的架構進入相對穩定的階段,同時也能開始采用大量的廉價機器來支撐著巨大的訪問量和數據量,結合這套架構以及這么多次演變過程吸取的經驗來采用其他各種各樣的方法來支撐著越來越高的訪問量。

圖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個月進行第二個里程碑技術架構的討論和設計,因為這時候相比原有的第二個里程碑的業務估計可能會有變動,或者技術上有了新的選擇,都可以及時考慮到本次的設計中來。以此類推后面的里程碑技術架構變更。

還有就是突發情況,因為總會有一些意料之外的情況發生,有的是業務發展的需要,有的是被動的需要。針對這些突發情況,也會進行架構的升級。

?

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

?

? ? ? ? ? ? ?較為完整的系統架構圖

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下運行,也能在其他操作系統上運行。

Python和ruby是近幾年崛起的開源語言,特點是容易上手,能快速完成原型。同時也是較為成熟腳本語言。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

開源。

Wikipedia,Flickr,Twitter,Youtube

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,淘寶,新浪微博都有使用。

Couchdb,cassandra,hbase

都是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:Jquery,prototype.js,Kissky,extjs。

.NET:企業庫,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

總結

以上是生活随笔為你收集整理的主流互联网架构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。