其他分享
首页 > 其他分享> > 【参赛作品93】openGauss-An Autonomous Database【PVLDB论文阅读分享】

【参赛作品93】openGauss-An Autonomous Database【PVLDB论文阅读分享】

作者:互联网

作者:YAN左使

本文基于openGauss在VLDB2021上最新发表的论文《openGauss: An Autonomous Database System》,从学术的角度来探究openGauss如何基于各种AI技术构建一个智能的自治数据库系统。论文作者是清华大学李国良教授,他同时也是openGauss的总架构师。本文主要是对论文的阅读笔记和个人见解,如有错误,欢迎各位指正!

1. 摘要

虽然近年来基于学习的数据库优化技术在学术界得到了广泛的研究,但很多技术还没有被广泛部署到商业数据库系统中。这篇论文的作者探讨如何将基于AI的数据库技术整合到openGauss中,从而构建一个自治数据库系统架构。这些基于AI的数据库技术主要包括四个方面:

2. 挑战

要将基于AI的数据库技术整合到openGauss的架构中,构建基于学习的端到端数据库系统存在以下挑战:

为了应对这些挑战,论文构建了一个自治的数据库框架,并将其集成到openGauss中,主要包含5个组件,包括Learned Optimizers、Learned Database Advisors、Model Validation 、Model Management和Training Data Management,如下图所示。

image.png

3. 基于学习的优化器:Learned Optimizer

优化器是数据库最核心的组件之一,负责解析SQL语句生成高效的执行计划给执行引擎执行。基于学习的优化器主要包括三个重要的组件:基于MCTS的查询重写,基于Tree-LSTM的代价和基数估计器,以及基于DRL的查询计划生成器。

3.1 基于MCTS的查询重写

查询重写的目的是将一个速度较慢的SQL查询转换为具有更高性能的等价查询,这是查询优化中的一个基本问题。如果以适当的方式重写(例如,删除冗余操作符,交换两个操作符),缓慢的SQL查询(由于冗余或低效的操作)的性能可以提高几个数量级。

论文中给了一个例子,如下图所示。通过消除冗余聚合MAX(c_custkey)并且将ANY操作符里的子查询pull up到最外层的WHRER子句中,可以将查询Q重写为等效的查询Q’,查询重写后可以实现超过600倍的查询加速(查询执行时间从20多分钟降为1.941秒)。

image.png image.png

image.png

为了解决这个问题,论文采用蒙特卡洛树搜索(MCTS)来搜索最优的等价查询。整个查询重写模块由三部分组成,如上图所示。

更多具体的细节,可以参考论文《A Learned Query Rewrite System using Monte Carlo Tree Search》。

3.2 基于Tree-LSTM的基数和代价估计

传统的基数估计方法存在很大的误差,特别是当涉及多个列的时候,这是因为传统方法很难捕捉不同列之间的相关性。例如,基于直方图的方法只捕获单个列的分布;对于高维数据,基于采样的方法存在0元组问题。基数估计的误差会传递到代价估计中,因为代价模型除了和代价因子有关以外还受到基数估计的影响,比如PsotgreSQL中的代价模型是基数估计值和各种代价常数因子的线性组合,如下所示:

cost = Cs * Ns + Cr * Nr + Ct * Nt + Ci * Ni + Co * No

其中CsCrCtCiCo表示各种操作的代价因子,而NsNrNtNiNo则表示相应的基数值大小。

这些代价因子都是常数值,比如Cs=1.0,Cr=4.0,暗含的意思是随机读取一个page的IO代价是顺序读取的4倍。注意:PostgreSQL的官方文档建议不要随意修改这些常数的代价因子。

image.png

所以,从上面的例子可以看出,一个查询计划的代价的估计是由两个因素共同决定的:基数估计值和相应的常数代价因子。相比代价因子,基数估计值对于代价估计的影响更大,基数估计错误可能会导致生成的查询计划不是最优的(因为更优的查询计划可能被错误的估计了一个更大的代价值而被舍弃了)。

为了解决上面的这些问题,论文采用了一种树状结构的LSTM模型来同时估计查询的基数和代价。同时估计出基数和代价是这个模型最大的创新点,因为很多其他的基于AI的论文都只能估计基数或者代价。

