圖片集群分布式存儲和負載均衡
今天記錄下圖片的分布式存儲和負載均衡實現原理。
對于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請求及性能壓力,因此,提高了網站的訪問速度 .
寫在后面:這里講的只是思路,需要考慮的細節點還是挺多的。這個就需要在實踐中體會了。寫的不好或不對的地方請大家指正!