1. 程式人生 > 其它 >阿里雲資料庫開源重磅釋出:PolarDB HTAP的功能特性和關鍵技術

阿里雲資料庫開源重磅釋出:PolarDB HTAP的功能特性和關鍵技術

簡介:在3月2日的阿里雲開源 PolarDB 企業級架構釋出會上,阿里雲 PolarDB 核心技術專家嚴華帶來了主題為《PolarDB HTAP詳解》的精彩演講。在PolarDB儲存計算分離架構的基礎上,我們研發了基於共享儲存的MPP分散式執行引擎,解決了單條SQL執行時無法利用其它節點計算資源、無法發揮共享儲存池的IO大頻寬的問題,同時提供了彈性計算,彈性擴充套件的保障,使得PolarDB初步具備了 HTAP 的能力。本議題主要介紹PolarDB HTAP的功能特性和關鍵技術。

在3月2日的阿里雲開源 PolarDB 企業級架構釋出會上,阿里雲 PolarDB 核心技術專家嚴華帶來了主題為《PolarDB HTAP詳解》的精彩演講。在PolarDB儲存計算分離架構的基礎上,我們研發了基於共享儲存的MPP分散式執行引擎,解決了單條SQL執行時無法利用其它節點計算資源、無法發揮共享儲存池的IO大頻寬的問題,同時提供了彈性計算,彈性擴充套件的保障,使得PolarDB初步具備了 HTAP 的能力。本議題主要介紹PolarDB HTAP的功能特性和關鍵技術。

直播回顧視訊:開源PolarDB企業級架構重磅釋出-阿里雲
PDF下載: 檔案下載-阿里雲開發者社群

以下根據釋出會演講視訊內容整理:

一、背景

很多PolarDB 的使用者都有 TP 和 AP 共用的需求,他們白天使用 PolarDB處理高併發的 TP 請求,晚上 TP 流量下降、機器空閒後繼續使用 PolarDB 進行 AP 的報表分析。但是,即使這樣,依然沒有最大化利用空閒機器資源。

因為原生的 PolarDB PG 系統在處理複雜的 AP 查詢時會遇到兩大挑戰:首先,單個 SQL 在原生 PG 執行引擎下只能在單個節點上執行,無論是單機序列還是單機並行,都無法利用其他節點的 CPU memory 等計算資源,只能縱向 Scale Up,不能橫向 Scale Out ;其次,PolarDB 底層是儲存池,理論上 IO 吞吐是無限大的。而單個 SQL 在原生 PG 執行引擎下只能在單個節點上執行,受限於單個節點的 CPU 和 memory 的瓶頸,無法充分發揮儲存側大 IO 頻寬的優勢。

為了解決使用者實際使用中的痛點,PolarDB 決定做 HTAP。 當前業界HTAP的解決方案主要有以下三種:

① TP 和 AP 在儲存計算上都分離,能夠實現TP和AP完全隔離,互不影響。但實際使用中會存在一些問題。首先,TP的資料需要匯入到AP系統中,會存在一定的延遲,導致時效性不高;其次需要增加冗餘的 AP 系統,總成本也會增加;第三,增加了一套 AP 系統後,運維難度也會增加。

② TP 和 AP 在儲存計算上都共享,這樣可以做到成本最小化,資源利用最大化,但仍然存在兩點問題。首先,由於計算共享, AP 查詢和 TP 查詢同時執行時或多或少會存在相互影響;其次,當 AP 查詢比重增大時,系統需要擴計算節點儲存,因此需要重分佈,導致無法快速彈性Scale Out。

③ TP 和 AP 在儲存上共享,在計算上分離。PolarDB 是儲存計算分離架構,因此天然支援此方案。

二、原理

基於 PolarDB 儲存計算分離的架構。我們研發了分散式 MPP 執行引擎,提供了跨機並行執行、彈性計算彈性擴充套件的保證,使得 PolarDB 初步具備了 HTAP 的能力。