论文采用的Tree-LSTM模型主要包括3个layer:embedding layer, representation layer和estimation layer,如下图所示。

image.png

更多具体的细节,可以参考论文《An End-to-End Learning-based Cost Estimator》。

3.3 基于DRL的查询计划生成器

查询计划生成中最重要的是join oder和physical operation的选择。传统的方法是在代价估计模型的基础上,通过搜索解空间来寻找合适的查询计划方案,比如动态规划和启发式算法。动态规划通过枚举解空间来找到最佳的查询计划,但其时间复杂度为指数级。启发式方法通过剪枝解空间的方式来加快搜索速度,但由于剪枝操作通常很难找到最优的查询计划。

将查询计划的生成过程建模为马尔可夫决策过程(MDP)后,就可以应用深度强化学习(DRL)来生成查询计划。但是,很多DRL方法采用固定长度来表示join tree,如果shcema有更新或者查询中存在表别名,这些方法就会失效。为了解决这些问题,论文提出了一种基于学习的查询计划枚举器,可以生成执行时间最短的查询计划,而且可以handle schema update。使用的深度强化学习模型是一个DQN+Tree-LSTM,如下图所示。

image.png

其工作流程如下:

更多具体的细节,可以参考论文《Reinforcement Learning with Tree-LSTM for Join Order Selection》。

4. Learned Database Advisor

4.1 自监控Self-Monitoring

在数据库的运行中检测异常是非常重要,如果不能及时检测出异常并采取措施,那么这些异常(比如slow SQL)可能会占用大量的系统资源,影响数据库的整体性能。靠人工来完成显然是非常困难的,因此需要一个自监控模块来实时监测数据库状态并主动发现异常。

通过检测数据库和操作系统的指标来检测异常,可以监视指标包括响应时间、CPU使用情况、内存使用情况、磁盘使用空间、缓存命中率等500多个metrics。如果这些指标存在异常则说明数据库出现了异常,这时自监控模块需要进一步找出root cause,才能采取相应的措施来修复异常。

由于要实时监控,所以监测数据形成了连续的时间序列数据(Time-Series Data)。传统的基于统计的异常检测算法是针对一维数据设计的,这些方法忽略了时间序列数据之间的相关性,无法获得较高的精度。基于深度学习的算法虽然能获取数据间的相关性,但需要对数据进行标记。

为了解决这些问题,论文采用一种基于重构的算法来检测异常,因为正常的时间序列数据总是表现出有规律的patterns,如果出现了异常模式patterns,则有很大的概率是数据库出现了异常。论文采用的是一个LSTM-based auto-encoder with an attention layer(包含一个注意力层的基于LSTM的自动编码器),如下图所示。

image.png

原始的多维时间序列数据通过预处理后会被Encoder编码成low-dimensiaonal representation,然后Decoder会解析表示并试图恢复原始的时间序列数据。如果能正确地重构出原始数据则说明没有异常,反之如果无法重构原始数据(重构误差超过一定地阈值),则说明数据库出现了异常。

如何确定一个合理的阈值是非常关键的,因为如果阈值太低则可能会经常报异常(类似于雷达检测中的虚警,即本来没有目标却认为有目标),阈值太高则可能漏检很多异常。因此论文采用了一种称为Extreme Value Theory的统计学方法来确定动态阈值。当用户指定系统灵敏度(1%或5%)后,系统会根据历史数据计算出相应的阈值。

4.2 自诊断Self-Diagnosis

Root-cause diagnosis对于自治数据库来说是至关重要的,需要同时考虑系统级诊断和SQL级诊断。前者分析系统异常的根本原因,比如IO争用、网络拥塞、磁盘空间不足等;后者分析慢SQL的根本原因,比如锁冲突或者缺少索引。

4.2.1 系统级诊断System-Level Diagnosis

在系统级诊断框架中,将诊断视为一个classification problem,并通过使用metric data中的特征来查找root cause。这个诊断模型是轻量级的,不会对数据库性能产生影响。通过对历史数据的分析,可以对诊断模型进行优化,这样只需对少数异常cases进行标注即可。系统级自诊断框架由offline和online两个部分组成,如下图所示。

