微博圖床架構揭秘

jopen 9年前發布 | 23K 次閱讀 架構 軟件架構

微博圖床多機房部署架構

微博圖床架構揭秘

圖片作為微博的核心內容元素,一直在微博內容戰略中占有非常重要的地 位,特別是近幾年高質量移動拍攝終端的普及,越來越多用戶傾向于用圖在微博上表達自己的心情,態度和觀點。微博的日發博量中,帶圖微博已接近60%。去年 5月,隨著微博多圖功能上線,進一步強化了多媒體內容分享的用戶體驗。

微博圖床作為整體承載微博圖片內容的大規模技術平臺,擔負著微博圖片上傳,處理,存儲,下載等核心業務邏輯功能。圖床每日接收的用戶圖片上傳已經超過3000萬,總圖片數已經超過100億,并持續保持一個高速增長的態勢。

 跨IDC的分布式存儲系統

微 博圖床平臺是一個跨IDC的大規模分布式對象存儲系統,也是新浪第一個實現跨IDC多主寫入容災,以實現全網服務可用性的技術平臺。跨IDC多主寫入意味 著任意一個數據中心故障,就可以快速切換容災至其他可用數據中心。我們使用了一種內部叫做BOR的基于業務對象的復制協議,內部的最終一致性與實時代理結 合,以實現用戶端的強一致性。

微博圖床跨IDC分布架構

圖片的上傳

當 用戶上傳一張圖片時,接收圖片的首先是我們的Upload API服務單元,與非死book等公司做法一樣,為保證常用圖的顯示性能,我們對常見的圖在這階段做了預壓縮,然后各種預壓縮尺寸的圖片會被保存到一 個叫做iCache的高速緩存中。iCache是新浪自主研發基于SSD的持久化文件存儲高速緩存緩沖系統,通過兩個一致性哈稀環實現緩存的高可用。保存 iCache成功后,同時同步寫入相關異步消息語義,以實施異步的存儲Checkin和遠程的Replication。最終,圖片數據會被存儲到我們永久 的存儲單元,并復制到遠端的異地數據中心永久存儲。存儲單元使用的是新浪自主研發的notfs用戶態小文件存儲系統,以解決傳統文件系統目錄索引查詢帶來 的額外的磁盤IO開銷,吞吐是傳統方案的3倍,并能獲得一致的常量低延遲訪問。

圖片的下載

用 戶端圖片的顯示有一個龐大的全球分布的CDN網絡協助分發到用戶的最后一公里,所以圖床的圖片下載部分實際上面對的是CDN網絡的回源。當一張圖片在 CDN緩存miss的時候,請求就會落到圖床的Download API服務單元。首先,iCache會被檢查,如果存在,即可快速輸出。然后是存儲,如果存儲亦不存在,意味著復制的圖片還沒有到位,會通過專有鏈路代理 從圖片的上傳地取得圖片。這樣就保證了用戶圖片上傳即可見的強一致性。當圖片被取回后,配合業務端的呈現需求,部分圖片仍然會被實時壓縮成所需要的格式。

馬年春節的挑戰

30倍的突發峰值

微 博與春晚的合作,不僅僅給網友帶來線上線下多屏互動、紅包飛的新年,給圖床系統也是帶來前所未有的挑戰。根據業務值測算,圖床峰值上行壓力會達到日常峰值 的30倍!對于一個可擴展系統而言,擴容是不二的選擇,但對于一個已然超過1000個節點以上的大規模系統,擴容30倍,所投入的服務器絕對不是一個小數 目,即使可擴,OP層面也會是一個龐大的工程。所以,首要的是短期內架構層面改進的空間。

壓還是不壓

通 過模型和數據測算,要應對如此規模的上行壓力,首先要解決的圖片壓縮的瓶頸。圖片壓縮的過程是一個CPU和內存消耗性的耗時邏輯,如果上傳環節取消壓縮, 那自然是最優的方案,可問題是多屏時代,不同的渠道需要不同適配,對不同尺寸的需求是滿足用戶體驗的關鍵。上傳環節不壓縮,意味著下載環節將承擔更多的實 時壓縮負載,一個典型的兩端平衡問題,壓或不壓都不能解決實際問題。

流水線式處理

對 于大部分的互聯網公司,傳統的實時壓圖方案基本上都是Apache Prefork下用PHP的ImageMagick實時壓縮,整個過程IO和壓縮是在一個同步的周期內處理,導致CPU和內存資源都不可控,在高并發的情 況下,壓圖效率急劇下降。為此,我們設計了一個基于流水線的在線圖片處理系統webpress。webpress的基本原理是把圖片壓縮分stage,把 圖片的讀取和輸出這些可以異步化的IO操作與同步的壓縮過程分離開,壓圖過程的CPU和內存資源得以量化控制和分配。從我們的測試數據看,高并發的時候采 用webpress的方案,延遲保持基本穩定,而傳統的方案會有一個大幅的延遲升高,性能下降明顯(見下圖)。

小而美的圖像處理庫

對 壓圖這個重型邏輯本身的優化,也是整體得以提升的關鍵。開源的ImageMagick作為一款通用圖像處理軟件庫,天生不是為了web應用而設計的。繁復 的代碼,臭名昭著的內存和臨時文件泄漏問題,簡陋的異常處理機制等等,當然還有性能問題。為此,我們重新設計了一個輕量級的圖像壓縮庫webimg,利用 延遲解碼,JPEG預先重采樣,加法替乘法,SIMD指令優化等手段和技術,壓圖性能比ImageMagic有近4倍的提升。同時webimg沒有內存泄 漏等問題,適合長期駐留在webpress進程中運行。webimg未來會增加對GPU CUDA的支持,并考慮FPGA集成的可能,目標成為一款互聯網海量圖片處理適用的圖像壓縮庫。

結束語

微博春節的技術保障是一個系統工程,涉及到從基礎設施到平臺到業務的各個層面。對于微博圖床而言,架構方面的優化和提升,可以幫助我們在短期資源受限的情況下高效的實現業務目標,而長線上是用戶體驗的提升和成本的降低。

— 新浪研發中心 微博圖床團隊 朱鑫(@stvchu)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!