2023 年 5 月,由 Stackoverflow 發起的 2023 年度開發者調查資料顯示,PostgreSQL 已經超越 MySQL 位居第一,成為開發人員首選。PostgreSQL 在國内的熱度也越來越高。6 月 17 日,PostgreSQL 資料庫技術峰會在成都順利召開。本次大會以 “新機遇、新态勢、新發展” 為主題,邀請衆多行業大咖參與本次活動。PieCloudDB 産品總監陳金豹也受邀在大會中發表演講《雲原生虛拟數倉 PieCloudDB 的架構和關鍵子產品實作》。
随着雲計算時代的到來,雲平台提供了近似無限豐富的計算資源,同時也使得計算成本極大的降低,釋放出資料計算産生智能的更多機會。早在 2019 年,Gartner 便做出預測:資料庫市場的未來在雲上。随着雲計算技術的發展,企業也都在向這一趨勢靠攏,越來越多的将自己的業務資料往雲上遷移。我們相信資料庫的未來在雲上,這也是我們打造 PieCloudDB 這款雲原生資料倉庫的原因。
PieCloudDB 于 2022 年 10 月正式問世。它是一款雲原生分布式資料倉庫,提供完備的 SQL 語言支援,高效的分布式計算能力和完備的事務支援。同時又實作了單一資料集的多叢集,秒級的彈性和隻為必要的計算和存儲付費的能力。
1. Why We Need PieCloudDB?
1.1 NoSQL 和資料湖已不能滿足使用者的分析需求
在過去的很長一段時間裡,NoSQL + 資料湖解決方案在資料分析領域占據了主流市場,而 Hadoop、HDFS 等 NoSQL 資料庫也是主要的資料分析平台。然而,随着 Cloudera 宣布停止對 CDH 技術支援,對 Hadoop 等 NoSQL 平台的質疑聲音也越來越大。
這一現象正是因為 NoSQL + 資料湖體系在複雜查詢支援、高并發隔離性和一緻性等重要資料分析特性方面存在明顯不足,現有基于标準 SQL 的 BI 工具難以內建,且 NoSQL 本身對進階分析(如圖形分析、地理資訊分析等)的支援較弱。是以,NoSQL 開始被人們貼上 “過時” 的标簽,不再占據資料分析領域的主要市場佔有率。
此外,基于 NoSQL 和資料湖的基礎設施所需的分析工具不容易內建和部署。使用資料湖進行資料分析需要整合部署多個元件,而這需要大量的開發工作。由于缺乏對 ANSI SQL 的支援,使用者通常需要具備專門的技術技能,并且需要承擔較高的技術和成本要求。此外,平台所需的專用引擎 / 工具(如圖形資料庫)往往難以與記錄系統內建,降低了資料分析的可操縱性和創新性。
這些限制和挑戰推動了對更強大、更易于內建、更易于使用的資料分析平台的需求。企業群組織越來越傾向于采用基于标準 SQL 的分析平台,這些平台能夠滿足使用者廣泛的分析功能、易于內建和部署等需求,并且與現有的資料存儲和處理技術相相容,對技術和成本的要求更低。
1.2 以關系型資料庫為基礎的資料倉庫很難适應雲環境
包括 Teradata、Greenplum 等衆多主流傳統資料倉庫都是以關系模型來組織資料的關系型資料庫。這些資料倉庫具有許多優點,包括良好的 SQL 相容性、高效運作複雜查詢以及支援事務 ACID 特性。然而,這些傳統的 MPP 資料庫也存在一些缺陷,例如彈性性能較差、高可用性方面不夠滿足要求、資料孤島等問題。
這些問題導緻傳統的資料倉庫在雲環境中無法充分利用公有雲的優勢。公有雲相對于私有環境具有許多優勢,其中最顯著的兩個是:
- 近乎無限的彈性計算資源:公有雲提供了彈性計算資源,使用者可以根據實際需求按需配置設定資源,并根據需要進行彈性擴縮容。使用者可以根據業務需求申請所需的計算資源,而不需要維護和管理自己的硬體基礎設施。
- 廉價且無限容量的對象存儲:公有雲提供廉價且具有幾乎無限容量的對象存儲。對象存儲的價格相對較低,可以為使用者提供大規模的存儲容量,幫助使用者降低成本并提高效率。
為了更好地适應雲環境并充分利用公有雲的優勢,新一代的資料倉庫逐漸崛起。新一代雲原生資料倉庫具有雲原生的架構設計,能夠更好地利用公有雲的彈性計算和對象存儲能力。它們可以在公有雲中快速部署和擴充,并提供高性能的資料處理和分析能力,以滿足現代資料分析的需求。
1.3 一個兼顧關系型數倉和公有雲優勢的産品
使用者需要一個能夠兼顧關系型數倉和公有雲優勢的産品,來适應雲時代的到來。計算引擎方面,需要具有關系型數倉的衆多優勢,能夠具備支援完備的 SQL 語言,具有高效的分布式計算能力,且能夠具有完備的事務 ACID 特性。公有雲特性方面,實作存算分離,提供彈性的計算叢集,讓使用者得以隻為必要的計算付費,充分利用公有雲帶來的優勢。這就是 PieCloudDB 的設計目标。
2. PieCloudDB 能給使用者帶來什麼?
作為新一代的雲原生資料倉庫,PieCloudDB 實作了雲上數倉計算與存儲的分離,兼顧了傳統關系型數倉的衆多優勢和公有雲帶來的衆多利好。
2.1 對 SQL 的完備支援
PieCloudDB 對 PostgreSQL 進行了重大改進,實作了分布式計算和存算分離的功能。并對鎖、事務、日志、系統表和使用者表的存儲等子產品進行了徹底重寫,帶來了颠覆性的變革。同時,PieCloudDB 也保留了 PostgreSQL 對 SQL 标準的完整支援,包括複雜查詢如聚合(Agg)、子計劃(Subplan)、子連結(Sublink)、外連接配接查詢(Outer Join)、視窗聚合函數(Window agg)和物化視圖(Materialized View)等。這些改進使得 PieCloudDB 能夠提供更高效、更強大的查詢功能,同時保持與 SQL 标準的相容性。
2.2 高效的查詢優化和與之比對的執行器
PieCloudDB 實作了專為複雜查詢設計的優化器和與之比對的高效執行器。
- 專為複雜查詢設計的優化器
PieCloudDB 的優化器提供了一系列全面的邏輯優化功能,其中包括謂詞下推、子查詢子連接配接提升和外連接配接消除等。此外,優化器基于純粹的代價模型進行深度優化,在多階段聚集過程中對每個節點進行代價估算,并利用動态規劃等算法生成多條路徑,最終選擇代價最低的路徑來執行查詢。這些功能旨在提高查詢性能和效率,進而優化 PieCloudDB 的查詢執行過程。
作為一款分布式資料庫,PieCloudDB 需要實作衆多分布式運算,包括多次資料重分布(reshuffle)和分布式聚合運算(agg)。為了能夠在跨表查詢時進行高效的分布式表連接配接,PieCloudDB 的優化器需要全面描述資料分布特性,以便進行分布式代價估算。
通過全面的資料分布特性描述,PieCloudDB 的優化器能夠考慮到資料在不同節點上的分布情況,進而更準确地估算跨表查詢的代價。這使得優化器能夠生成高效的查詢計劃,避免不必要的資料重分布操作,提高查詢性能和效率。
- 分布式環境高效執行器
為了配合專為複雜查詢設計的優化器,PieCloudDB 實作了高效的執行器,以在分布式環境下執行查詢操作。通過采用多組别多階段執行模型,并進行大量的資料交換,PieCloudDB 的執行器能夠在分布式環境下高效地執行查詢操作。這種執行模型可以充分利用分布式系統的計算資源,并提高查詢的并行性和整體性能。同時,通過與優化器的緊密配合,PieCloudDB 可以根據優化器生成的查詢計劃特性來優化執行器的執行政策,進一步提高查詢性能和效率。
2.3 對事務(ACID)的完備支援
PieCloudDB 提供了對事務的完備支援,包括事務的 ACID 特性:原子性、一緻性、隔離性和持久性。
- 原子性(Atomicity):PieCloudDB 確定事務中的操作要麼全部成功完成,要麼全部失敗復原。如果一個事務中的某個操作失敗,那麼該事務中的所有操作都将被復原,資料庫狀态會回到事務開始之前的狀态,保持資料的一緻性。
- 一緻性(Consistency):PieCloudDB 在事務送出之前,會檢查事務的操作是否符合預定義的限制和規則,以確定資料庫的一緻性。如果事務執行完成後,資料庫仍然保持一緻性,那麼該事務被認為是成功的。
- 隔離性(Isolation):PieCloudDB 支援兩個常用的隔離級别:Read Committed(讀送出)和 Repeatable Read(可重複讀)。在 Read Committed 級别下,事務隻能看到其他事務已經送出的修改,而在 Repeatable Read 級别下,事務在整個事務過程中能夠看到一個一緻的快照,不受其他并發事務的修改影響。
- 持久性(Durability):PieCloudDB 確定一旦事務送出成功,其對資料庫的修改将永久儲存,即使發生系統故障或崩潰。這是通過将事務日志記錄在穩定的存儲媒體上來實作的,以便在恢複過程中可以重放事務日志。
通過提供對事務 ACID 特性的完備支援,PieCloudDB 提供了可靠和一緻的資料管理機制。無論是在并發環境中還是在面臨故障的情況下,PieCloudDB 都能確定資料的完整性和可靠性。
2.4 極緻的計算叢集彈性
PieCloudDB 具備極緻的計算叢集擴縮容能力,能夠實作計算叢集快速的擴充和收縮操作。PieCloudDB 的 Executor 節點并不持有持久化的資料,擴充和收縮操作不涉及資料的移動。此外,Executor 節點也不直接通路系統表、事務和鎖。在進行計算叢集的擴充時,PieCloudDB 隻需要在新的虛拟機節點上部署二進制并向中繼資料服務注冊。這樣的設計確定了擴縮容操作的高效性。
PieCloudDB 為使用者提供了一個獨立的計算池,該計算池是為了支援快速的擴縮容而準備的。在這個計算池内,PieCloudDB 可以在一定範圍内實作秒級的擴容和收縮操作。這意味着當使用者需要增加計算資源時,PieCloudDB 可以迅速添加新的計算節點,使得整個叢集能夠處理更多的并發請求。反之,當使用者需要減少計算資源時,PieCloudDB 也能夠快速地收縮計算節點,以節省成本和資源。
2.5 多叢集與高可用
PieCloudDB 支援多叢集。使用者可以在同一個資料集上起多個叢集。在生産環境中,常常會遇到不同的部門對叢集大小的需求不一樣。這種情況下,如果隻有單叢集,就需要根據最大的叢集需求來建立叢集,造成資源的浪費。在多叢集場景下,不同部門可根據自身需求建立不同大小的叢集,任務結束時可以關閉叢集,多個叢集通路同一個資料集,并共享同一個 ACID 特性。
由于 PieCloudDB Executor 是無狀态的,當某個 Executor 出現故障,Coordinator 會執行下個 Query 時,由剩下的 Executor 來執行任務。此過程中,使用者無感覺,不會對業務産生影響。
通過這些特性,PieCloudDB 在 OLAP 場景下,可以讓使用者像使用 PostgreSQL 一樣使用 PieCloudDB。使用者隻需為已經發生的計算和存儲付費。使用者可以按需啟動和關閉多個不同大小的叢集,以适應不同類型的任務,進而取得性能和開發效率的平衡。
3. PieCloudDB 雲原生架構的實作
為了适應雲環境,PieCloudDB 實作了彈性伸縮的叢集和多叢集這兩個主要的雲原生特性,打造了完全無狀态的 Executor 節點、獨立的系統表和分布式的鎖。
3.1 虛拟數倉
PieCloudDB 為了實作在擴縮容過程中無需移動資料,将使用者資料分離到對象存儲中。此外,Executor 節點上不存儲系統表、事務和鎖資訊,而是依賴 Coordinator 來解決這些問題,進而使 Executor 節點成為無狀态的節點,實作秒級擴縮容。
為了實作 Multi-master 架構,并實作有狀态的 Coordinator 節點,PieCloudDB 使用中繼資料服務來完成這些功能。系統表以 Key-Value 的形式存儲在 KV 資料庫 FoundationDB 中,并通過 FoundationDB 的短時間、小體量的事務特性,實作了分布式鎖和分布式事務。這樣,PieCloudDB 能夠在 Coordinator 節點上處理分布式鎖和事務,并保證系統的一緻性和可靠性。
通過這一系列的設計和操作,PieCloudDB 實作了完全無狀态的虛拟數倉。使用者可以根據需要建立和關閉虛拟數倉,而在擴縮容過程中無需移動資料,并且能夠快速進行節點的擴充和收縮。這使得 PieCloudDB 能夠高效地适應不同規模和負載的需求,并提供靈活的資料存儲和計算資源管理。
- 系統表:mStore
PieCloudDB 将元組以 Key-Value 的形式存儲到 FoundationDB 中,并利用 FoundationDB Key 的自然排序來實作索引。在 PieCloudDB 中,每個元組都被編碼為一個 Key-Value 對,其中 Key 表示元組的索引資訊,而 Value 則包含了元組的資料内容。通過利用 FoundationDB Key 的自然排序,可以高效地進行範圍查詢和索引查找,進而實作快速的資料檢索和通路。
為了實作多版本并發控制,PieCloudDB 使用了 Xmin、Xmax 和 cid 等機制。Xmin 和 Xmax 記錄了事務對元組的可見性資訊,其中 Xmin 表示最早可見的事務,而 Xmax 表示最晚可見的事務。cid(Commit ID)則表示事務的送出辨別。通過這些機制,PieCloudDB 可以實作并發事務的隔離性和一緻性,并支援多版本的查詢和復原操作。
通過将元組存儲為 Key-Value 對,利用 FoundationDB 的自然排序和采用 MVCC 機制,PieCloudDB 能夠高效地處理資料的存儲、索引和并發通路,進而提供高性能和可靠的資料庫服務。
- 資料表:oStore
PieCloudDB 通過将資料分離到對象存儲(如 S3)上,利用 oStore 建構了對象存儲上的使用者表。由于對象存儲本身隻支援插入(insert)和删除(delete)操作,而不支援更新(update)和追加(append)操作。PieCloudDB 在 mStore 中建立輔助表來實作 MVCC(多版本并發控制)的特性。
在 mStore 的輔助表中,每 個 tuple 對應 oStore 的一個 block,oStore 的 block 中存儲了一部分的使用者資料。這樣,輔助表的每個 tuple 的可見性就與對應的 block 的可見性相關聯,進而實作了 MVCC 的特性。當執行更新(update)或删除(delete)操作時,PieCloudDB 會生成一個新的 block,将未發生變化的 tuple 放入新的 block 中,并将更新後的使用者資料放入新的 block 中(例如,在 block 4 上執行更新操作後,生成一個新的 block 5,将更新後的使用者資料放入新的 block 5 中)。最後,輔助表将完成更新(update)操作。
通過這種設計和操作,PieCloudDB 能夠在對象存儲上實作 MVCC 特性,并通過輔助表來管理資料的版本和可見性。這使得 PieCloudDB 能夠支援更新和删除操作,同時保持資料的一緻性和并發控制的正确性。
- 分布式鎖和事務
PieCloudDB 利用 FoundationDB 的事務送出沖突(commit conflict)機制來實作鎖的共享區的正确通路,進而實作了分布式的鎖。
在 PieCloudDB 中,多個事務需要通路共享區時,它們會通過 FoundationDB 的事務機制進行競争和協調。每個事務嘗試擷取鎖并執行對共享資源的操作。如果多個事務同時請求同一個共享鎖,FoundationDB 的事務送出沖突機制會確定隻有一個事務能夠成功擷取鎖并進行操作,而其他事務将被阻塞或復原。
通過利用 FoundationDB 的事務送出沖突機制,PieCloudDB 能夠實作分布式的鎖管理,確定對共享區的正确通路和資源的互斥操作。這種機制保證了多個事務之間的隔離性和一緻性,避免了資料競争和沖突的發生,并提供了可靠的分布式鎖功能。
此外,PieCloudDB 還在 FoundationDB 上實作了分布式的事務,并通過 mStore、oStore、分布式鎖和事務的實作,建構了一個雲原生的分布式架構。這樣的架構能夠提供高可靠性、高性能的資料庫服務,并支援分布式的資料操作和管理。
優秀的架構設計是一款資料庫産品成功的第一步,OpenPie 研發團隊将對 PieCloudDB 産品進行不斷疊代,針對性能推出了聚集下推、預計算、Block Skipping 等功能,并很快将推出 Time Travel、Branch、Data Sharing 等系列提高使用者的使用體驗。PieCloudDB 将繼續前進,在 eMPP 分布式專利技術、伺服器無感覺(Serverless)及 透明資料加密(TDE)等多項核心技術加持下,為企業建構高安全性,高可靠性,高可用性的「堅如磐石」的雲原生虛拟數倉,助力企業實作資料價值最大化,