image.png

4.2.2 SQL级诊断SQL-Level Diagnosis

SQL级诊断的目的是在没有实际运行SQL的情况下找到SQL语句中特别耗时的operator。

SQL级的诊断存在以下挑战:

下图显示了SQL级的诊断框架,其工作流程包含两个阶段:

image.png

4.3 自配置Self-Configuration

数据库一般都有数百个tunable knobs(例如,openGauss中有超过400个knobs),DBA需要为这些knobs设置适当的值来保证数据库的性能,比如内存管理、日志记录、并发控制。然而,手动调节knobs非常耗时,其他自动调节方法(如启发式采样或机器学习方法)不能有效地调节knobs。例如,有些ML方法在小数据集上训练,如果想要迁移到大数据集则需要重新训练。

为了解决这些问题,论文提出了一个混合调优模块如下图所示,该模块由四个部分组成:

image.png

4.4 自优化Self-Optimization

4.4.1 视图推荐MV Recommender

什么是物化视图(Materialized Views)?

物化视图的创建通常由DBA来完成,但是即使是有经验的DBA也不能完成具有数百万实例和数百万用户的云数据库的视图推荐工作。关于MV推荐的研究有两个挑战:

为了应对这些挑战,论文采用基于学习的MV推荐方法,如下图所示:

image.png

该方法主要包括三个部分:

4.4.2 索引推荐Index Recommender

索引对于数据库系统实现高性能至关重要,使用合适的索引可以显著加快查询的执行速度。然而,索引推荐是一个复杂而具有挑战性的问题:

为了解决这些问题,论文提出了一种基于学习的索引推荐方法,如下图所示。

image.png

该方法主要分为三个步骤:

5.几点思考

文中提到的这些论文解决的其实都是如何利用AI去改进甚至替代传统数据库的组件和模型,比如优化器中的查询重写和代价估计模型,然后作者想将这些都用于openGauss中构建一个自治数据库,我个人有以下几点思考:

image.png
Peloton系统框架图

image.png
NoisePage系统框架图

参考文献:
[1] Li, G., Zhou, X., Sun, J., Yu, X., Han, Y., Jin, L., … & Li, S. (2021). openGauss: An Autonomous Database System. Proceedings of the VLDB Endowment, 14(12), 3028-3042.
[2] Zhou, X., Jin, L., Sun, J., Zhao, X., Yu, X., Feng, J., … & Liu, L. (2021). DBMind: A Self-Driving Platform in openGauss. Proceedings of the VLDB Endowment, 14(12), 2743-2746.
[3] Pavlo, A., Angulo, G., Arulraj, J., Lin, H., Lin, J., Ma, L., … & Zhang, T. (2017). Self-Driving Database Management Systems. In CIDR.
[4] Pavlo, A., Butrovich, M., Ma, L., Menon, P., Lim, W. S., Van Aken, D., & Zhang, W. (2021). Make Your Database System Dream of Electric Sheep: Towards Self-Driving Operation. Proceedings of the VLDB Endowment, 14(12), 3211-3221.
[5] Zhou, X., Li, G., Chai, C., & Feng, J. A Learned Query Rewrite System using Monte Carlo Tree Search.
[6] Sun, J., & Li, G. (2019) An End-to-End Learning-Based Cost Estimator. Proceedings of the VLDB Endowment, 13(3), 307–319.
[7] Yu, X., Li, G., Chai, C., & Tang, N. (2020, April). Reinforcement Learning with Tree-LSTM for Join Order Selection. In 2020 IEEE 36th International Conference on Data Engineering (ICDE) (pp. 1297-1308). IEEE.
[8] Zhou, X., Sun, J., Li, G., & Feng, J. (2020). Query Performance Prediction for Concurrent Queries using Graph Embedding. Proceedings of the VLDB Endowment, 13(9), 1416-1428.

标签:基于,Database,数据库,视图,查询,模型,SQL,openGauss,PVLDB
来源: https://blog.csdn.net/GaussDB/article/details/122142999