1. 程式人生 > >大型網站系統架構分析整理

大型網站系統架構分析整理

千萬級的註冊使用者,千萬級的帖子,nTB級的附件,還有巨大的日訪問量,大型網站採用什麼系統架構保證效能和穩定性?

首先討論一下大型網站需要注意和考慮的問題。

  • 資料庫海量資料處理:負載量不大的情況下select、delete和update是響應很迅速的,最多加幾個索引就可以搞定,但千萬級的註冊使用者和一個設計不好的多對多關係將帶來非常嚴重的效能問題。另外在高UPDATE的情況下,更新一個聚焦索引的時間基本上是不可忍受的。索引和更新是一對天生的冤家。
  • 高併發死鎖:平時我們感覺不到,但資料庫死鎖在高併發的情況下的出現的概率是非常高的。
  • 檔案儲存的問題:大型網站有海量圖片資料、視訊資料、檔案資料等等,他們如何儲存並被有效索引?高併發的情況下IO的瓶頸問題會迅速顯現。也許用RAID和專用存貯伺服器能解決眼下的問題,但是還有個問題就是各地的訪問問題,也許我們的伺服器在北京,可能在雲南或者海南的訪問速度如何解決?如果做分散式,那麼我們的檔案索引以及架構該如何規劃。

接下來討論大型網站的底層系統架構,來有效的解決上述問題。

毋庸置疑,對於規模稍大的網站來說,其背後必然是一個伺服器叢集來提供網站服務,例如,2004年eBay的伺服器有2400臺,估計現在更多。當然,資料庫也必然要和應用服務分開,有單獨的資料庫伺服器叢集。對於像淘寶網這樣規模的網站而言,就是應用也分成很多組。

大型網站系統架構

下面,就從伺服器作業系統與Web伺服器、資料庫、伺服器叢集與負載均衡、快取、獨立的圖片伺服器、其它等幾個方面來分析大型網站的系統架構。

伺服器作業系統與Web伺服器

最底層首先是作業系統。好的作業系統能提高好的效能、穩定性和安全性,而這些對大型網站的效能、安全性和穩定性都是至關重要的。

  • 淘寶網(阿里巴巴): Linux作業系統 + Web 伺服器: Apache
  • 新浪:FreeBSD + Web 伺服器:Apache
  • Yahoo:FreeBSD + Web 伺服器:自己的
  • Google: 部分Linux + Web 伺服器:自己的
  • 百度:Linux + Web 伺服器: Apache
  • 網易:Linux + Web 伺服器: Apache
  • eBay: Windows Server 2003/8 (大量) + Web 伺服器:Microsoft IIS
  • MySpace: Windows Server 2003/8 + Web 伺服器:Microsoft IIS

由此可見,開源作業系統做Web應用是首選已經是一個既定事實。在開源作業系統中Linux和FreeBSD差不太多,很難說哪個一定比另外一個要優秀很多、能夠全面的超越對手,應該是各有所長。但熟悉Linux的技術人員更多些,利於系統管理、優化等,所以Linux使用更廣泛。而Windows Server和IIS雖然有的網站使用,但不開源,而且需要購買微軟的一系列應用產品,限制了其使用。總之,開源作業系統,尤其是Linux做Web應用是首選已經是一個既定事實。

常用的系統架構是:

  • Linux + Apache + PHP + MySQL
  • Linux + Apache + Java (WebSphere) + Oracle
  • Windows Server 2003/2008 + IIS + C#/ASP.NET + 資料庫

資料庫

因為是千萬人同時訪問的網站,所以一般是有很多個數據庫同時工作的,說明白一點就是資料庫叢集和併發控制,資料分佈到地理位置不同的資料中心,以免發生斷電事故。

主流的資料庫有Sun的是MySQL和Oracle。

Oracle是一款優秀的、廣泛採用的商業資料庫管理軟體。有很強大的功能和安全性,可以處理相對海量的資料。而MySQL是一款非常優秀的開源資料庫管理軟體,非常適合用多臺PC Server組成多點的儲存節點陣列(這裡我所指的不是MySQL自身提供的叢集功能),每單位的資料儲存成本也非常的低廉。用多臺PC Server安裝MySQL組成一個儲存節點陣列,通過MySQL自身的Replication或者應用自身的處理,可以很好的保證容錯(允許部分節點失效),保證應用的健壯性和可靠性。可以這麼說,在關係資料庫管理系統的選擇上,可以考慮應用本身的情況來決定。

MySQL資料庫伺服器的master-slave模式,利用資料庫伺服器在主從伺服器間進行同步,應用只把資料寫到主伺服器,而讀資料時則根據負載選擇一臺從伺服器或者主伺服器來讀取,將資料按不同策略劃分到不同的伺服器(組)上,分散資料庫壓力。

伺服器叢集與負載均衡

