本文為您介紹列存索引的特點、架構和適用情境。
背景資訊
傳統的OLTP和OLAP解決方案基於簡單的讀寫分離或ETL模型,將線上庫的資料以T+1的方式抽取到資料倉儲中進行計算,這種方案存在儲存成本高、即時性差、鏈路和維護成本高等缺陷。為應對資料爆炸式增長的挑戰,PolarDB-X基於Object Storage Service設計了一套列存索引(Clustered Columnar Index,簡稱CCI)功能,支援將行存資料即時同步到列存儲存上,並支援以下功能:
線上交易處理和即時資料分析的一體化能力,滿足OLTP和OLAP混合情境的需求。
結合PolarDB分布式架構,列存索引支援智能路由和MPP查詢加速技術。計算層會精確識別出TP和AP的流量,並智能地將TP和AP流量分別路由到不同的儲存介質上,同時確保在AP鏈路上預設開啟MPP並行查詢技術掃描列存索引,從而提升查詢分析的能力。
採用Delta+Main模型,滿足秒級的即時更新,結合MVCC多版本技術,能確保在任何時刻都可以讀取到一致性的快照資料。
版本限制
僅執行個體版本為5.4.19-16989811及以上的企業版執行個體支援列存索引相關功能。
僅AUTO模式資料庫支援建立列存索引。
技術架構
行列混存架構
核心組件
計算節點(Compute Node,CN)是系統的入口,採用無狀態設計,包括SQL解析器、最佳化器、執行器等模組。負責資料分布式路由、計算及動態調度,負責分散式交易2PC協調、全域二級索引維護等,同時提供SQL限流、三權分立等企業級特性。
儲存節點 (Data Node,DN)負責資料的持久化(面向行存資料),基於多數派Paxos協議提供資料高可靠、強一致保障,同時通過MVCC維護分散式交易的可見度,另外提供計算下推能力,以滿足分布式的計算下推要求(例如Project/Filter/Join/Agg等下推計算)。
中繼資料服務(Global Meta Service,GMS)負責維護全域強一致的Table/Schema、Statistics等系統Meta資訊,維護帳號、許可權等安全資訊,同時提供全域授時服務(TSO)。
日誌節點(Change Data Capture,CDC)提供完全相容MySQL Binlog格式和協議的增量訂閱能力,提供相容MySQL Replication協議的主從複製能力。
列存引擎(Columnar)提供持久化列存索引,即時消費分散式交易的Binlog日誌,基於Object Storage Service介質構建列存索引,能滿足即時更新的需求,結合計算節點可提供列存的快照一致性查詢能力。
列存架構
架構理念
隨著雲原生技術的不斷普及,以Snowflake為代表的新一代雲原生數倉以及資料庫HTAP架構不斷創新,可見在未來一段時間後行列混存HTAP將會成為一個資料庫的標配能力,需要在當前資料庫列存設計中面向未來的低成本、易用性、高效能上有更多的思考。
PolarDB-X提供列存索引的形態(Clustered Columnar Index,CCI),行存表預設有主鍵索引和二級索引,列存索引是一種額外基於列式結構的二級索引(覆蓋行存所有列),一張表可以同時具備行存和列存的資料。
架構特點
雲原生架構(儲存和計算分離,低成本)
PolarDB-X列存索引,採用雲原生Object Storage Service作為主要資料存放區(成本僅為本地碟的1/6~1/10),同時結合列存資料本身的高壓縮性(3~5倍),可以提供非常有競爭力的低成本優勢。在HTAP行列混存的情境中,額外的列存儲存成本,可以控制在行存的儲存成本的5%~10%。
PolarDB-X列存索引的儲存採用Delta+Main(類LSM結構)二層模型+標記刪除的技術,確保列存索引使用Object Storage Service也具備高並發更新能力。同時,在列存讀取Object Storage Service的鏈路上,採用多層資料Local Cache、以及多級統計資訊機制,盡量減少不必要的遠端OSS儲存訪問。
分布式 (線性擴充)
傳統分散式資料庫,業界常見基於Paxos/Raft的多副本機制構建列存,但OLTP和OLAP各自的查詢情境會有不同的訴求,對資源的依賴程度也不同,不同副本之間強一致分區策略/擴縮容機制,使得TP和AP的線性擴容能力容易相互制約,影響效能。
PolarDB-X列存索引,基於分散式交易的Binlog日誌即時同步,實現行轉列(M:N)的異構轉換,同時可以定義列存索引特有的分布式分區鍵、排序鍵等,結合分布式的並行技術,提供列存查詢的線性擴充能力。同時行存和列存儲存介質相互隔離,儲存和計算資源也更易彈性,在分布式背景下列存查詢更易追求極致的線性擴充能力。
讀寫分離(serverless,按讀的使用付費)
PolarDB-X列存索引,採用組件寫和讀分離的架構設計,分為列存寫和列存讀。列存的寫節點(Columnar節點),屬於有狀態的節點,並不直接對外提供寫請求,通過Group Commit技術批量更列存索引資料。列存的讀節點(CN節點),繼承CN節點無狀態的設計,通過GMS節點擷取列存的中繼資料,直接存取OSSObject Storage Service上的列存索引資料。
PolarDB-X執行個體建立,系統會預設提供列存寫的組件(Columnar節點,長期運行並同步列存索引),您只需通過DDL文法建立列存索引後,列存索引資料就會自動構建並保持即時更新。業務可以通過主執行個體、或者購買新的唯讀執行個體(CN節點),就可以正常訪問行存和列存索引,同時無狀態的CN節點特別適合serverless模式,使用者只需為列存讀的使用付費。
行列混合 (易用性,一體化向量化SQL引擎)
PolarDB-X複用CN節點自研的SQL引擎,提供了列存讀的完整能力。構建面向行列混合情境的代價最佳化器,根據代價智能識別路由,將OLTP類查詢轉寄給行存查詢鏈路、以及將OLAP類查詢轉寄列存查詢鏈路,同時支援在SQL運算元層級訪問不同的行存和列存,全面落實HTAP的行列混合能力,支援一套SQL引擎的統一訪問。
PolarDB-X全面擁抱向量化,針對列存的TableScan讀取,採用列式chunk的資料結構,後續中間的運算元計算也全面繼承chunk的記憶體列式結構,基於全鏈路的向量化提升查詢效能。同時針對行存的TableScan也會動態轉化為列式chunk,基於統一的資料結構實現行列混合查詢。
庫倉一站式(Zero-ETL)
傳統資料倉儲,會通過資料ETL方式同步資料,採用MPP/BSP等並行計算架構可以很好地解決OLAP複雜查詢,但面向高並發的資料線上查詢(Serving情境)會有明顯的資源並發瓶頸,會通過資料迴流到OLTP資料庫提供線上查詢。
PolarDB-X結合雲原生資料倉儲AnalyticDB MySQL版提供了庫倉一站式的能力,基於“Zero-ETL”的設計理念,採用共用同一份列存索引的資料,雲端式原生資料倉儲AnalyticDB MySQL版的資料倉儲能力可以滿足多方的資料匯總和資料關聯查詢,提供傳統意義上的數倉和湖的分析。同時,針對線上資料的並發查詢可以使用PolarDB-X的HTAP行列混合架構,整個過程可以避免傳統的資料ETL。
技術原理
列存索引的構建

