七牛數據處理架構變遷

jopen 9年前發布 | 8K 次閱讀 架構
 

七牛數據處理架構變遷

據統計,互聯網數據量正以每三年翻一番的速度膨脹,其中,95%以上都是非結構化數據,且這個比例仍在不斷提升。如今,互聯網已全面覆蓋大家生 活的方方面面,每個人的消費行為、娛樂行為和社交行為都將產生海量的圖片、音視頻、網絡日志等非結構化數據。非結構化數據的持續在線及數據種類的多樣對數 據的處理提出了很高的要求。作為國內最專業的數據管理平臺,七牛已覆蓋國內50%以上的互聯網用戶。那么,七牛數據處理架構都經過了哪些演變呢?小編帶你 一探究竟。

七牛云存儲的數據處理主要分為實時處理和異步處理,對于較小的文件(如圖片),一般推薦使用實時處理的方式。

對于實時處理,用戶可簡單通過URL對已有的文件進行實時處理。當用戶將文件上傳到七牛KODO對象存儲平臺,會得到相應的key,可通過URL訪問。例如 http://xxx.com/key ,當需要對該文件進行實時處理時,可以通過 http://xxx.com/key?<fop>/<param1_value>/<param2_name>/<param2_value>/…. 進行處理。具體操作參數可以參考七牛官方文檔。參數過多過長時可以設置樣式,若涉及操作復雜多變可以采用管道技術。

異步請求可以通過Portal、命令行工具、SDK發起請求。一般適合處理較大文件,比如較大的音視頻,這種情況下實時響應的效果并不理想,則 可以采用異步持久化處理方式,返回的結果是處理后的文件在七牛云存儲中的相關元信息(bucket、key等),用戶可以通過設置回調服務器地址,將結果 POST到自己的接收服務器,也可以主動查詢數據處理狀態和結果信息。

七牛數據處理架構變遷

上圖描述了簡單的實時處理的基本架構,用戶可以通過七牛云存儲的I/O入口發起請求,判斷出是合法的數據處理請求后,就會將其傳給數據處理調度 服務,通過調度分發給計算處理集群。每個worker處理的流程為參數檢查->下載數據->結合原數據信息對參數進行檢查(若數據的相關信息 不需要download下來就可以獲取,那么可以和前面的步驟對調)->自己編寫算法實現或者調用工具對數據進行處理,比如轉碼、圖像縮略等操作 ->結果返回(異步請求一般會持久化保存,通過對象存儲服務,將結果上傳,得到文件上傳后的相關信息,例如bucket、key等,返回的是文件的 相關信息)。這里可以簡單的把數據處理調度看做負載均衡器,請求根據接口判斷,通過調度指向對應服務,然后將結果原路返回給用戶。

上面的結構簡單清晰,但同時面臨幾個問題:

  • 數據處理調度這個服務相對比較重,它不僅僅需要實現負載均衡,還需要對所有處理終端服務進行管理,單臺計算型服務器上可能有多個服務worker(多個圖片處理、音視頻處理服務worker),隨著業務發展,管理的worker數量是非常多的。
  • 內部實現緩存機制,使得讀寫緩存的流量全部集中在數據處理調度這個服務。
  • 數據的處理離不開原數據,一般我們可以在worker中待前面的步驟順利通過后,調用七牛的對象存儲服務開始下載,那么每個 worker都必須配置對象存儲服務的地址信息,然后才能download原數據,這套地址信息對所有worker都是共用的。前面提到1臺物理機器上可 能有多個服務worker,每個worker自身有不同的屬性參數(最起碼端口號不同),而且可能機器上的服務worker有Image Worker也有Video Worker,共用一套配置顯然不能滿足,若每個worker都將這些普遍共用的信息寫入配置,那么維護起來非常不方便。因此,七牛的數據處理架構有了一 些演變,就有了如下的架構。

七牛數據處理架構變遷

首先,將Data Cache獨立出來,理由非常簡單,在很多環節都需要緩存服務,并且根據緩存數據大小、熱度選擇是SSD或者HDD進行緩存,小文件且熱度高適合SSD,大文件且熱度較低適合HDD。

其次,為每臺服務器添加了agent服務。一臺服務器可能有多個worker且可能是不同種的worker,數據處理調度服務只需要知道該請求 的對應worker存在于哪些機器即可,剩下的判斷則交由agent處理。因為整個計算集群的服務器存在性能差異,采用權重輪詢調度,這時某個 worker對應所在的機器一目了然,也不需要對worker整體標記序號,只需要知道某臺服務器有哪些worker。agent可以承擔 download原數據的責任,相當于提取各個worker的一些公共操作都可以都交給Agent,同時,agent分擔了向Data Cache寫入數據的任務。

值得一提的是,對于返回失敗的數據也可以緩存。假如請求量巨大,每天100億條請求,確認是客戶端請求信息不當的錯誤約占5%,那么就有5億錯 誤請求,即使服務迭代升級,也會保持原有接口功能不變。那么,若是同一個文件的同一個錯誤請求,基本上必然重現,這樣的請求實際上就可以被緩存,一來用戶 那邊獲得快速響應,二來減少計算壓力而且減少拖取數據的流量。后來發現這個方案存在一個瑕疵,就是給Data Cache造成的壓力略微變大,且有部分錯誤請求響應并沒有加快,至少為了獲得緩存數據而讀盤會有時間消耗。先前worker的設計是檢查參數是否合法 ->download數據->結合原數據信息檢查參數是否合法。這里我們對錯誤請求做了細化,單獨屏蔽了download數據之前所產生的錯 誤請求,因為這部分響應非常快,本身也沒有多少計算,無需寫入緩存。

最后,通過Discover服務來監控服務情況的變化,所有的agent和worker都需要向Discover上報心跳狀態,Load Balancer會從Discover讀取各個服務狀態、服務相關信息(地址、權重等),同時允許人工通過Discover修改各個服務的狀態。

異步請求的架構,則是在整個實時處理架構前面加上異步隊列服務、異步請求狀態服務等,每個worker的處理結果需要持久化,返回的是結果文件持久化保存后的相關信息。

現在的整個數據處理架構,看上去中規中矩,同時也存在一些弊端,即使做到了可以對單條請求大致消耗資源的預估,經過多次數據回滾壓力測試以及峰 值比對確定一臺服務器應該部署多少個worker,實現較為合理的調度,但機器上的worker數量基本上是固定的,無法跨機器實現彈性的實時調度,服務 器的資源仍然不能充分利用。例如,當實時處理服務的機器在非峰值階段,可以將異步請求的服務worker遷移到該機器上,分擔一部分任務,使得每臺機器的 負載較為均衡;當實時請求到達峰值的時候,可以遷移部分worker到處理公有隊列異步請求的機器(付費的私有隊列用戶不受影響),分擔部分壓力。

七牛數據處理架構變遷 七牛數據處理架構變遷

因此,七牛后續將會對整個數據處理的架構做一些關于Container的嘗試,希望打破原有的一些束縛,帶來比較好的效果,可以把agent和 worker放在一個Container內部,成為1:1的關系。Container自身具有隔離性,可以依據系統的資源情況選擇這臺機器有多少 Container運行。當某一臺服務器資源已經接近飽和時,就會在下一臺服務器上啟動一個新的Container繼續接收請求。一旦某臺服務器空閑下 來,那么這臺服務器就屬于Container待運行的機器,整個計算服務器集群就是個資源池,worker無需被機器束縛,哪里空閑就啟動在哪里,再也不 用擔心機器資源浪費了。

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