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