上圖右是 PolarDB HTAP 的架構圖。底層是池化了的共享儲存,TP 和 AP 共享一套儲存資料,在降低成本的同時能提供毫秒級的資料新鮮度,還提供了快速擴容計算節點的能力,這也是 PolarDB HTAP 第一個特性。

上層是讀寫分離的計算節點。PolarDB 具備兩套執行引擎來處理 HTAP 查詢,其中單機執行引擎在讀寫節點上進行處理高併發的 TP 查詢,分散式 MPP 執行引擎在只讀節點上處理複雜的 AP 查詢,TP和 AP 的查詢天然進行了物理隔離,解耦了 TP 和 AP 的計算環境,杜絕了 CPU 和 memory 的相互影響,這是 PolarDB HTAP 的第二大特性:TP/AP物理隔離 。

PolarDB HTAP 的第三大特性是 Serverless 彈性擴充套件,消除了傳統 MPP 資料庫 coordinate 的單點限制,可以在任何一個只讀節點上發起 MPP,可以彈性調整 MPP 節點範圍以及單機並行度,同時支援 Scale Out、Scale Up 。此處的彈性調整是及時生效的,並不需要進行資料重分佈。

消除傾斜是 PolarDB HTAP 的第四大特性。PolarDB HTAP 在充分考慮 PG BufferPool 親和性的基礎上,能夠消除資料傾斜和計算傾斜,實現能者多勞的排程。

PolarDB HTAP 原理的核心是分散式 MPP 執行引擎,它是典型的火山引擎。 AB 兩張表先做 join 再做聚合輸出,這也是 PG 單機執行引擎的執行流程。

在傳統的 MPP 執行引擎中,資料被打散到不同的節點上,不同節點上的資料可能具有不同的分佈屬性,比如雜湊分佈、隨機分佈、複製表分佈等。傳統的 MPP 執行引擎會針對不同表的資料分佈特點,在計劃中插入運算元來保證上層運算元對資料的分佈特徵無感知。

PolarDB 是共享儲存架構,底層共享的資料可以被各個計算節點全量訪問。如果使用傳統的 MPP 執行引擎,每個 Worker 都會掃描全量資料,會產生重複的資料,同時也沒有起到掃描時分治加速的效果,並不算真正意義上的 MPP 引擎。

因此,在在 PolarDB 分散式 MPP 執行引擎中,我們借鑑了火山模型論文的思想,對所有掃描運算元進行併發處理,引入了PxScan運算元來遮蔽共享儲存。PxScan運算元將 share-storage 的資料對映為 share-nothing 的資料,通過 Worker之間的協調,將目標表劃分為多個虛擬分割槽資料塊,每個 Worker 掃描各自虛擬分割槽資料塊,從而實現了跨機分散式並行scan。

PxScan運算元掃描出來的資料會通過 shuffle 運算元來重分佈,再在每個 Worker 上如同執行單機一樣,按照火山模型來執行。

以上就是PolarDB 分散式 MPP 執行引擎的核心:shuffle 運算元遮蔽資料分佈,PxScan 運算元遮蔽共享儲存。

傳統 MPP 只能在指定節點發起 MPP 查詢,因此每個節點上都只能有單個 Worker 掃描一張表。為了支援雲原生下 serverless彈性擴充套件的需求,我們引入了分散式事務一致性保證。

首先,任意選擇一個節點作為 coordinator節點,它的 ReadLSN 會作為約定的 LSN,從所有 MPP 節點的快照版本號中選擇最小的版本號作為全域性約定的快照版本號。通過 LSN 的等待回放和 Global Snaphot 同步機制,確保在任何一個節點發起 MPP 查詢時,資料和快照均能達到一致可用的狀態。

