在筆者的另一篇文章《nginx性能改進一例》有講到,在圖片規(guī)模比大的情況,nginx處理能力受制于文件系統(tǒng)的io幅疼,意味著,在大規(guī)模圖片的場景昼接,如果運維還依舊采用傳統(tǒng)文件系統(tǒng)的方式爽篷,無論是備份成本,還是前端成本慢睡,將是無法去衡量逐工,不要去指望調(diào)優(yōu)一點文件系統(tǒng)的一些參數(shù),能帶來多大的性能收益一睁,也不要去目錄hash+rewrite的方式钻弄,改進不大,因為新版的文件系統(tǒng)默認開啟了dir_index者吁,解決了同一個目錄下文件過多而過慢的問題窘俺。不過還有一種方案就是采購SSD盤、fusion-io卡之類高性能的硬件去解決隨機io复凳,當然你得容忍備份的痛苦瘤泪。先看一下架構(gòu)圖邏輯圖,這也是現(xiàn)在各大公司采用的方式育八。
這個是一個大致邏輯圖对途,具體布署是根據(jù)模塊的性能消耗類型去混合部署。
第一點髓棋,分布存儲的必要性:存儲原始圖片实檀,用分布式存儲有幾個好處,分布式能自動提供冗余按声,不需要我們?nèi)浞萆庞蹋瑩臄?shù)據(jù)安全,在文件數(shù)量特別大的情況下签则,備份是一件很痛苦的事情须床,rsync掃一次可能是就是好幾個小時。還有一點就是分布式存儲動態(tài)擴容方便渐裂。不過唯一遺憾的是目前適合于存小文件系統(tǒng)比較少豺旬,我了解的只有fastdfs,以及淘寶的tfs柒凉,還有mongodb這幾個族阅,tfs經(jīng)歷過淘寶那種規(guī)模的考驗,文檔和工具都太少扛拨,如果能駕馭tfs耘分,我覺得值得嘗試一下。。
第二點求泰,上傳和下載分開處理:通常圖片服務(wù)器上傳的壓力與下載的壓力相差很大央渣,大多數(shù)的公司都是下載的壓力是上傳壓力的n倍。業(yè)務(wù)邏輯的處理也區(qū)別明顯渴频,上傳服務(wù)器對圖片重命名芽丹,記錄入庫信息,下載服務(wù)器對圖片添加水印卜朗、修改尺寸之類的動態(tài)處理拔第。從數(shù)據(jù)的角度,我們能容忍部分圖片下載失敗场钉,但絕不能有圖片上傳失敗蚊俺,因為上傳失敗,意味著數(shù)據(jù)的丟失逛万。上傳與下載分開泳猬,能保證不會因下載的壓力影響圖片的上傳,而且還有一點宇植,下載入口和上傳入口的負載均衡策略也不同得封,下面有說明。
第三點指郁,使用cache做緩層:分布式存儲解決了存儲安全問題忙上,但性能問題還需要用cache去解決,直接從分布式存儲取文件給用戶提供服務(wù)闲坎,每秒的request高不到哪里去疫粥,像淘寶之類的網(wǎng)站,都做了二層cache腰懂。對于cache的開源軟件選型要考慮二點手形,1,緩存的量級大悯恍,盡可能讓熱點圖片緩存在cache中,像varnish之類的伙狐,純內(nèi)存的cache涮毫,雖然性能很好,但能cache的量級很限于內(nèi)存贷屎,用來做圖片的緩存不太適合罢防;2,避免文件系統(tǒng)式的緩存唉侄,在我的另一篇文章中有測過咒吐,在文件量非常的情況下,文件系統(tǒng)的型能很差,像squid,nginx的proxy_store,proxy_cache之類的方式緩存恬叹,當緩存的量級上來后候生,性能將不能滿足要求。開源的traffic server直接用裸盤緩存绽昼,是一個不錯的選擇唯鸭,當然使用leveldb之類的做緩存,我估計也能達到很好的效果硅确。這里說明一下cache緩存最好不要去依賴第三方CDN目溉,現(xiàn)在很多第三的CDN業(yè)務(wù),不僅提供內(nèi)容分發(fā)外菱农,還額外提供第一個二級緩存之類的服務(wù)缭付,但這里面就一個最大的風險就是如果第三調(diào)整帶來的回源壓力暴增,此時你的架構(gòu)能否支撐循未,需要認真評估一下陷猫,如果成本允許,服務(wù)控制在自己手中最靠譜只厘。
第四點烙丛,使用一致性哈希(consistent hashing)做下載負載均衡:雖公司的業(yè)務(wù)的增加帶來流量的增加,一個階段后羔味,一個cache通常不能解決問題河咽,這時擴容cache就是常做的一件事,傳統(tǒng)的哈希不足就是每擴容一次赋元,哈希策略將重新分配忘蟹,大部分cache將失效,帶來的問題是后端壓力暴增搁凸。對uri進行一性能哈希負載均衡媚值,能避免增加或者減少cache引起哈希策略變化,目前大多開源的負載均衡軟件都有這個功能护糖,像haproxy都有褥芒,至于一致性哈希的最優(yōu)化,可以參考一下下圖(摘自網(wǎng)上的一張圖嫡良,表示的是怎樣的物理節(jié)點和虛擬節(jié)點數(shù)量關(guān)系锰扶,哈希最均勻)。
第五點寝受,利用CDN分發(fā)和多域名訪問入口:想要獲得好的用戶體驗坷牛,利用CDN的快速分發(fā)是有必要的,從成本上考慮可以購買使用第三方的CDN平臺很澄。多域名訪問方式京闰,大多的瀏覽器都對單個域名進行了線程并發(fā)限制颜及,采用多域名能夠加快圖片展示的速度。