伺服器群集中每個服務結點執行一個所需伺服器程式的獨立拷貝,而網路負載均衡則將工作負載在這些主機間進行分配。負載均衡建立在現有網路結構之上,它提供了一種廉價有效的方法擴充套件伺服器頻寬和增加吞吐量,加強網路資料處理能力,提高網路的靈活性和可用性。它主要完成以下任務:解決網路擁塞問題,服務就近提供,實現地理位置無關性 ;為使用者提供更好的訪問質量;提高伺服器響應速度;提高伺服器及其他資源的利用效率;避免了網路關鍵部位出現單點失效。

常用的伺服器叢集和資料庫叢集負載均衡實現方法:

  • Citrix NetScaler的硬體負載均衡交換機做伺服器叢集的負載均衡。
  • MySQL Proxy做MySQL伺服器叢集的負載均衡並實現讀寫分離。其實現讀寫分離的基本原理是讓主資料庫處理事務性查詢,而從資料庫處理SELECT查詢。資料庫複製被用來把事務性查詢導致的變更同步到叢集中的從資料庫。
  • CDN (Content Delivery Network): 幾乎在各大網站都有使用該技術。例如,使得你的網站在各省市訪問更快,其原理是採取了分散式網路快取結構(即國際上流行的web cache技術),通過在現有的Internet中增加一層新的網路架構,將網站的內容釋出到最接近使用者的cache伺服器內,通過DNS負載均衡的技術,判斷使用者來源就近訪問cache伺服器取得所需的內容,解決Internet網路擁塞狀況,提高使用者訪問網站的響應速度,如同提供了多個分佈在各地的加速器,以達到快速、可冗餘的為多個網站加速的目的。

快取

眾所周知,使用快取能有效應對大負載,減少資料庫的壓力,並顯著提高多層應用程式的效能,如果某個使用者多次請求同一資源,則可以從快取返回該資源,從而避免了重新從伺服器或資料庫請求該資源而產生的系統開銷。快取可以通過減少獲取請求的資源所需的時間,提高應用程式效能。快取還可以通過減少到伺服器的往返次數,降低網路通訊量。儘管快取可以提高效能,但它也增加了返回到應用程式的資源可能變得陳舊的風險。這意味著,返回的資源可能與假設沒有使用快取的情況下,伺服器有可能傳送的資源並不完全相同(即取得“髒資料”)。

即便如此,簡單的快取策略也能大大提升網站效能。例如,Youtube把首頁最新的視訊列表快取60秒,也就是說60秒內併發的request都是從快取讀取的,大大減少了資料庫壓力。再加上CDN,使得Youtube首頁的併發訪問速度很快。

單機記憶體快取、檔案快取、資料庫快取等的策略都是可以很簡單的實現的,例如可以使用微軟的Caching Application Block,但如何在叢集環境中使多個快取、多層快取並儲存同步是個重大問題。大型網站一般都使用快取伺服器群,並使用多層快取。業內最常用的有:

  • Squid cache,Squid伺服器群,把它作為web伺服器端前置cache伺服器快取相關請求來提高web伺服器速度。Squid將大部分靜態資源(圖片,js,css等)快取起來,直接返回給訪問者,減少應用伺服器的負載
  • memcache,memcache伺服器群,一款分散式快取產品,很多大型網站在應用; 它可以應對任意多個連線,使用非阻塞的網路IO。由於它的工作機制是在記憶體中開闢一塊空間,然後建立一個HashTable,Memcached自管理這些HashTable。因為通常網站應用程式中最耗費時間的任務是資料在資料庫的檢索,而多個使用者查詢相同的SQL時,資料庫壓力會增大,而通過memcache的查詢快取命中,資料直接從memcache記憶體中取,每次快取命中將替換到資料庫伺服器的一次往返,到達資料庫伺服器的請求更少,間接地提高了資料庫伺服器的效能,從而使應用程式執行得更快。它通過基於記憶體快取物件來減少資料庫查詢的方式改善網站系統的反應,其最吸引人的一個特性就是支援分散式部署。
  • e-Accelerator,比較特殊,PHP的快取和加速器。是一個免費開源的PHP加速、優化、編譯和動態快取的專案,它可以通過快取PHP程式碼編譯後的結果來提高PHP指令碼的效能,使得一向很複雜和離我們很遠的 PHP指令碼編譯問題完全得到解決。通過使用eAccelerator,可以優化你的PHP程式碼執行速度,降低伺服器負載,可以提高PHP應用執行速度最高達10倍。

獨立的圖片伺服器

無論從管理上,還是從效能上看,只要有可能,儘量部署獨立的圖片伺服器。這幾乎成為常識了。具備獨立的圖片伺服器或者伺服器集群后,在 Web 伺服器上就可以有針對性的進行配置優化。

其他

一個網際網路應用,除了伺服器的作業系統,Web Server軟體,應用伺服器軟體,資料庫軟體外,我們還會涉及到一些其他的系統,比如一些中介軟體系統、檔案儲存系統(圖片伺服器,視訊伺服器,管理伺服器,RSS和廣告伺服器等等)、全文檢索、搜尋、等等。會在以後介紹。