為了達到 serverless 的彈性擴充套件,我們還基於共享儲存的特點,將 coordinator節點全鏈路上各個模組需要的外部依賴都放至共享儲存上。各個 Worker 節點執行時需要的引數也會通過控制鏈路從 coordinator 節點同步過來,從而使 coordinator 節點和 Worker 節點全鏈路無狀態化。

基於以上兩點設計,PolarDB的彈性擴充套件具備了以下幾大優勢:

① 任何節點都可以成為coordinator 節點,解決了傳統 MPP 資料庫 coordinator 的節點單點問題。

② PolarDB 可以橫向 Scale Out (算力彈性擴充套件),也可以縱向 Scale Up (單機並行度彈性擴充套件),並且彈性擴充套件是及時生效的,不需要重分佈資料。

③ 允許業務有更多的彈性排程策略,不同的業務閾可以執行在不同的節點集合上。如上圖右側所示,業務域 SQL 1 可以選擇 RO1 和 RO2 節點來執行 AP 查詢,業務域 SQL 2 可以選擇使用RO3 和 RO4 節點來執行 AP 查詢。兩個業務域使用的計算節點可以實現彈性排程。

傾斜是傳統 MPP 固有的問題,其原因主要是資料分佈傾斜和資料計算傾斜。資料分佈傾斜通常由資料打散不均衡導致,在 PG 中還會由於大物件 toast 表儲存引入一些不可避免的資料分佈不均衡問題;計算傾斜通常由於不同節點上併發的事務、 buffer 、網路、 IO 抖動導致。傾斜會導致傳統 MPP 在執行時的木桶效應。

PolarDB 設計實現了自適應掃描機制。如上圖右所示,採用coordinator節點來協調Worker節點詢問的工作模式。在掃描資料時,coordinator節點會在記憶體中建立一個工作管理員,根據掃描任務對 Worker 節點進行排程。coordinator節點內部分為兩個執行緒,data執行緒主要負責服務資料鏈路、收集彙總元組,control執行緒負責服務控制鏈路、控制每一個掃描運算元的掃描進度。

掃描塊的 Worker 能夠掃描多個數據塊,實現能者多勞。比如上圖中 RO1 與RO3 的 Worker 都各自掃描了4個數據塊, ROI2由於計算傾斜可以掃描更多資料塊,因此它最終掃描了 6 個數據塊。

PolarDB 自適應掃描機制還考慮了 PG BufferPool 的親和性,保證每個 Worker 儘量掃描固定的資料塊,從而最大化命中BufferPool中的快取,降低 IO 開銷。

三、功能特性

經過持續迭代的研發,目前 PolarDB HTAP 在支援 Parallel Query 上支援的功能特性主要有五大部分:

① 基礎運算元全支援。不僅包括 scan 類運算元、Join類、聚合類,還包括 SubqueryScan、HashJoin 等。

② 共享儲存運算元優化。包括 shuffle 運算元共享、ShareSeqScan 共享、 ShareIndexScan等。其中ShareSeqScan 共享、 ShareIndexScan共享是指在大表 join 小表時,小表採用類似於複製表的機制來減少廣播開銷,進而提升效能。

③ 分割槽表支援。不僅包括對Hash/Range/List三種分割槽方式的完整支援,還包括對多級分割槽靜態裁剪、分割槽動態裁剪的支援。除此之外,PolarDB 分散式 MPP 執行引擎還支援分割槽表的Partition Wise Join。

④ 並行度彈性控制。包括全域性級別、表級別、會話級別、查詢級別的並行度控制。

⑤ Serverless 彈性擴充套件。不僅包括任意節點發起 MPP、MPP 節點範圍內的任意組合,還包括叢集拓撲資訊的自動維護,以及支援共享儲存模式、主備庫模式、三節點模式。

