1. 程式人生 > >大流量、高併發的網站的底層系統架構

大流量、高併發的網站的底層系統架構

動態應用,是相對於網站靜態內容而言, 是指以c/c++、php、Java、perl、.net等 伺服器端語言開發的網路應用軟體,比如論壇、網路相簿、交友、BLOG等常見應用。動態應用系統通 常與資料庫系統、快取系統、分散式儲存系統等密不可分。

大型動態應用系統平臺主要是針對於大流 量、高併發網站建立的底層系統架構。大型網站的執行需要一個可靠、安全、可擴充套件、易維護的應用系統平臺做為支撐,以保證網站應用的平穩執行。

大型動態應用系統又可分為幾個子系統:

l         Web前 端系統

l         負 載均衡系統

l         數 據庫集群系統

l         緩 存系統

l         分 布式儲存系統

l         分 布式伺服器管理系統

l         代 碼分發系統

Web前端系統

結構圖:

為了達到不同應用的伺服器共享、避免單點故障、集中管理、統一配置等目的,不以應用劃分服 務器,而是將所有伺服器做統一使用,每臺伺服器都可以對多個應用提供服務,當某些應用訪問量升高時,通過增加伺服器節點達到整個伺服器叢集的效能提高,同 時使他應用也會受益。該Web前端系統 基於Apache/Lighttpd/Eginx等 的虛擬主機平臺,提供PHP程式執行環境 。伺服器對開發人員是透明的,不需要開發人員介入伺服器管理

負載均衡系統

負載均衡系統分為硬體和軟體兩種。硬體負載均衡效率高,但是價格貴,比如F5等。軟體負載均衡系統價格較低或者免費,效率較硬體負載均衡系統 低,不過對於流量一般或稍大些網站來講也足夠使用,比如lvs,nginx。大多數網站都是硬體、軟體負載均衡系統並用。

資料庫集群系統

結構圖:

由於Web前端採用了負載均衡叢集結構提高了服務的有效性和擴充套件性,因此資料庫必須也是高可靠的才能保證整個服務體系的高可靠性,如何構建一個高可靠的、可以提供大規模併發處理的資料庫體系?

我們可以採用如上圖所示的方案:

1)        使用 MySQL 資料庫,考慮到Web應用的資料庫讀多寫少的特點,我們主要對讀資料庫做了優化,提供專用的讀資料庫和寫資料庫,在應用程式中實現讀操作和寫操作分別訪問不同的資料庫。

2)        使用 MySQL Replication 機制實現快速將主庫(寫庫)的資料庫複製到從庫(讀庫)。一個主庫對應多個從庫,主庫資料實時同步到從庫。

3)        寫資料庫有多臺,每臺都可以提供多個應用共同使用,這樣可以解決寫庫的效能瓶頸問題和單點故障問題。

4)        讀資料庫有多臺,通過負載均衡裝置實現負載均衡,從而達到讀資料庫的高效能、高可靠和高可擴充套件性。

5)        資料庫伺服器和應用伺服器分離。

6)        從資料庫使用BigIP做負載均衡。

快取系統

快取分為檔案快取、記憶體快取、資料庫快取。在大型Web應用中使用最多且效率最高的是記憶體快取。最常用的記憶體快取工具是Memcachd。使用正確的快取系統可以達到實現以下目標:

1、   使用快取系統可以提高訪問效率,提高伺服器吞吐能力,改善使用者體驗。

2、   減輕對資料庫及儲存集伺服器的訪問壓力

3、 Memcached伺服器有多臺,避免單點故障,提供高可靠性和可擴充套件性,提高效能。

分散式儲存系統

結構圖:

WEB系統平臺中的儲存需求有下面兩個特點:

1) 儲存量很大,經常會達到單臺伺服器無法提供的規模,比如相簿、視訊等應用。因此需要專業的大規模儲存系統。

2) 負載均衡cluster中的每個節點都有可能訪問任何一個數據物件,每個節點對資料的處理也能被其他節點共享,因此這些節點要操作的資料從邏輯上看只能是一個整體,不是各自獨立的資料資源。

因此高效能的分散式儲存系統對於大型網站應用來說是非常重要的一環。(這個地方需要加入對某個分散式儲存系統的簡單介紹。)

分散式伺服器管理系統

結構圖:

隨著網站訪問流量的不斷增加,大多的網路服務都是以負載均衡叢集的方式對外提供服務,隨之叢集規模的擴大,原來基於單機的伺服器管理模式已經不能夠滿足我們的需求,新的需求必須能夠集中式的、分組的、批量的、自動化的對伺服器進行管理,能夠批量化的執行計劃任務。

在分散式伺服器管理系統軟體中有一些比較優秀的軟體,其中比較理想的一個是 Cfengine。它可以對伺服器進行分組,不同的分組可以分別定製系統配置檔案、計劃任務等配置。它是基於C/S 結構的,所有的伺服器配置和管理指令碼程式都儲存在Cfengine Server上,而被管理的伺服器執行著 Cfengine Client 程式,Cfengine Client通過SSL加密的連線定期的向伺服器端傳送請求以獲取最新的配置檔案和管理命令、指令碼程式、補丁安裝等任務。

有了Cfengine 這種集中式的伺服器管理工具,我們就可以高效的實現大規模的伺服器叢集管理,被管理伺服器和 Cfengine Server 可以分佈在任何位置,只要網路可以連通就能實現快速自動化的管理。

程式碼釋出系統

結構圖:

隨著網站訪問流量的不斷增加,大多的網路服務都是以負載均衡叢集的方式對外提供服務,隨之叢集規模的擴大,為了滿足叢集環境下程式程式碼的批量分發和更新,我們還需要一個程式程式碼釋出系統。

這個釋出系統可以幫我們實現下面的目標:

1) 生產環境的伺服器以虛擬主機方式提供服務,不需要開發人員介入維護和直接操作,提供釋出系統可以實現不需要登陸伺服器就能把程式分發到目標伺服器。

2) 我們要實現內部開發、內部測試、生產環境測試、生產環境釋出的4個開發階段的管理,釋出系統可以介入各個階段的程式碼釋出。

3) 我們需要實現原始碼管理和版本控制,SVN可以實現該需求。

這裡面可以使用常用的工具Rsync,通過開發相應的指令碼工具實現伺服器叢集間程式碼同步分發。