百度搜尋內容HTAP表格儲存系統

架構師修行手冊發表於2023-12-04

來源:百度Geek說

作者 | Chaos

導讀 
introduction
本文主要介紹百度搜尋內容儲存團隊應對海量網際網路資料分析計算需求時,在構建HTAP表格儲存系統方向上的一些技術思考。

全文4683字,預計閱讀時間12分鐘。


GEEK TALK

01

業務背景

百度搜尋內容儲存團隊主要負責各類資料,如網頁、圖片、網頁關係等,的線上儲存讀寫(OLTP)、離線高吞吐計算(OLAP)等工作。

原有架構底層儲存系統普通採用百度自研表格儲存(Table)來完成資料的讀、寫、存工作,此儲存系統更偏向於OLTP業務場景。隨著近幾年大資料計算、AI模型訓練的演進,對儲存系統OLAP業務場景的依賴越來越重,如資料關係分析、全網資料分析、AI樣本資料管理篩選。在OLTP儲存場景的架構下,支援OLAP儲存需求對資源成本、系統吞吐、業務時效帶來了巨大挑戰。為此我們在百度自研表格儲存之外,結合業務實際workflow針對性最佳化,增加構建了一套符合業務需求的HTAP表格儲存系統。

以下我們將主要介紹在百度內容HTAP表格儲存系統設計落地中的一些技術思考,文中的優劣歡迎各位積極交流探討。


GEEK TALK

02

儲存設計

2.0 需求分析

整套儲存設計需要解決的核心問題是——如何在OLTP儲存系統中支援OLAP workflow?OLAP workflow在OLTP儲存系統上帶來的兩個最主要的問題是:嚴重的IO放大率、存算耦合。

  • 嚴重的IO放大率。IO放大率主要來自兩方面,如下圖,資料行篩選、資料列篩選。

  • 資料行篩選。在表格儲存中,資料按照主鍵從小到大排列,OLAP workflow根據條件篩選過濾出符合條件的資料行,會帶來嚴重的IO放大。

  • 資料列篩選。表格儲存是寬表結構,業務在一次查詢中只會獲取部分列,但資料是以行結構儲存,需要獲取整行再提取出需要的欄位,依舊會帶來嚴重的IO放大。

百度搜尋內容HTAP表格儲存系統

△圖2.1

  • 存算耦合。存算耦合主要來自兩方面,如下圖,儲存節點資源冗餘、儲存空間放大。

  • 儲存節點資源冗餘。在一個儲存節點中,OLTP vs OLAP佔用的計算資源佔比是3:7,為滿足OLAP需要,就需要對儲存節點進行擴容,然而儲存節點的擴容又不僅僅是計算資源。同時,OLAP任務是間歇性的,就會造成忙時供給不足,閒時資源冗餘等情況。

  • 儲存空間放大。為支援每一個OLAP任務的資料訪問,儲存引擎需要為每一個workflow建立對應的Snapshot,保證workflow完成前所依賴的所有資料檔案均有效。當OLAP workflow耗時過長時,會導致Compaction後資料檔案無法及時清理的情況,造成儲存空間放大。

百度搜尋內容HTAP表格儲存系統

△圖2.2 Node

2.1 架構設計

百度搜尋內容HTAP表格儲存系統

△圖2.3

1.架構採用業界HTAP主流設計思想,將OLTP和OLAP workflow拆分到兩套儲存系統中,如F1 Lightning、ByteHTAP,在SDK層根據任務型別分發到不同的儲存系統中。

2.OLTP儲存系統——Neptune,採用Multi-Raft分散式協議組建儲存叢集,採用本地磁碟(SSD/HDD等) + 百度分散式檔案系統AFS組成儲存介質。

3.OLAP儲存系統——Saturn,Serverless設計模式,無常駐Server,即用即載入,貼合OLAP workflow的不確定性和間歇性。

4.OLTP與OLAP儲存系統間,採用資料檔案硬鏈的方式進行資料同步,全版本替換,成本低、速度快,充分貼合Saturn Serverless設計模式。

