大型網站中圖片存儲方面的相關問題

第一篇,讓我們從獨立圖片服務器開始說起,真愛,不是須要讓自己更加獨立的麼?

正文

一、部署獨立圖片服務器的必要性

我們知道,無論對於Apache還是IIS,圖片始終是最消耗系統資源的,如果將圖片服務和應用服務放在同一個服務器的話,應用服務器很容易會因爲圖片的高I/O負載而崩潰,因此對於有些大型網站項目,我們有必要將圖片服務器和應用服務器分離。部署獨立的圖片服務器(甚至是服務器集羣)是大型網站圖片存儲解決方案中最基礎的,因爲有了獨立的圖片服務器後,我們才能對圖片服務器做更有針對性的性能優化,比如從硬件角度說,圖片服務器可以配置高端的硬盤,7200轉的換成15000轉的,而CPU卻只要一般就可以了;從軟件角度說,可以爲圖片服務器配置特殊的文件系統來滿足對圖片的I/O請求,如淘寶的TFS,就很好地解決了大規模小圖片文件帶來的I/O噩夢,同時,我們也可以採用nginx、squid來代理圖片請求等等。

二、採用獨立域名

注意,這裏是指獨立域名,不是子域哦,比如moke8.com圖片服務器用了moke8.cn的域名,而不是用二級域名img.moke8.com,這是爲什麼呢?個人覺得原因主要有以下幾點:

1、同一域名下瀏覽器的併發連接數有限制,一般在2 - 6之間,下圖列舉了各個瀏覽器的併發連接數(來自網絡,未經我親自考證,供參考)

這樣,我們如果給圖片服務器配置獨立的域名,那麼在一個頁面中加載圖片時,就可以突破瀏覽器連接數的限制,理論上,增加一個獨立域名,併發連接數加倍。

2、由於cookie的原因,對緩存不利

比如有一張圖片http://upload.moke8.com//,那麼當我們向它發起請求的時候,會帶上www.moke8.com域名下的cookie,由於大部分web cache都只緩存不帶cookie的請求,這樣就導致每次的圖片請求都不能命中cache,而仍舊要去原始服務器獲取圖片,導致圖片緩存意義不大。所以,還是給單獨搞一個圖片獨立域名吧,當然,不只是圖片,css和js文件也可以參照這個思路來搞。

3、方便CDN同步

這個我不太清楚是怎麼回事,我個人猜測和第二點cookie有點關係,還望資深人士留言分享,謝謝。

三、圖片服務器分離後,如何進行圖片上傳和圖片同步

當然任何事物都具有兩面性,圖片服務器分離固然提升了圖片訪問的效率,大大緩解了服務器因圖片造成的I/O瓶頸,但是分離以後圖片的上傳和同步就成了一個大問題了。下面就我個人的想法談談幾種解決方案。

1、NFS共享方式

如果你不想在每臺圖片服務器同步所有圖片,那NFS共享是最簡單也最實用的方式。NFS是個分佈式的客戶機/服務器文件系統,NFS的實質在於用戶間計算機的共享,用戶可以聯結到共享計算機並象訪問本地硬盤一樣訪問共享計算機上的文件。

具體實現思路是:web服務器通過nfs掛載多臺圖片服務器export出來的目錄,用戶先將圖片上傳到web服務器,然後將上傳的圖片通過程序拷貝到這個mount目錄中去,這樣那幾臺圖片服務器就也能訪問到剛上傳的圖片了(注意,只是共享了,並沒有真正拷貝到圖片服務器)。再給那幾臺圖片服務器綁定獨立域名,於是瀏覽器端就可以用單獨的域名來訪問圖片了。這種方式基本不會有因同步造成的延時,但需要依賴nfs,nfs掛掉會影響web服務器。爲了更直觀的表達,我還是上一幅圖吧,畫得比較粗糙,大家將就着看看。

2、利用FTP同步

和上面nfs不一樣的是,用戶上傳完圖片後是利用ftp同步到各個圖片服務器的,php、java、asp.net基本上都能操作ftp。這樣的話每個圖片服務器就都保存一份圖片的副本,也起到了備份的作用。但是缺點是將圖片ftp到服務器比較耗時,如果異步去同步的話又會有延時,不過一般的小圖片文件也還好了。

當然除了上面兩種方法,還有諸如安裝同步軟件、webservice等方法,但我個人覺得上面2種比較靠譜一點,所以其他的就暫時不介紹了,如果各位朋友有更好地建議,請留言分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章