摘要:雲服務提供商建構新的雲原生關系資料庫系統,專門為雲基礎架構設計,通常采用将計算和存儲分離到獨立擴充的分布式層的設計。
本文分享自華為雲社群《性能提升100倍!GaussDB(for MySQL)近資料處理(NDP)解鎖查詢新姿勢》,作者: GaussDB 資料庫。
随着企業和政府機構将其應用程式遷移到雲端,對基于雲的資料庫即服務(DBaaS)産品的需求也在迅速增長。傳統上的DBaaS産品,是雲服務提供商基于現有的資料庫軟體本身,将正常資料庫部署在雲端虛拟機上,使用的是本地或者雲存儲。這種方法易于實施,但是未能提供足夠的性能和可擴充性,而且由于需要複制資料,存儲成本也很高。
為了應對這些挑戰,雲服務提供商開始建構新的雲原生關系資料庫系統,專門為雲基礎架構設計,通常采用将計算和存儲分離到獨立擴充的分布式層的設計。這種方法具有多種優勢,包括資料庫存儲的自動擴充、按使用付費功能、跨多個AZ部署的高可靠性以及故障快速切換和恢複。這些雲原生設計還有助于減少隻讀副本的資料更新時延,并提高硬體共享和可擴充性。華為雲資料庫GaussDB(for MySQL),正是具備上述優勢的一款雲原生分布式資料庫。
由于計算和存儲節點通過網絡通信,網絡帶寬和延遲往往成為瓶頸。為了克服這一挑戰,GaussDB(for MySQL)通過從資料庫節點中去除寫頁面的操作并将檢查點操作向下推送到存儲節點,以優化與寫入相關的網絡流量。GaussDB(for MySQL)資料庫節點向存儲節點發送REDO日志,而不是資料頁。因為REDO日志(記錄對資料頁的修改)通常比修改的資料頁小得多, 是以這種方法減少了網絡流量。存儲節點(也稱為頁面存儲)能夠根據REDO日志建構資料庫頁面,并可以響應資料庫節點的請求,将頁面傳回到資料庫節點。
在傳統資料庫中,SQL執行引擎從存儲中擷取資料,并執行包括投影、謂詞計算和聚合在内的步驟。對于經常涉及大型表掃描的分析查詢,SQL執行引擎必須從存儲中讀取大量資料頁。當存儲節點與計算分離,通過網絡通訊時,大表掃描會轉化為增加的網絡流量。一個典型的例子是對一個非常大的表進行計數查詢,查詢對象表的所有頁面必須從頁面存儲池(Page stores)發送到要計數的資料庫節點,之後,資料庫節點将丢棄這些頁面中的大部分,因為緩沖區池不能裝載這麼多資料頁,這是對網絡帶寬資源的浪費。華為雲創新的NDP(Near Data Processing,近資料處理,簡稱NDP)方案解決了這一問題。
NDP的設計思路是避免在分布式系統中移動資料,并讓資料處理在其所存儲的地方進行。在雲原生資料庫中,存儲節點通常由大量性能強大的伺服器組成,這些存儲節點上的CPU資源經常使用率較低,這就為近資料處理(NDP)提供了一個絕佳的機會。
GaussDB(for MySQL)的NDP功能将標明的SQL操作下推到頁面存儲中,頁面存儲過濾掉不必要的資料,隻将比對的資料子集傳回給資料庫節點進一步處理。例如,要處理計數查詢,頁資料存儲可以計數行,并将計數而不是實際資料頁傳回到資料庫節點。這樣就避免了大量的網絡流量,使用此技術也提升了查詢響應時間。
GaussDB(for MySQL)可以将三種SQL操作推送到頁面存儲:列投影、謂詞計算和聚合。
列投影:頁面存儲通過僅保留查詢所需的列并丢棄其餘列,進而減少行的長度。
謂詞計算:頁資料存儲僅保留滿足謂詞的行,并丢棄不滿足謂詞的行。
聚合:頁面根據查詢中聚合函數的要求,将多行聚合到單行中,并丢棄原始行。
這三種SQL操作可以以任何組合出現在NDP中。例如,NDP操作可能僅包含列投影,也可能包含所有三個SQL操作。讓我們看看一個示例SQL查詢:
對于“worker”表中的每一行,頁面存儲計算謂詞“age < 40 and join_date >= date‘2010-01-01’ and join_date < date ‘2010-01-01’ + interval ‘1’ year”。如果行不滿足謂詞,則将立即丢棄。如果該行滿足謂詞,則将其聚合到sum(salary)值中,并丢棄原始行。如果頁資料存儲無法聚合行(由于某些内部處理要求),它仍然可以從行投影三列(salary, age, and join_date),并生成更窄的行。此後,原始行将被丢棄。最後,将一個顯著減少的資料集傳回到資料庫節點。
GaussDB (for MySQL)的 NDP特性架構如下圖所示。資料庫節點向頁面存儲發送NDP請求(請注意,通常有多個頁面存儲服務于每個資料庫節點),為了降低IOPS(每秒IO數),将多個頁面分組為一個NDP請求(批量頁面讀取請求),頁面存儲中的NDP運算符可以執行上述三種SQL操作,并将較小的資料集傳回到資料庫節點。資料庫節點可以是主節點,也可以是隻讀副本節點,兩者都支援NDP。
在雲原生資料庫系統中,即使資料庫節點和頁面存儲通過高速RDMA網絡連接配接,但與傳統資料庫中的本地存儲相比,延遲仍然很高,通過降低網絡IOPS和并行執行多個IO可以減少延遲帶來的負面影響。在NDP功能中,我們實作了“批處理讀取”的概念。這個想法是在B+樹葉資料節點中向前看,并将相鄰的葉資料節點分組到一個批處理請求中,而這些B+樹葉資料節點是正在進行近資料處理的查詢所需要的。批量讀取是降低IOPS的一個絕佳方法。如果我們在每個請求中發送一個頁面,那麼IO的數量将等于頁面的數量。如果我們将1000個頁面分組到一個請求中,IO的數量将減少1000倍。
下圖闡述了批處理讀取的工作原理。資料庫節點發送批量請求,SAL(存儲抽象層)辨別頁面所在的頁面存儲,并将批處理讀取拆分為多個子讀取:每個頁面存儲一個子讀取。然後,子讀取将并行發送到頁面存儲。使用這種方法,可以同時使用多個頁面存儲來服務NDP請求。
頁面存儲接收包含多個頁面的NDP請求,而這些頁面之間沒有依賴關系,是以可以使用NDP以任何順序處理。這樣既提供了靈活性,又使頁面存儲能夠将頁面配置設定給多個線程并行處理。
GaussDB(for MySQL)使用增強的SQL優化器自動判定NDP是否可能對特定查詢有利。如果有利,它将自動啟用NDP,SQL優化器檢視掃描大小等因素,以及SQL運算如果推送到頁面存儲,是否可以顯著降低資料集大小。一般來說,NDP并不有利于小掃描,例如,當可以用索引減少要掃描的資料量時。
同時,NDP也有自己的資源訴求。在資料庫節點中,NDP主要占用記憶體資源,因為它需要記憶體來儲存NDP頁面。在GaussDB(for MySQL)資料庫節點中,NDP頁面與正常頁面共享相同的記憶體池(又名緩沖區池),沒有專門為NDP保留的記憶體。這種方法的優點是,當系統中沒有NDP時,整個緩沖池可用于正常處理。但是頁面記憶體一旦被NDP操作占用,在NDP操作完成之前,不能被其他查詢使用。這就是為什麼必須控制配置設定的NDP頁數,以避免正常頁被剝奪記憶體。
并行查詢(PQ)是商業關系型資料庫系統的事實标準,為分析工作負載提供高性能支援。PQ通常采用“leader-worker”設計,要處理的表被劃分為非重疊的資料塊,并把這些資料塊配置設定給多個worker處理。每個worker都會産生中間結果,leader會累積這些結果并做進一步處理,以産生最終結果。PQ在資料庫節點中提供并行性,利用多個CPU并發處理查詢。華為雲GaussDB(for MySQL)具備PQ特性,而且NDP和PQ可以協同工作,進一步提高查詢性能。可以為PQ worker啟用NDP。PQ worker執行的一些SQL操作可以推送到頁面存儲區,通過将NDP和PQ結合,我們在GaussDB系統的資料庫節點、多個頁面存儲之間和一個頁面存儲内部這三層激活了并行處理的魔力,進一步提高查詢性能。
GaussDB(for MySQL)會自動判斷NDP是否有助于查詢,并為查詢啟用NDP。使用者需要做的就是打開系統變量“ndp_mode”。ndp_mode可以為整個資料庫打開,也可以僅為目前會話打開。要為整個資料庫打開ndp_mode,請在“set”指令中添加“global”關鍵字,如下所示:
您可以使用“explain”查詢以了解是否為查詢啟用了NDP。例如,以下是樹格式的TPC-H查詢14的解釋輸出。為LINEITEM表掃描啟用了NDP,投影和謂詞計算都會推送到資料頁面存儲區。此外,還為LINEITEM表掃描啟用了PQ。
下面是另一個例子,在LINEITEM表上的計數查詢,我們将此查詢命名為Q002。謂詞計算和聚合都會推送到頁面存儲區,PQ也已啟用。
下面我們通過在100GB的TPC-H資料庫上運作多個查詢,展示NDP和PQ如何提升查詢效率。
測試環境:
上海-1區域的華為雲GuassDB (for MySQL)
CPU:16個,記憶體:64GB,緩沖池大小:20GB
将join_buffer_size 和 sort_buffer_size增加到1MB,因為這兩個緩沖區對于哈希連接配接和排序的性能很重要
PQ并發度設定為16
下圖的y軸顯示查詢響應時間加速因子。加速因子定義:如果原始查詢時間為100秒,而啟用PQ後,查詢時間變為50秒,則加速因子應為2。
從下面的測試結果可以看出, NDP+PQ将Q002加速了100多倍。
NDP将資料庫節點和存儲節點解耦,這一特性将成為未來雲原生資料庫系統的一個标準。大型掃描在OLAP工作負載中很常見,NDP将大大提升此類操作的效率。
綜上所述,NDP可以:
減少網絡帶寬的使用量
降低網絡IOPS
同時使用多個頁資料存儲來實作NDP并行處理
提高需要大表掃描的SQL查詢的性能
降低資料庫節點的CPU使用率,使資料庫節點能夠支援更多的OLTP工作負載
點選關注,第一時間了解華為雲新鮮技術~