如上架構設計圖,可將OLTP與OLAP workflow拆分到兩套獨立的系統中,解決上述提到的存算耦合問題。

  • 解決儲存空間放大問題。空間放大主要帶來的問題是儲存節點成本,Workflow分離的架構將OLAP需要的資料檔案採用AFS低成本儲存,減少了對儲存節點儲存空間的壓力。

百度搜尋內容HTAP表格儲存系統

△圖2.4

OLAP儲存系統的資料寫入並沒有使用常見的log redo或raft learner模式,最主要還是在保證OLAP儲存系統的Serverless特性的同時,又能實時感知到OLTP系統的最新寫入結果。

  • 解決儲存節點資源冗餘問題。拆分後,分散式儲存節點將大量重型OLAP workflow轉移到OLAP儲存——Saturn中,將極大減少儲存節點的計算壓力。同時,OLAP儲存的Serverless設計模式又可貼合workflow的不確定性和間歇性。

百度搜尋內容HTAP表格儲存系統

△圖2.5 Saturn Serverless模型

計算節點可以部署在任意計算叢集中,如Map-Reduce、自研計算節點Pioneer等,在SDK中直接初始化儲存引擎,從AFS中訪問對應分片的資料檔案。計算節點可充分利用雲原生系統(PaaS)的彈性資源,解決資源常駐冗餘問題。

2.2 儲存引擎最佳化思路

結合上面的分析以及設計思路,已有效地解決了存算耦合問題。在本節中,我們將重點介紹解決IO放大率問題的一些最佳化思路。


2.2.1 資料行分割槽

資料行分割槽思想在很多OLAP儲存系統中很常見,如當前比較流行的一些資料湖架構,ClickHouse、IceBerg等。在表格儲存中,資料行分割槽的好處是可以極大減少在資料行篩選過程中IO放大率。以下是我們在儲存引擎中支援資料行分割槽的設計思路:

百度搜尋內容HTAP表格儲存系統

△圖2.6

資料行分割槽的思想在OLTP和OLAP儲存引擎中都有使用,OLTP儲存引擎以資料行分割槽構建的資料檔案可直接被OLAP儲存引擎載入,減少了OLAP儲存的資料構建工作。

資料行分割槽在Write、Read、Scan場景下的處理流程分別為:

1.Write操作。Write時會根據請求中的特殊Region描述,如分割槽鍵,找到需要寫入的Region-Index和Region上下文,前者儲存Key的分割槽索引資訊,後者中儲存實際資料,操作記錄由WAL中儲存。

2.Read操作。Read操作相比通常直接訪問資料,需要多進行一次分割槽索引訪問,為減少多一次訪問帶來的效能折損,我們將分割槽索引資訊全記憶體化。由於索引資料非常小,因此全記憶體化是可接受的。

3.Scan操作。Scan操作相比之下沒有任何變更,但在Scan特殊分割槽場景下可大量減少IO放大。因為相比之前的行過濾模式,可直接跳過大量不需要的資料。

在業務儲存支援時,合理設定資料行分割槽,可極大減少資料行篩選過程中的IO放大率。


2.2.2 增量資料篩選

在實際業務中,有很大一個場景時獲取近期(如近幾個小時、近一天)有值變化的資料,常規的做法是Scan全量資料,以時間區間作為過濾條件,篩選出符合條件的結果。但如此的篩選邏輯會帶來嚴重的IO放大,因為滿足條件的結果只佔全量結果的一小部分。為此,我們在引擎層調整最佳化Compaction時機以及調整篩選流程,減少增量資料篩選過程中需要訪問的資料檔案集合,降低IO放大,業務提速。

百度搜尋內容HTAP表格儲存系統

△圖2.7 LSMT


2.2.3 動態列結構

在OLAP儲存引擎中,還存在一類訪問場景會帶來IO放大問題,資料列篩選。在表格儲存系統中,一個Key可以包含多個列族(Column Family),一個列族中可以包含任何多個資料欄位,這些欄位以行結構儲存在同一物理儲存(Locality Group)中,當篩選特定資料列時,需要進行整行讀取,然後過濾出需要的欄位,這也將帶來IO放大問題。