既然是 HTAP ,則必然不能缺少對 DML 的 MPP 支援。基於 PolarDB讀寫分離架構和 HTAP serverless 彈性擴充套件的設計, PolarDB parallel DML支援一寫多讀、多寫多讀兩種特性。一寫多讀是指在 RO節點上有多個讀 Worker ,但在 RW節點上只有一個寫 Worker ;多寫多讀是指在 RO 節點上有多個讀 Worker ,在 RW節點上也有多個寫 Worker 。多寫多讀場景下,讀的併發度和寫的併發度是完全解耦的。不同的特性適用不同的場景,使用者可以根據自己的業務特點來選擇不同的PDML功能特性。

PolarDB 分散式 MPP執行引擎,不僅可以用於 query 和 DML ,還可以用於索引構建加速。ALTP業務中有大量的索引,而索引建立過程大約有 80% 的時間消耗在排序和構建索引頁上,20%消耗在寫索引頁上。如右上圖, PolarDB 利用 RO 節點進行資料分散式 MPP 加速排序,採用流程化的技術來構建索引頁,採用批量寫入技術來提高索引頁的寫入速度。

目前構建索引加速這一特性中,PolarDB 已經對常用 B 樹索引的普通建立以及 B 樹索引的線上建立兩種功能進行了支援。

通過上圖與PolarDB原生的單機並行進行對比,可以看出分散式MPP的優勢所在。我們使用線上 PolarDB 16g 和 256g 記憶體的 16 個 RO 例項,搭建了 1 TB 的 TPCH 環境進行測試對比。相比單機並行,分散式 MPP 並行充分利用了所有 RO 節點的計算資源和底層共享儲存 RO 頻寬,從根本上解決了前文提到的 HTAP 挑戰。在 TPCH 22 條 SQL 中,有 3 條 SQL 加速了 60 多倍,19條 SQL 加速了 10 多倍,平均加速 23 倍。此外,我們也測試了彈性擴大給計算資源帶來的變化。通過增加 CPU 總核數,從 16 核增加到 128 核, TPCH 的總運營時間線性提升,每一個 SQL 也呈線性提升,這也驗證了 PolarDB HTAP serverless 彈性擴充套件的特性。

測試中發現,當 CPU 的總核數增加到 256 核時,效能提升並不大。原因是此時 PolarDB 共享儲存的 IO 頻寬已經打滿,成為了瓶頸。這也從側面說明了 PolarDB 分散式 MPP 執行引擎的計算能力是非常強的。

此外,我們將 PolarDB 的分散式 MPP 與傳統資料庫的 MPP 進行了對比,同樣使用 16g 和 256g 記憶體的 16 個節點。 1 TB 的 TPCH 資料在保持與傳統 MPP 資料庫相同的單機並行度為 1 的情況下,PolarDB的效能是傳統 MPP 資料庫的90%。其中最本質的原因是傳統 MPP 資料庫的分佈預設是雜湊分佈,當兩張表的joinkey 是各自的分佈鍵時,可以不用 shuffle 直接進行 Local Wise Join 。而 PolarDB 底層是共享儲存池, PxScan 並行掃描出來的資料等價於隨機分佈,必須 shuffle 重分佈後才能像傳統 MPP 資料庫一樣進行後續的處理。因此, TPCH 涉及到表join時, PolarDB 相比傳統 MPP 資料庫多了一次網路 shuffle 的開銷。

PolarDB分散式 MPP 能夠進行彈性擴充套件,資料不需要重分佈。因此在這有限的 16 臺機器上執行 MPP 時,PolarDB 還可以繼續擴充套件單機並行度,充分利用機器的資源;當 PolarDB的單機並行度為 8 時,它的效能是傳統 MPP 資料庫的 5-6 倍;當 PolarDB單機並行度呈線性增加時,PolarDB總的效能也呈線性增加,只需要修改配置引數,即可及時生效。

針對PolarDB HTAP 對構建索引加速特性的支援,我們也進行了效能測試。在 500 GB 的資料量下,當索引的欄位有1、2、4個時,分散式 MPP 並行相比單機並行構建索引效能提升了5倍左右;當構建索引的欄位增加到8個時,效能提升了4倍左右。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。