列存索引是由列存引擎節點來構造的,構建的資料最終會以CSV和ORC兩種資料格式儲存在共用對象上。其中CSV往往儲存的是即時的增量資料,過多的增量資料會及時進行compaction,轉儲成ORC格式。不管是CSV還是ORC格式,PolarDB分布式版對這兩種儲存格式都做了增強,既繼承了原生格式的開源開放特性,又確保了這兩類格式可以完全表達MySQL的資料協議。
從資料同步方面來看,構建過程往往是由全量快照讀取和增量同步處理兩條並行的同步鏈路共同完成的。先建列存索引,再匯入資料,這個情境下只有增量資料同步,Columnar節點會同時消費Binlog資料構建索引;先匯入部分資料,再建列存索引,繼續匯入資料,這個情境除了有增量同步處理鏈路,Columnar節點會同時消費已有的全量資料,增量和全量並行消費,提速列存構建的效率。
從階層方面來看,列存引擎節點採用Delta+Main(類LSM結構)二層模型,採用了標記刪除的技術,確保了行存和列存之間實現低延時的資料同步,可以保證秒級的即時更新。資料即時寫入到MemTable,在一個group commit的周期內,會將資料存放區到一個本地csv檔案,並追加到OSS上對應csv檔案的尾部,這個檔案稱為delta檔案。OSSObject Storage Service上的.csv檔案不會長期存在,而是由compaction線程不定期地轉換成.orc檔案。
查詢加速技術
PolarDB分布式版的流量是由計算節點承擔,進行查詢分析。從上圖可以看出整個查詢加速鏈條分為最佳化器、執行器、儲存引擎三個層面。
在最佳化器層面,PolarDB分布式版提供了面向行列混合情境的代價最佳化器,根據代價智能識別路由,將TP類查詢轉寄給行存查詢鏈路;將AP類查詢轉寄給列存查詢鏈路。
在執行器層面,PolarDB分布式版提供的是面向行列混合情境的一體化執行器,一套執行器同時支援HTAP情境。同時運算元層做了向量化改造,支援了MPP加速技術,在複雜查詢情境中,可以充分利用多節點資源並行計算,保證了高吞吐的複雜查詢需求。為了抵消儲存計算分離架構帶來的網路延遲,執行器層也引入了本機快取技術,將熱資料即時載入到本地磁碟,保證了低延後查詢需求。
在儲存引擎層面,列存索引的構建保證了事務提交的原子性,確保查詢上可以查詢到事務層級一致性的資料。
產品形態
在引入了列存引擎後,PolarDB分布式版在原有的主執行個體和唯讀執行個體產品規格之外,增加了列存唯讀執行個體產品規格。
主執行個體:預設只能查詢行存資料,配合唯讀執行個體,其提供的主執行個體叢集地址,可以提供透明強一致性的讀寫分離能力。主執行個體上保留了直接查詢列存資料的能力,後面也會逐步放開智能路由和行列混合查詢能力。
唯讀執行個體:支援查詢行存唯讀和列存索引的資料,提供了獨立的唯讀串連地址,可以由應用單獨串連,由應用側自主進行讀寫分離。
列存唯讀執行個體:僅能查詢列存索引的資料,提供了獨立的唯讀串連地址,由應用單獨串連。列存唯讀執行個體僅包含計算節點,具有更好的價格優勢。
適用情境
PolarDB分布式版的列存索引特性提供了一站式HTAP產品體驗,可應用於多種業務情境:
對線上資料有秒級即時資料分析需求的情境,如即時報表業務;
專用資料倉儲情境,依託PolarDB分布式版提供的海量資料存放區能力,匯聚多個上遊資料來源,將其作為專用資料倉儲使用;
ETL計算情境:依託PolarDB分布式版基於列存索引提供的強大而靈活的計算能力。
PolarDB分布式版結合列存索引特性,其優勢不僅僅在於一套資料庫產品可以同時解決TP和AP的混合情境需求,同時雲端式原生的Object Storage Service和智能路由技術,給使用者提供的是透明的低成本的HTAP解決方案。
效能測試
PolarDB分布式版列存索引的TPC-H測試設計、測試過程和詳細測試結果,請參見列存索引TPC-H測試(100 GB)。