NDPQ(NDP+PQ),定義分散式資料庫新方向

語言: CN / TW / HK
摘要:雲服務提供商構建新的雲原生關係資料庫系統,專門為雲基礎架構設計,通常採用將計算和儲存分離到獨立擴充套件的分散式層的設計。

本文分享自華為雲社群《效能提升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)方案解決了這一問題。

GaussDB(for MySQL)近資料處理(NDP)詳解

NDP的設計思路是避免在分散式系統中移動資料,並讓資料處理在其所儲存的地方進行。在雲原生資料庫中,儲存節點通常由大量效能強大的伺服器組成,這些儲存節點上的CPU資源經常利用率較低,這就為近資料處理(NDP)提供了一個絕佳的機會。

GaussDB(for MySQL)的NDP功能將選定的SQL操作下推到頁面儲存中,頁面儲存過濾掉不必要的資料,只將匹配的資料子集返回給資料庫節點進一步處理。例如,要處理計數查詢,頁資料儲存可以計數行,並將計數而不是實際資料頁返回到資料庫節點。這樣就避免了大量的網路流量,使用此技術也提升了查詢響應時間。

GaussDB(for MySQL)可以將三種SQL操作推送到頁面儲存:列投影、謂詞計算和聚合。

  • 列投影:頁面儲存通過僅保留查詢所需的列並丟棄其餘列,從而減少行的長度。
  • 謂詞計算:頁資料儲存僅保留滿足謂詞的行,並丟棄不滿足謂詞的行。
  • 聚合:頁面根據查詢中聚合函式的要求,將多行聚合到單行中,並丟棄原始行。

這三種SQL操作可以以任何組合出現在NDP中。例如,NDP操作可能僅包含列投影,也可能包含所有三個SQL操作。讓我們看看一個示例SQL查詢:

sele ctsum(salary)
from worker
where age< 40 and
join_date>= date ‘2010-01-01’ and
join_date< date ‘2010-01-01’ + interval ‘1’ year

對於“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。

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頁數,以避免常規頁被剝奪記憶體。

NDPQ(NDP+PQ),釋放查詢極致效能,定義分散式資料庫新方向

並行查詢(PQ)是商業關係型資料庫系統的事實標準,為分析工作負載提供高效能支援。PQ通常採用“leader-worker”設計,要處理的表被劃分為非重疊的資料塊,並把這些資料塊分配給多個worker處理。每個worker都會產生中間結果,leader會累積這些結果並做進一步處理,以產生最終結果。PQ在資料庫節點中提供並行性,利用多個CPU併發處理查詢。華為雲GaussDB(for MySQL)具備PQ特性,而且NDP和PQ可以協同工作,進一步提高查詢效能。可以為PQ worker啟用NDP。PQ worker執行的一些SQL操作可以推送到頁面儲存區,通過將NDP和PQ結合,我們在GaussDB系統的資料庫節點、多個頁面儲存之間和一個頁面儲存內部這三層激活了並行處理的魔力,進一步提高查詢效能。

如何啟用NDP?

GaussDB(for MySQL)會自動判斷NDP是否有助於查詢,併為查詢啟用NDP。使用者需要做的就是開啟系統變數“ndp_mode”。ndp_mode可以為整個資料庫開啟,也可以僅為當前會話開啟。要為整個資料庫開啟ndp_mode,請在“set”命令中新增“global”關鍵字,如下所示:

set[global] ndp_mode = on

您可以使用“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工作負載

 

點選關注,第一時間瞭解華為雲新鮮技術~