OPPO資料湖統一儲存技術實踐
導讀
OPPO是一家智慧終端製造公司,有著數億的終端使用者,每天產生了大量文字、圖片、音影片等非結構化資料。在保障資料連通性、實時性以及資料安全治理要求的前提下,如何低成本、高效率地充分挖掘資料價值,成為了擁有海量資料的公司的一大難題。目前業界的流行解決方案是資料湖,本文介紹的OPPO自研的資料湖儲存CBFS在很大程度上可解決目前的痛點。
▌資料湖簡述
資料湖定義:一種集中化的儲存倉庫,它將資料按其原始的資料格式儲存,通常是二進位制blob或者檔案。一個數據湖通常是一個單一的資料集,包括原始資料以及轉化後的資料(報表,視覺化,高階分析和機器學習等)
1. 資料湖儲存的價值
對比傳統的Hadoop架構,資料湖有以下幾個優點: - 高度靈活:資料的讀取、寫入和加工都很方便,可儲存所有的原始資料 - 多重分析:支援包括批、流計算,互動式查詢,機器學習等多種負載 - 低成本:儲存計算資源獨立擴充套件;採用物件儲存,冷熱分離,成本更低 - 易管理:完善的使用者管理鑑權,合規和審計,資料“存管用”全程可追溯
2. OPPO資料湖整體解決方案
OPPO主要從三個維度建設資料湖:最底層的湖儲存,我們採用的是CBFS,它是一種同時支援S3、HDFS、POSIX檔案3種接入協議的低成本儲存;中間一層是實時資料儲存格式,我們採用了iceberg;最上層可支援各種不同的計算引擎
3. OPPO資料湖架構特點
早期大資料儲存特點是流計算和批計算的儲存放在不同的系統中,升級後的架構統一了的元資料管理,批、流計算一體化;同時提供統一的互動查詢,介面更友好,秒級響應,併發度高,同時支援資料來源Upsert變更操作;底層採用大規模低成本的物件儲存作為統一的資料底座,支援多引擎資料共享,提升資料複用能力
4. 資料湖儲存CBFS架構
我們的目標是建設可支援EB級資料的資料湖儲存,解決資料分析在成本,效能和體驗的挑戰,整個資料湖儲存分成六個子系統: - 協議接入層:支援多種不同的協議(S3、HDFS、Posix檔案),可做到資料用其中一種協議寫入,用另外兩種協議也可直接讀到 - 元資料層:對外呈現檔案系統的層次名稱空間和物件的扁平名稱空間,整個元資料是分散式的,支援分片,線性可擴充套件 - 元資料快取層:用來管理元資料快取,提供元資料訪問加速能力 - 資源管理層: 圖中的Master節點,負責了物理資源(資料節點,元資料節點)以及邏輯資源(卷/桶,資料分片,元資料分片)的管理 - 多副本層:支援追加寫和隨機寫,對大物件和小物件都比較友好。該子系統一個作用是作為持久化的多副本儲存;另一個作用是資料快取層,支援彈性副本,加速資料湖訪問,後續再展開。 - 糾刪碼儲存層:能顯著降低儲存成本,同時支援多可用區部署,支援不同的糾刪碼模型,輕鬆支援EB級儲存規模 接下來,會重點分享下CBFS用到的關鍵技術,包括高效能的元資料管理、糾刪碼儲存、以及湖加速
▌CBFS關鍵技術
1. 元資料管理
檔案系統提供的是層次名稱空間檢視,整個檔案系統的邏輯目錄樹分成多層,如右圖所示,每個元資料節點(MetaNode)包含成百上千的元資料分片(MetaPartition),每個分片由InodeTree(BTree)和DentryTree(BTree)組成,每個dentry代表一個目錄項,dentry由parentId和name組成。在DentryTree中,以PartentId和name組成索引,進行儲存和檢索;在InodeTree中,則以inode id進行索引。使用multiRaft協議保障高可用性和資料一致性複製, 且每個節點集合會包含大量的分片組,每個分片組對應一個raft group;每個分片組隸屬於某個volume;每個分片組都是某個volume的一段元資料範圍(一段inode id ); 元資料子系統通過分裂來完成動態擴容;當一分片組資源(效能、容量)緊接臨近值時,資源管理器服務會預估一個結束點,並通知此組節點裝置,只服務到此點之前的資料,同時也會新選出一組節點,並動態加入到當前業務系統中。 單個目錄支援百萬級別容量,元資料全記憶體化,保證優秀的讀寫效能,記憶體元資料分片通過snapshot方式持久化到磁碟以作備份及恢復使用。 而物件儲存提供的是扁平名稱空間;以訪問objectkey為/bucket/a/b/c的物件為例,從根目錄開始,通過”/”分隔符層層解析,找到最後一層目錄(/bucket/a/b)的Dentry,最後找到的/bucket/a/b/c對於的Inode,此過程涉及多次節點間互動,層次越深,效能較差;因此我們引入PathCache模組用於加速ObjectKey解析,簡單做法是在PathCache中對ObjectKey的父目錄(/bucket/a/b)的Dentry做快取;分析線上叢集我們發現,目錄平均大小約為100,假設儲存叢集規模在千億級別,目錄條目也才10億個,單機快取效率很高,同時可通過多個節點不同來提升讀效能;在同時支援”扁平”和”層次”名稱空間管理的設計,與業界其他系統相比,CBFS實現得更簡潔,更高效,無需任何轉換即可輕鬆實現一份資料,多種協議訪問互通,且不存在資料一致性問題。
2. 糾刪碼儲存
降低儲存成本的關鍵技術之一是糾刪碼(Erasure Code, 簡稱EC),簡單介紹一下糾刪碼原理:將k份原始資料,通過編碼計算得到新的m份資料,當k+m份資料丟失任意的不多於m份時,通過解碼可還原出原始資料(原理有點像磁碟raid); 相比傳統的多副本儲存, EC的資料冗餘度更低,但資料耐久性(durability)更高;其實現也有多種不同方式,多數基於異或運算或者Reed-Solomon(RS)編碼,我們的CBFS也採用了RS編碼 計算步驟: 1、編碼矩陣,上面n行是單位陣I,下方m行是編碼矩陣;k+m個數據塊組成的向量,包含原始的資料塊和m個校驗塊 2、當某塊丟失時:從矩陣B刪除該塊對應的行,得到新的矩陣 B’,然後左邊乘上B‘的逆矩陣,即可恢復丟失的塊,詳細計算過程大家可線下閱讀相關資料 普通的RS編碼存在一些問題:以上圖為例,假設X1~X6 ,Y1~Y6為資料塊,P1和P2為校驗塊,若其中任意一塊丟失,需要讀其餘12個塊才能修復資料,磁碟IO損耗大,資料修復所需頻寬高,在多AZ部署時,問題尤為明顯; 微軟提出的LRC編碼,通過引入區域性校驗塊來解決該問題,如圖所示,在原來全域性校驗塊P1和P2的基礎上,新增2個區域性校驗塊PX和PY,假設X1損壞,只需讀取與其關聯X1~X6共6個塊即可修復資料。統計表明,在資料中心,一個條帶在一定時間內單塊盤故障的概率是98%,2個盤同時損壞的概率是1%,因此LRC在大多數場景可大幅提升資料修復效率,但缺點是其非最大距離可分編碼,無法做到像全域性RS編碼那樣損失任意m份資料能把所有的丟修復回來。
EC型別
1、離線EC:整個條帶k個數據單元都寫滿後,整體計算生成m校驗塊 2、線上EC:收到資料後同步拆分並實時計算校驗塊後,同時寫入k個數據塊和m個校驗塊
CBFS跨AZ多模式線上EC
CBFS支援了跨AZ多模式條帶的線上EC儲存,針對不同的機房條件(1/2/3AZ)、不同大小的物件、不同的服務可用性和資料耐久性需求,系統可靈活配置不同的編碼模式 以圖中“1AZ-RS”模式為例,6個數據塊加3個校驗塊單AZ部署; 2AZ-RS模式,採用了6個數據塊加10個校驗塊2AZ部署,資料冗餘度為16/6=2.67;3AZ-LRC模式,採用6個數據塊,6個全域性校驗塊加3個區域性校驗塊模式;同一個叢集內同時支援不同的編碼模式。
線上EC儲存架構
包含幾個模組 Access: 資料訪問接入層,同時提供EC編解碼能力 CM:叢集管理層,管理節點,磁碟,卷等資源,同時負責遷移,修復,均衡,巡檢任務,同一個叢集支援不同EC編碼模式並存 Allocator:負責卷空間分配 EC-Node:單機儲存引擎,負責資料的實際儲存
糾刪碼寫
1、流式收取資料 2、對資料切片生成多個數據塊,同時計算校驗塊 3、申請儲存卷 4、併發向各個儲存節點分發資料塊或校驗塊 資料寫入採用簡單的NRW協議,保證最小寫入份數即可,這樣在常態化的節點及網路故障時,請求也不會阻塞,保障可用性;資料的接收、切分、校驗塊編碼採取非同步流水線方式,也保障高吞吐和低時延。
糾刪碼讀
資料讀取也採取了NRW模型,以k=m=2編碼模式舉例,只要正確讀到2個塊(不論是資料塊還是校驗塊), 即可快速RS解碼計算得到原始資料並;此外為提升可用性和降低時延,Access會優先讀臨近或低負載的儲存節點EC-Node 可以看到,線上EC結合NRW協議為確保了資料的強一致性,同時提供保障高吞吐和低時延,很適合大資料業務模型。
3. 資料湖訪問加速
資料湖架構帶來顯著的收益之一是成本節約,但存算分離架構也會遇到頻寬瓶頸和效能挑戰,因此我們也提供了一系列訪問加速技術: 首先是多級快取能力: 1、第一級快取:本地快取,其與計算節點同機部署,支援元資料和資料快取,支援記憶體、PMem、NVme、HDD不同型別介質,特點是訪問時延低,但容量少 2、第二級快取:分散式快取,副本數目彈性可變,提供位置感知能力,支援使用者/桶/物件級的主動預熱和被動快取,資料淘汰策略也可配置 多級快取策略在我們的機器學習訓練場景有不錯的加速效果 另外儲存資料層還支援了謂語下推操作,可顯著減少儲存與計算節點間大量的資料流動,降低資源開銷並提升計算效能; 資料湖加速有還很多細緻的工作,我們也在持續完善的過程中
▌未來展望
目前CBFS-2.x版本已開源,支援線上EC、湖加速、多協議接入等關鍵特性的3.0版本預計將於2021年10月開源; 後續CBFS會增加存量HDFS叢集直接掛載(免資料搬遷),冷熱資料智慧分層等特性,以便支援大資料及AI原架構下存量資料平滑入湖。
作者簡介:
Xiaochun OPPO儲存架構師
更多精彩內容,歡迎關注[OPPO數智技術]公眾號
- OPPO在FaaS領域的探索與思考
- OPPO在FaaS領域的探索與思考
- Shuttle Alluxio 加速記憶體Shuffle起飛
- OPPO資料湖統一儲存技術實踐
- Quarkus-雲原生時代Java的曙光?
- Quarkus-雲原生時代Java的曙光?
- Shuttle:高可用 高效能 Spark Remote Shuffle Service
- Shuttle:高可用 高效能 Spark Remote Shuffle Service
- OPPO自研雲原生分散式任務排程平臺
- OPPO自研雲原生分散式任務排程平臺
- GTC 2022:GPU推理加速在OPPO NLP場景的優化落地
- OPPO雲資料庫訪問服務技術揭祕
- 全鏈路非同步Rest客戶端 ESA RestClient
- 全鏈路非同步Rest客戶端 ESA RestClient
- OPPO唐黎:零程式碼技能平臺技術實踐探索!
- MySQL 分散式事務的“路”與“坑”
- PendingIntent重定向:一種針對安卓系統和流行App的通用提權方法——BlackHat EU 2021議題詳解(上)
- AI算力加速之道
- AI算力加速之道
- 5分鐘瞭解ScyllaDB