今天記錄下圖片的分散式儲存和負載均衡實現原理。
對於Web伺服器而言,使用者對圖片資訊的訪問是很消耗伺服器資源的。當一個網頁被瀏覽時,Web伺服器與瀏覽器建立連線,每個連線表示一個併發。當頁面包含多個圖片時,Web伺服器與瀏覽器會產生多個連線,同時傳送文字和圖片以提高瀏覽速度。因此,頁面中圖片越多Web伺服器受到的壓力也就越大。
一般小型網站是把所有頁面和圖片統一存放在一個主目錄下,這樣的網站對系統架構、效能要求都很簡單。下面是原理圖
一些稍有規模的網站都儲存有大量圖片資源。使用者在訪問這些站點網頁時,網頁中圖片資訊佔到頁面資料流量的大部分。由於受客戶端瀏覽器限制,無法從一臺伺服器上同時下載頁面中所有圖片資訊,因此即使伺服器有很高頻寬,使用者的訪問速度還是會受到很大影響。由於圖片儲存在物理硬碟上,訪問圖片需要頻繁進行I/O 操作,因此當併發使用者數越來越多時,I/O操作就會成為整個系統的效能瓶頸。這個時候我們就要考慮把這些圖片資訊進行分散式儲存了。
下面說一個適用於中等規模商務網站的圖片資料分散式動態儲存及負載均衡的解決方案的思路。這種思想只需增加很少的硬體成本,即可提升網站的訪問速度,並且可以根據需要動態調整圖片伺服器的數量及圖片的儲存目錄,確保系統具有可擴充套件性和伸縮性。但對於大型的網站系統來說,他們可能會有更好的技術來實現資料的分散式儲存。
增加了圖片伺服器後,對於客戶端而言,整個網站系統執行過程應該仍然是透明的,不會給使用者帶來任何影響。但後臺系統需要解決以下4個問題:
- (1)如何實現圖片的分散式部署,圖片上傳時如何動態確定儲存到哪臺圖片伺服器;
- (2)如何做到圖片伺服器的負載均衡,既要保證所有圖片伺服器都有均等的機會來儲存圖片.
- (3)如何把一臺圖片伺服器上圖片均衡儲存到多個子目錄中以便突破作業系統在同一個目錄中儲存檔案數的限制,對圖片進行更好的管理和維護;
- (4)如何能根據效能需要和圖片數量的增加實現圖片伺服器的動態擴充。
下面是原理圖
Web伺服器部署網站的Web頁面,用於響應客戶端使用者的請求。當使用者瀏覽網頁時,Web伺服器響應請求並訪問資料庫伺服器,獲得網頁中所有圖片的URL路徑,然後生成頁面並返回給客戶端,客戶端接收該頁面並根據頁面中的圖片URL路徑自動從不同的圖片伺服器下載並顯示相應圖片。
當使用者上傳圖片時,Web伺服器首先從資料庫伺服器中獲取所有圖片伺服器的當前狀態,並根據相關演算法選擇一個圖片伺服器及儲存的目錄,再呼叫該圖片伺服器的Web Service方法把圖片儲存到該伺服器,最後在資料庫伺服器中紀錄該圖片的編號及URL路徑等資訊。資料庫伺服器用於記錄所有圖片的編號以及圖片的存放位置等資訊,同時需要記錄所有圖片伺服器的配置及當前狀態資訊。圖片伺服器叢集用於存放網站的所有圖片資訊,該叢集的伺服器數量可以根據需要動態增加。
圖片伺服器資訊表
Web伺服器需要及時掌握所有圖片伺服器的狀態和資訊才能動態決定把圖片儲存到哪一臺圖片伺服器,因此,需要把所有的圖片伺服器的狀態資訊全部紀錄到資料庫伺服器中, 狀態資訊表中的ServerId欄位為主鍵自增列,唯一代表一條圖片伺服器紀錄。ServerName欄位記錄伺服器的名稱,方便管理員識別該記錄代表哪臺伺服器。ServerUrl欄位標識了圖片伺服器上圖片主目錄的URL根路徑。PicRootPath欄位標識了儲存圖片的物理主目錄。MaxPicAmount欄位表示圖片伺服器能儲存的最大圖片數,該數可以根據圖片伺服器的硬體配置和效能以及使用者實際需要而進行動態調整。CurPicAmount欄位表示當前已儲存的圖片數,當CurPicAmount≥MaxPicAmount時系統將不再把圖片上傳到該伺服器。FlgUsable欄位表示圖片伺服器是否可用。
把圖片儲存到圖片伺服器上
可以在圖片伺服器上部署相應的服務,實現方式有web service、WCF、webclient類,共享檔案等等。
獲取圖片伺服器的隨機演算法
從狀態表篩選出可用的圖片伺服器集合記作C,並獲取集合的總記錄數N。然後用隨機函式產生一個隨機數R1並用R1與N進行取餘運算記作I=R1%N。則C[I]即為要儲存圖片的圖片伺服器
檢測圖片伺服器是否正常執行
可以利用心跳機制
客戶端使用者通過瀏覽器向Web伺服器發出瀏覽某頁面的請求,Web伺服器從資料庫伺服器中獲取該頁面的所有圖片URL資訊,並根據URL資訊去搜尋圖片伺服器的狀態資訊表,判斷該URL所指向的圖片伺服器的狀態欄位FlgUsable,若FlgUsable == false表示該圖片伺服器當前因某種原因處於不可用狀態,則把該圖片的URL替換成Web伺服器上儲存的一個預設圖片的URL,否則把該URL直接返回給客戶端。客戶端再根據圖片的URL路徑自動從不同的圖片伺服器上下載並顯示相應的圖片。由於圖片URL路徑直接指向具體的圖片伺服器,因此需要在每個圖片伺服器的儲存圖片的主目錄上建立一個Web站點。由於客戶端瀏覽器所需要的圖片是從多個圖片伺服器上直接下載,因此瀏覽器可以併發地從多臺伺服器上同時下載圖片,這樣就縮短了圖片下載時間,同時也減輕了Web伺服器的I/O請求及效能壓力,因此,提高了網站的訪問速度 .
寫在後面:這裡講的只是思路,需要考慮的細節點還是挺多的。這個就需要在實踐中體會了。寫的不好或不對的地方請大家指正!