同時,OLAP workflow的訪問不確定性導致儲存層無法及時調整資料在物理儲存中的結構。為此,我們引入動態列結構的概念,在邏輯層對業務透明,在物理層根據近期OLAP workflow特性及時調整物理結構。

百度搜尋內容HTAP表格儲存系統

△圖2.8

如上圖,在邏輯儲存中,分為兩個LG,根據workflow特性,把業務常用的訪問欄位在Compaction階段存放在同一物理儲存結構中,反之,這樣可以減少欄位篩選階段的IO放大率。

動態列結構只在OLAP儲存引擎中生效,我們在原有OLAP儲存中引入workflow收集以及compaction任務,將從OLTP儲存中同步的資料構建成更適合OLAP場景的儲存結構。


GEEK TALK

03

計算與排程

在本節,我們將介紹在此HTAP表格儲存系統基礎上,如何設計實現任務計算和排程系統,簡化業務使用成本,提升業務效率。

在大量搜尋內容OLAP workflow中,從表格儲存系統中提取篩選資料只佔全部任務的一小部分,大量任務需要對資料進行加工處理得到需要的結果。常規的做法是多工串聯,這樣做的缺陷是大量中間臨時資料儲存開銷。

為此我們為HTAP表格儲存系統構建了一套計算與排程系統,系統兩大特點:任務開發SQL化、資料處理FaaS化。

3.1 SQL化與FaaS化

我們充分貼合上述儲存系統特性,自研了一套資料查詢語言——KQL,KQL類似於SQL Server語法。同時,又結合儲存系統特性以及計算框架,支援一些特殊語言能力,最主要的是能支援原生FaaS函式定義,當然也支援外部FaaS函式包依賴。

如下是一段KQL語句例子以及說明:























function classify = { #定義一個Python FaaS函式def classify(cbytes, ids):    unique_ids=set(ids)    classify=int.from_bytes(cbytes, byteorder='little', signed=False)    while classify != 0:        tmp = classify & 0xFF        if tmp in unique_ids:            return True        classify = classify >> 8    return False}
declare ids = [2, 8];declare ts_end = function@gettimeofday_us();      # 呼叫Native Function獲取時間declare ts_beg = @ts_end - 24 * 3600 * 1000000;   # 四則運算
select * from my_table region in timeliness       # 利用儲存分割槽特性,從my_table中的timeliness分割槽獲取資料where timestamp between @ts_beg and @ts_end       # 利用儲存增量區間特性,篩選增量資料    filter by function@classify(@cf0:types, @ids) # 在Filter階段呼叫自定義FaaS函式    convert by json outlet by row;desc:                                             # 對計算框架進行特殊描述    --multi_output=true;

3.2 任務生成與排程

百度搜尋內容HTAP表格儲存系統

1.任務生成。在任務生成階段將KQL語句解析最佳化成相關的排程任務,一個Job包含多個Task。

2.任務排程。

  • 任務排程的計算節點可以是Map-Reduce,也可以是自研計算叢集Pioneer,負責不同計算場景。

  • 任務執行容器負責資料依賴部署和執行計算框架。

  • 計算框架採用外掛化設計思想,依託KQL語言進行差異化描述。計算框架的最大特點是,可在資料處理節點執行使用者自定義FaaS函式。

GEEK TALK

04

總結

當前HTAP表格儲存系統已在全網網頁資料離線加速、AI模型訓練資料管理、圖片儲存以及各類線上離線業務場景落地,資料儲存規模達>15P,業務提速>50%。

與此同時,隨著大模型時代的到來,對儲存系統帶來了更多的挑戰,我們也將繼續深度最佳化,設計更高效能、高吞吐的HTAP表格儲存系統。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027824/viewspace-2998590/,如需轉載,請註明出處,否則將追究法律責任。

相關文章