PolarDBforPostgreSQL -HTAP详解 阿里云智能数据库产品事业部PolarDB产品部嘉宾:冯遵宝(北侠) 目 1背景:PolarDB-PG计算存储分离 Contensts 2PolarDB-PG-HTAP架构 录3PolarDB-PG-HTAP原理 4PolarDB-PG-HTAP应用和性能 5PolarDB-PG开源社区 01 背景:PolarDB-PG计算存储分离 PolarDB-PG计算存储分离 架构特点 •扩展性:存储计算分离,按需扩缩容 •成本:多个计算节点共享一份数据,降低存储成本 •易用性:一写多读/透明读写分离,单机体验、 •可靠性:三副本、秒级备份 •可用性:毫秒级主备延迟,秒级恢复 Primary (读写节点) CPU Memory Primary (读写节点) CPU Memory ReadOnly (只读节点) CPU Memory ReadOnly (只读节点) CPU Memory 计算层 存储层 SharedStorage LocalStorage 传统的方案计算-存储分离 解耦弹性 PolarDB-PG计算存储分离 计算存储分离:模块栈 •事务层:CSN快照 •日志层:复制WALMeta、Lazy回放,并行回放,LogIndex •缓存层:常驻BufferPool、多版本页面 •存储层:DirectIO、数据预读、预扩展、PolarVFS 事务层 日志层 RW节点 CSN WALMetaQueue WALSender LogIndex RO节点 CSN WALMetaQueue WALSender WALBuffer LogIndex WALBuffer PageIDLSN PageID LSN PageID LSN PageIDLSN 缓存层 PersistedBufferPoolFullPageSnapshot PersistedBufferPoolFullPageSnapshot 存储层 数据预读数据预扩展 WALFile WALFile 多版本⻚ 多版本⻚ DataFile DataFile LogIndexFile LogIndexFile libpfspolarvfs 数据预读数据预扩展 libpfspolarvfs WALFile多版本页DataFileLogIndexFile Shared-Storage 02 PolarDB-PGHTAP架构 HTAP业务场景的传统解决方案 业务背景:TP业务中大量表join(报表/对账)传统ETL方案:表结构+全量+增量 •独立的AP系统:存储、计算增加 •TP数据导入AP系统:数据延迟,时效性不高 •运维难度增大 Client TP业务AP业务 计算层 Primary (读写节点) CPU Memory ReadOnly (只读节点) CPU Memory ReadOnly (只读节点) CPU Memory 同步表结构全量 snapshotdata 增量 OnCommit 数据同步组件(逻辑复制) Dumper publisherMQ Decoder Master MPP SharedStorage 存储层 Sharding1 Sharding2Sharding3 PolarDB-PG 数据校验 基于分片存储的MPP系统 PolarDB-PGHTAP架构(in-house) PolarDB-PG内核原生支持MPP引擎:无需导数据 单机引擎: TP业务 单机引擎: TP型业务 分布式并行计算引擎: AP业务 提高计算节点利用率 •发挥所有RO节点的计算资源 毫秒级数据新鲜度(物理流复制) •TP/AP共享一份数据,两套计算引擎,减少存储和运维成本 TP/AP物理隔离(避免CPU/MEM互相影响) •单机执行:部分节点,处理高并发的TP查询 •分布式MPP执行:部分节点,复杂AP查询 弹性扩展 •任何节点均可做为MPP的master节点 •集群计算能力随时扩展,即时生效,数据无需重分布 Primary (读写节点) CPU Memory ReadOnly (只读节点) CPU Memory ReadOnly (只读节点) CPU Memory ChunkSvr CHUNK ChunkSvr CHUNK ChunkSvr CHUNK Shared-Storage ReadOnly (只读节点) CPU Memory ReadOnly (只读节点) CPU Memory 03 PolarDB-PGHTAP原理 PolarDB-PG-HTAP原理 只读节点(Coordinator) FinalAgg •MPP架构原理 •Shuffle算子屏蔽数据分布 •ParallelScan算子屏蔽共享存储 等价于单机算⼦ Shuffle LocalAgg HashJoin 只读节点 Hash Shuffle Shuffle LocalAgg HashJoin 只读节点 Hash Agg ParallelScan B2 ParallelScan A2 ParallelScan B1 ParallelScan A1 ParallelScan 分⽚ 扫描算⼦ HashJoin ScanA ScanB Shuffle Shuffle Shuffle Shuffle Shuffle算⼦ Shuffle Shuffle Shuffle Shuffle Shared-Storage 表A VirtualPartition-2 VirtualPartition-1 表B VirtualPartition-2 VirtualPartition-1 PolarDB-PG-HTAP内核模块栈 Parser/Analyze/Rewriter PXPlanner(GPORCA) Transformations Planner PropertyEnforce PolarDB-CostModel Transformations Shared-Storage Aware PXExecutor Agg 单机Executor Sort PxSeqScan interconect PxDynamicScan SeqScan IndexScan ... PxBitmapScan PxShuffle PxShareIndxScan Hash/NestLoop/MergeJoin PxIndexScan Dispatcher PxShareSeqScan MVCC(CSN) 一致性 GlobalSnapshot 打造分布式执行引擎 •分布式执行器 •事务一致性 •分布式优化器 •SQL全兼容 优化器 执行器 事务层 Buffer层存储层 BufferPoolStorageLayer PolarDB-PG-HTAP分布式优化器 Parser/Analyzer/Rewriter QUERY PolarDB优化器特点 •单机优化器:动态规划 •分布式GPORCA优化器: DXL2Plan MDProvider CataLog TopDown模型 PolarDB-PG内核 Optimizer Plan RESULTS PolarDB-PGExecutor ParallelExecutor QueryTree2DXL 实现方案 •基于ORCA扩展 •与共享存储特性相结合 Preprocessor SearchEngine ORCA优化器 OptimizerTools MDCache PolarDB-PGCostModel Card.Estimation PolarDB-PGTransformations PropertyEnforcement PolarDB-PGOperators JobSMScheduler Memo PolarDB-PG-HTAP分布式优化器 场景:LeftOuterJoin •A⋈B=(A1⋈B)⋃(A2⋈B) •右侧需要有全量属性 传统LeftOuterJoin的计划 •右表广播 •Prefetchinner •Seqscan •Material 缺点: 1.没有复用TP型索引 2.物化算子导致流水中断 NestLoopJoin PartitalIndex Scan(A) Material BroadCast(B) PartitalSeq Scan(B) NestLoopIndexJoin PartitalIndex Scan(A) FullIndex Scan(B) 基于共享索引树的LeftOuterJoin •右侧:扫描共享存储的索引 •左侧:并行化分片索引扫描 效果:6个并发时70秒降到1.8秒 PolarDB-PG-HTAP分布式执行器 PXCoordinator 输出SQL PXShuffleSender 控制链路 •ParallelPlan 输出Tuples FinalAgg PXShuffle 数据链路:SendTuples LocalAgg PXWorkerGroup1 •GlobalSnapshot •Serialize&Dispatch •MonitorWorkers •DynamicScan •FinalAggregate Fragment1 LocalAgg HashJoin 控制链路: 序列化并发送 PlanTree PXShuffleReceiver HashJoin Hash PXShuffleReceiver 数据链路 •SyncRuntimeEnv •ExecuteSubTree •ShuffleSend&Receive •ParallelScan PXShuffle ParallelScanA Fragment2 Hash PXShuffle ParallelScanB Fragment3 控制链路: 序列化并发送 PlanTree 数据链路:SendTuples PXShuffleSender ParallelScanA 数据链路:SendTuples PXShuffleSender ParallelScanB PXWorkerGroup2PXWorkerGroup3 PolarDB-PG-HTAP动态扫描 •数据倾斜 •数据倾斜:Heap表引用TOAST表 •计算倾斜:长事务、Buffer/网络/IO抖动 •方案 输出SQL输出Tuples 数据链路 DataThread (recvtuple) PXCoordinator ErrorPath ControlThread (epoll+libpq) 控制链路:请求扫描任务 1.Affinity 2.StealTask 3.算子唯一标识符 4.无状态 •能者多劳:算子动态请求扫描任务 RO1 RO2RO3 •效果(时空数据库场景) •动态扫描能线性提升,消除数据倾斜 执⾏时间(秒) 节点数 静态scan 动态scan 1RO*15 71 36 2RO*15 35 18 3RO*15 36 12 6RO*15 33 6 1TB,1RW+5RO,64Core,256G内存 100w时空数据,1%toast大对象,每个对象1MB PartitalScan(A) Shared-Storage PartitalScan(A) BufferPool PartitalScan(A) BufferPool BufferPool 4MB 4MB 4MB 4MB 4MB 4MB 4MB 4MB 4MB 4MB 4MB 4MB PolarDB-PG-HTAP弹性扩展 •关键点 •Coordinator全链路⽆状态 •Worker全链路⽆状态 psql DXL兼容PolarDB元信息 RO1-Coordinator CATALOG 控制链路 1.RuntimeEnv(OIDs) 2.SubPlanTree 3.ScanTask WStoartkeelerss SStatatetelelessssWWoorkrkeerr Tupl