愛上家娃
有文事者,必有武備 來如雷霆收震怒,罷如江海凝清光
導航
BlogJava
首頁
新隨筆
聯系
聚合
管理
統計
隨筆 - 63
文章 - 0
評論 - 17
引用 - 0
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(3)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2010年11月 (1)
2010年7月 (2)
2010年6月 (2)
2010年5月 (1)
2009年12月 (3)
2009年11月 (3)
2009年10月 (2)
2009年9月 (1)
2009年8月 (1)
2009年6月 (1)
2009年5月 (1)
2009年3月 (1)
2009年2月 (1)
2009年1月 (1)
2008年12月 (3)
2008年11月 (1)
2008年10月 (4)
2008年9月 (3)
2008年8月 (2)
2008年7月 (6)
2008年6月 (23)
搜索
最新評論
1.?re: ThinkPHP Cookie操作
發發發發發發
--But V
2.?re: SQL Server觸發器使用教程和命名規范
說說的就說遠了,ORACLE與SQLSERVER的觸發器一樣嗎?內容與主題不符啊
--ymg022
3.?re: vb窗口最大化問題的解決方法
這個早就知道了,不過樓主有心將其整理成文并發布出來,還是要贊一個。
--李莫愁
4.?re: vb窗口最大化問題的解決方法
combox控件不能跟著變化呀 !!!!!!!!!!!!!
--kone
5.?男士錢包
朋友,你好,可以做個鏈接嗎
--男士錢包
閱讀排行榜
1.?SQL Server觸發器使用教程和命名規范(8572)
2.?vb窗口最大化問題的解決方法(7099)
3.?ThinkPHP Cookie操作 (2059)
4.?HTML代碼大全(1515)
5.?js返回上一頁(1250)
評論排行榜
1.?vb窗口最大化問題的解決方法(3)
2.?SQL(3)
3.?IE修改(2)
4.?征婚啟事(1)
5.?國內SNS點評(1)
WEB 大型網站架構演變和知識體系
之前也有一些介紹大型網站架構演變的文章,例如LiveJournal的、ebay的,都是非常值得參考的,不過感覺他們講的更多的是每次演變的結果,而沒有很詳細的講為什么需要做這樣的演變,再加上近來感覺有不少同學都很難明白為什么一個網站需要那么復雜的技術,于是有了寫這篇文章的想法,在這篇文章中將闡述一個普通的網站發展成大型網站過程中的一種較為典型的架構演變歷程和所需掌握的知識體系,希望能給想從事互聯網行業的同學一點初步的概念,:),文中的不對之處也請各位多給點建議,讓本文真正起到拋磚引玉的效果。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
架構演變第一步:物理分離webserver和數據庫
最開始,由于某些想法,于是在互聯網上搭建了一個網站,這個時候甚至有可能主機都是租借的,但由于這篇文章我們只關注架構的演變歷程,因此就假設這個時候已經是托管了一臺主機,并且有一定的帶寬了,這個時候由于網站具備了一定的特色,吸引了部分人訪問,逐漸你發現系統的壓力越來越高,響應速度越來越慢,而這個時候比較明顯的是數據庫和應用互相影響,應用出問題了,數據庫也很容易出現問題,而數據庫出問題的時候,應用也容易出問題,于是進入了第一步演變階段:將應用和數據庫從物理上分離,變成了兩臺機器,這個時候技術上沒有什么新的要求,但你發現確實起到效果了,系統又恢復到以前的響應速度了,并且支撐住了更高的流量,并且不會因為數據庫和應用形成互相的影響。
看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
這一步架構演變對技術上的知識體系基本沒有要求。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
架構演變第二步:增加頁面緩存
好景不長,隨著訪問的人越來越多,你發現響應速度又開始變慢了,查找原因,發現是訪問數據庫的操作太多,導致數據連接競爭激烈,所以響應變慢,但數據庫連接又不能開太多,否則數據庫機器壓力會很高,因此考慮采用緩存機制來減少數據庫連接資源的競爭和對數據庫讀的壓力,這個時候首先也許會選擇采用squid等類似的機制來將系統中相對靜態的頁面(例如一兩天才會有更新的頁面)進行緩存(當然,也可以采用將頁面靜態化的方案),這樣程序上可以不做修改,就能夠很好的減少對webserver的壓力以及減少數據庫連接資源的競爭,OK,于是開始采用squid來做相對靜態的頁面的緩存。
看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
前端頁面緩存技術,例如squid,如想用好的話還得深入掌握下squid的實現方式以及緩存的失效算法等。
架構演變第三步:增加頁面片段緩存
增加了squid做緩存后,整體系統的速度確實是提升了,webserver的壓力也開始下降了,但隨著訪問量的增加,發現系統又開始變的有些慢了,在嘗到了squid之類的動態緩存帶來的好處后,開始想能不能讓現在那些動態頁面里相對靜態的部分也緩存起來呢,因此考慮采用類似ESI之類的頁面片段緩存策略,OK,于是開始采用ESI來做動態頁面中相對靜態的片段部分的緩存。
看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
頁面片段緩存技術,例如ESI等,想用好的話同樣需要掌握ESI的實現方式等;
架構演變第四步:數據緩存
在采用ESI之類的技術再次提高了系統的緩存效果后,系統的壓力確實進一步降低了,但同樣,隨著訪問量的增加,系統還是開始變慢,經過查找,可能會發現系統中存在一些重復獲取數據信息的地方,像獲取用戶信息等,這個時候開始考慮是不是可以將這些數據信息也緩存起來呢,于是將這些數據緩存到本地內存,改變完畢后,完全符合預期,系統的響應速度又恢復了,數據庫的壓力也再度降低了不少。
看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
緩存技術,包括像Map數據結構、緩存算法、所選用的框架本身的實現機制等。
架構演變第五步:增加webserver
好景不長,發現隨著系統訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一臺webserver,這也是為了同時解決可用性的問題,避免單臺的webserver down機的話就沒法使用了,在做了這些考慮后,決定增加一臺webserver,增加一臺webserver時,會碰到一些問題,典型的有:
1、如何讓訪問分配到這兩臺機器上,這個時候通常會考慮的方案是Apache自帶的負載均衡方案,或LVS這類的軟件負載均衡方案;
2、如何保持狀態信息的同步,例如用戶session等,這個時候會考慮的方案有寫入數據庫、寫入存儲、cookie或同步session信息等機制等;
3、如何保持數據緩存信息的同步,例如之前緩存的用戶數據等,這個時候通常會考慮的機制有緩存同步或分布式緩存;
4、如何讓上傳文件這些類似的功能繼續正常,這個時候通常會考慮的機制是使用共享文件系統或存儲等;
在解決了這些問題后,終于是把webserver增加為了兩臺,系統終于是又恢復到了以往的速度。看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
負載均衡技術(包括但不限于硬件負載均衡、軟件負載均衡、負載算法、linux轉發協議、所選用的技術的實現細節等)、主備技術(包括但不限于ARP欺騙、linux heart-beat等)、狀態信息或緩存同步技術(包括但不限于Cookie技術、UDP協議、狀態信息廣播、所選用的緩存同步技術的實現細節等)、共享文件技術(包括但不限于NFS等)、存儲技術(包括但不限于存儲設備等)。
架構演變第六步:分庫
享受了一段時間的系統訪問量高速增長的幸福后,發現系統又開始變慢了,這次又是什么狀況呢,經過查找,發現數據庫寫入、更新的這些操作的部分數據庫連接的資源競爭非常激烈,導致了系統變慢,這下怎么辦呢,此時可選的方案有數據庫集群和分庫策略,集群方面像有些數據庫支持的并不是很好,因此分庫會成為比較普遍的策略,分庫也就意味著要對原有程序進行修改,一通修改實現分庫后,不錯,目標達到了,系統恢復甚至速度比以前還快了。
看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
這一步更多的是需要從業務上做合理的劃分,以實現分庫,具體技術細節上沒有其他的要求;
但同時隨著數據量的增大和分庫的進行,在數據庫的設計、調優以及維護上需要做的更好,因此對這些方面的技術還是提出了很高的要求的。
架構演變第七步:分表、DAL和分布式緩存
隨著系統的不斷運行,數據量開始大幅度增長,這個時候發現分庫后查詢仍然會有些慢,于是按照分庫的思想開始做分表的工作,當然,這不可避免的會需要對程序進行一些修改,也許在這個時候就會發現應用自己要關心分庫分表的規則等,還是有些復雜的,于是萌生能否增加一個通用的框架來實現分庫分表的數據訪問,這個在ebay的架構中對應的就是DAL,這個演變的過程相對而言需要花費較長的時間,當然,也有可能這個通用的框架會等到分表做完后才開始做,同時,在這個階段可能會發現之前的緩存同步方案出現問題,因為數據量太大,導致現在不太可能將緩存存在本地,然后同步的方式,需要采用分布式緩存方案了,于是,又是一通考察和折磨,終于是將大量的數據緩存轉移到分布式緩存上了。看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
分表更多的同樣是業務上的劃分,技術上涉及到的會有動態hash算法、consistent hash算法等;
DAL涉及到比較多的復雜技術,例如數據庫連接的管理(超時、異常)、數據庫操作的控制(超時、異常)、分庫分表規則的封裝等;
架構演變第八步:增加更多的webserver
在做完分庫分表這些工作后,數據庫上的壓力已經降到比較低了,又開始過著每天看著訪問量暴增的幸福生活了,突然有一天,發現系統的訪問又開始有變慢的趨勢了,這個時候首先查看數據庫,壓力一切正常,之后查看webserver,發現apache阻塞了很多的請求,而應用服務器對每個請求也是比較快的,看來是請求數太高導致需要排隊等待,響應速度變慢,這還好辦,一般來說,這個時候也會有些錢了,于是添加一些webserver服務器,在這個添加webserver服務器的過程,有可能會出現幾種挑戰:
1、Apache的軟負載或LVS軟負載等無法承擔巨大的web訪問量(請求連接數、網絡流量等)的調度了,這個時候如果經費允許的話,會采取的方案是購買硬件負載,例如F5、Netsclar、Athelon之類的,如經費不允許的話,會采取的方案是將應用從邏輯上做一定的分類,然后分散到不同的軟負載集群中;
2、原有的一些狀態信息同步、文件共享等方案可能會出現瓶頸,需要進行改進,也許這個時候會根據情況編寫符合網站業務需求的分布式文件系統等;
在做完這些工作后,開始進入一個看似完美的無限伸縮的時代,當網站流量增加時,應對的解決方案就是不斷的添加webserver。看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
到了這一步,隨著機器數的不斷增長、數據量的不斷增長和對系統可用性的要求越來越高,這個時候要求對所采用的技術都要有更為深入的理解,并需要根據網站的需求來做更加定制性質的產品。
架構演變第九步:數據讀寫分離和廉價存儲方案
突然有一天,發現這個完美的時代也要結束了,數據庫的噩夢又一次出現在眼前了,由于添加的webserver太多了,導致數據庫連接的資源還是不夠用,而這個時候又已經分庫分表了,開始分析數據庫的壓力狀況,可能會發現數據庫的讀寫比很高,這個時候通常會想到數據讀寫分離的方案,當然,這個方案要實現并不容易,另外,可能會發現一些數據存儲在數據庫上有些浪費,或者說過于占用數據庫資源,因此在這個階段可能會形成的架構演變是實現數據讀寫分離,同時編寫一些更為廉價的存儲方案,例如BigTable這種。
看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
數據讀寫分離要求對數據庫的復制、standby等策略有深入的掌握和理解,同時會要求具備自行實現的技術;
廉價存儲方案要求對OS的文件存儲有深入的掌握和理解,同時要求對采用的語言在文件這塊的實現有深入的掌握。
架構演變第十步:進入大型分布式應用時代和廉價服務器群夢想時代
經過上面這個漫長而痛苦的過程,終于是再度迎來了完美的時代,不斷的增加webserver就可以支撐越來越高的訪問量了,對于大型網站而言,人氣的重要毋庸置疑,隨著人氣的越來越高,各種各樣的功能需求也開始爆發性的增長,這個時候突然發現,原來部署在webserver上的那個web應用已經非常龐大了,當多個團隊都開始對其進行改動時,可真是相當的不方便,復用性也相當糟糕,基本是每個團隊都做了或多或少重復的事情,而且部署和維護也是相當的麻煩,因為龐大的應用包在N臺機器上復制、啟動都需要耗費不少的時間,出問題的時候也不是很好查,另外一個更糟糕的狀況是很有可能會出現某個應用上的bug就導致了全站都不可用,還有其他的像調優不好操作(因為機器上部署的應用什么都要做,根本就無法進行針對性的調優)等因素,根據這樣的分析,開始痛下決心,將系統根據職責進行拆分,于是一個大型的分布式應用就誕生了,通常,這個步驟需要耗費相當長的時間,因為會碰到很多的挑戰:
1、拆成分布式后需要提供一個高性能、穩定的通信框架,并且需要支持多種不同的通信和遠程調用方式;
2、將一個龐大的應用拆分需要耗費很長的時間,需要進行業務的整理和系統依賴關系的控制等;
3、如何運維(依賴管理、運行狀況管理、錯誤追蹤、調優、監控和報警等)好這個龐大的分布式應用。
經過這一步,差不多系統的架構進入相對穩定的階段,同時也能開始采用大量的廉價機器來支撐著巨大的訪問量和數據量,結合這套架構以及這么多次演變過程吸取的經驗來采用其他各種各樣的方法來支撐著越來越高的訪問量。看看這一步完成后系統的圖示:
<!--[if !vml]-->
<!--[endif]-->
這一步涉及到了這些知識體系:
這一步涉及的知識體系非常的多,要求對通信、遠程調用、消息機制等有深入的理解和掌握,要求的都是從理論、硬件級、操作系統級以及所采用的語言的實現都有清楚的理解。
運維這塊涉及的知識體系也非常的多,多數情況下需要掌握分布式并行計算、報表、監控技術以及規則策略等等。
說起來確實不怎么費力,整個網站架構的經典演變過程都和上面比較的類似,當然,每步采取的方案,演變的步驟有可能有不同,另外,由于網站的業務不同,會有不同的專業技術的需求,這篇blog更多的是從架構的角度來講解演變的過程,當然,其中還有很多的技術也未在此提及,像數據庫集群、數據挖掘、搜索等,但在真實的演變過程中還會借助像提升硬件配置、網絡環境、改造操作系統、CDN鏡像等來支撐更大的流量,因此在真實的發展過程中還會有很多的不同,另外一個大型網站要做到的遠遠不僅僅上面這些,還有像安全、運維、運營、服務、存儲等,要做好一個大型的網站真的很不容易,寫這篇文章更多的是希望能夠引出更多大型網站架構演變的介紹,:)。
posted on 2009-05-04 16:29
肖馬輝
閱讀(207)
評論(0)
編輯
收藏
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
Powered by:
BlogJava
Copyright © 肖馬輝
主站蜘蛛池模板:
大地影院MV在线观看视频免费
|
精品亚洲视频在线
|
男人j进入女人j内部免费网站
|
亚洲人成影院在线观看
|
一边摸一边爽一边叫床免费视频
|
好吊色永久免费视频大全
|
57PAO成人国产永久免费视频
|
亚洲日本乱码一区二区在线二产线
|
1000部禁片黄的免费看
|
亚洲乱码一二三四区国产
|
午夜男人一级毛片免费
|
国产av无码专区亚洲av毛片搜
|
国产女高清在线看免费观看
|
亚洲国产精品嫩草影院
|
免费人妻无码不卡中文字幕18禁
|
无码免费又爽又高潮喷水的视频
|
亚洲永久网址在线观看
|
免费看香港一级毛片
|
麻豆69堂免费视频
|
精品国产亚洲一区二区三区
|
久久免费的精品国产V∧
|
亚洲成aⅴ人片在线影院八
|
日本免费人成黄页网观看视频
|
久久成人免费大片
|
亚洲国产成a人v在线
|
国产免费久久精品久久久
|
国产乱妇高清无乱码免费
|
久久亚洲精品成人无码网站
|
免费的涩涩视频在线播放
|
特级毛片爽www免费版
|
亚洲国产精品一区
|
天天摸天天碰成人免费视频
|
一个人看www免费高清字幕
|
久久久久久久亚洲Av无码
|
国产做床爱无遮挡免费视频
|
免费国产污网站在线观看
|
亚洲一卡一卡二新区无人区
|
亚洲自偷自偷偷色无码中文
|
99在线精品视频观看免费
|
人妻18毛片a级毛片免费看
|
亚洲福利电影在线观看
|