微博圖牀架構揭祕

     在此聲明:本文轉自微博圖牀架構揭祕,覺得寫得不錯,在此轉發以擴大影響,在此對原文作者表示感謝!  

     圖片作爲微博的核心內容元素,一直在微博內容戰略中佔有非常重要的地位,特別是近幾年高質量移動拍攝終端的普及,越來越多用戶傾向於用圖在微博上表達自己的心情,態度和觀點。微博的日發博量中,帶圖微博已接近60%。去年5月,隨着微博多圖功能上線,進一步強化了多媒體內容分享的用戶體驗。
       微博圖牀作爲整體承載微博圖片內容的大規模技術平臺,擔負着微博圖片上傳,處理,存儲,下載等核心業務邏輯功能。圖牀每日接收的用戶圖片上傳已經超過3000萬,總圖片數已經超過100億,並持續保持一個高速增長的態勢。

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

圖片的上傳
       當用戶上傳一張圖片時,接收圖片的首先是我們的Upload API服務單元,與Facebook等公司做法一樣,爲保證常用圖的顯示性能,我們對常見的圖在這階段做了預壓縮,然後各種預壓縮尺寸的圖片會被保存到一個叫做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集成的可能,目標成爲一款互聯網海量圖片處理適用的圖像壓縮庫。
                            
結束語
        微博春節的技術保障是一個系統工程,涉及到從基礎設施到平臺到業務的各個層面。對於微博圖牀而言,架構方面的優化和提升,可以幫助我們在短期資源受限的情況下高效的實現業務目標,而長線上是用戶體驗的提升和成本的降低。

       在此聲明:本文轉自微博圖牀架構揭祕,覺得寫得不錯,在此轉發以擴大影響,在此對原文作者表示感謝!  


發佈了475 篇原創文章 · 獲贊 78 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章