圖片在不少的應用中會使用到,在論壇和圖片分享等應用中會有大規模的使用,在這些應用中的圖片的量是很嚇人的,而且對圖片訪問的併發也會很是高,單個的服務器已經沒法知足須要了,這個時候須要考慮搭建一個分佈式的圖片存儲系統以保存這麼大量的圖片信息,而且能支撐高併發的訪問。服務器
分析圖片的訪問,主要問題在於兩個方面,一是當高併發時,帶寬佔用會很是多;二是高併發時硬件的IO會很是高。如何解決這兩個問題就是解決問題的方案。網絡
先來解決下硬件的高IO,若是使用分佈式的部署,將高併發訪問的IO分散到多臺圖片服務器上去,那麼單臺服務器的IO就會下來。那如何才能將圖片分散存儲到多臺服務器上,客戶端訪問圖片的時候又如何才能準確的路由到正確的服務器上?這就須要有一個目錄服務,目錄服務保存和提供圖片存放位置的信息,客戶端經過目錄服務獲取圖片應該存放在哪臺服務器上,以及應從哪臺服務器上讀取或下載圖片。有了目錄服務器在服務器端確實能夠將圖片分佈式存儲了,但客戶端使用圖片服務的步驟複雜了,須要先調用目錄服務器獲取圖片上傳或下載的服務器信息,再訪問對應的服務器上傳或下載圖片。爲了客戶端調用能相對簡單,系統應該提供一個客戶端的封裝,以js或jar的方式提供,以簡化客戶端的使用。這裏再也不考慮分佈式存儲的高可用。架構
根據以上分析,一個可實現的分佈式圖片存儲系統的架構以下:併發
再來看下帶寬佔用的問題,一個可行的想法是能夠考慮對圖片進行壓縮傳輸,但圖片的壓縮和解壓會佔用機器的cpu,下降處理性能,在高併發時甚至可能會讓服務器崩潰。另外,CDN(內容分發網絡)也是一個辦法,這樣能夠分散帶寬需求,好比在網通網絡和電信網絡都建一個節點,兩個節點間進行同步(這或許是個難點,須要精細的分析)。使用網通網絡的客戶端訪問時路由到網通的節點,使用電信網絡的客戶端訪問時路由到電信的節點,這樣就分散了帶寬需求,在網通或電信的內部網絡帶寬要遠高於網通與電信間的帶寬。分佈式