性能提升100倍GaussDB(for MySQL)近數據處理(NDP)解鎖查詢新姿勢

      網友投稿 806 2022-05-30

      業務增長對數據庫吞吐量和響應能力提出新挑戰

      隨著企業和政府機構將其應用程序遷移到云端,對基于云的數據庫即服務(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,緩沖池大?。?0GB

      性能提升100倍!GaussDB(for MySQL)近數據處理(NDP)解鎖查詢新姿勢

      將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工作負載

      數據倉庫服務 GaussDB(DWS) 上云必讀 MySQL 數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:什么是Python全局解釋器鎖(GIL)?
      下一篇:Vue之Vue Router要點梳理
      相關文章
      亚洲VA中文字幕无码一二三区| 奇米影视亚洲春色| 亚洲精品线在线观看| 亚洲精品无码成人AAA片| 色婷婷亚洲一区二区三区| 亚洲国产精品无码第一区二区三区| 亚洲乱码中文字幕小综合| 亚洲人成高清在线播放| 亚洲一区二区三区在线网站| 亚洲午夜久久久久久尤物| 亚洲国产高清美女在线观看| 91亚洲精品麻豆| 亚洲国产成AV人天堂无码| 亚洲大香人伊一本线| 亚洲六月丁香婷婷综合| 亚洲欧洲春色校园另类小说| 亚洲欧洲春色校园另类小说| 亚洲国产午夜电影在线入口| 成人亚洲国产va天堂| 亚洲中文字幕精品久久| 亚洲成AV人影片在线观看| 亚洲Av永久无码精品黑人| 国产亚洲综合一区二区三区| 亚洲成人高清在线| 亚洲熟妇无码八AV在线播放| 国产精品国产亚洲精品看不卡| 久久99国产亚洲精品观看| 久久久国产精品亚洲一区| 亚洲校园春色小说| 77777午夜亚洲| 亚洲AV无码之国产精品| 亚洲精品无码av天堂| 亚洲人JIZZ日本人| 亚洲视频一区调教| 亚洲人成激情在线播放| 亚洲精品国产高清在线观看| 国产亚洲综合视频| 亚洲综合AV在线在线播放| 老司机亚洲精品影院无码| 亚洲国产电影在线观看| 成人婷婷网色偷偷亚洲男人的天堂|