欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

OpenGauss数据库源代码深度解读系列之一:AI技术入门详解

最编程 2024-07-22 10:29:51
...

AI技术最早可以追溯到20世纪50年代,甚至比数据库系统的发展历史还要悠久。但是,由于各种各样客观因素的制约,在很长的一段时间内,人工智能技术并没有得到大规模的应用,甚至还经历了几次明显的低谷期。随着信息技术的进一步发展,从前限制人工智能发展的因素已经逐渐减弱,所谓的ABC(artificial intelligence、big data、cloud computing)技术也应运而生。人工智能在某些领域的能力已经超过了人类,如AlphaGo战胜了人类的顶尖围棋选手事件、无处不在的“刷脸”验证、语音助手使人们看到人工智能在更多领域落地的可能。

在本章中,将介绍openGauss在人工智能与数据库结合领域的探索,包括自调优、智能索引推荐等领域的内容。

一、概述

数据库与AI相遇会摩擦出什么样的火花?近些年全球各大公司、顶尖高校都在尝试将AI与数据库融合。openGauss目前也已经取得了阶段性的成果,部分项目也已经在华为云上线并进行商用。openGauss在人工智能领域的探索可以分为两个主要方向:AI4DB与DB4AI。

(1) AI4DB就是指用AI使能数据库,从而获得数据库更好的执行表现、实现数据库系统的自治、免运维等。主要包括自调优、自诊断、自安全、自运维、自愈等子领域。

(2) DB4AI就是指打通数据库到人工智能应用的端到端流程,统一人工智能技术栈,达到AI应用的开箱即用、高性能、低成本等目的。例如通过类SQL语句使用推荐系统、图像检索、时序预测等功能,充分发挥openGauss高并行、列存储等优势,提高机器学习任务的执行效率。同时,在数据侧实现AI计算,还可以降低数据的网络传输成本,实现本地化计算、节省人力、降低成本。

下述2-6章节介绍AI4DB功能,7章节介绍DB4AI功能。

二、自调优

数据库自调优技术是一个比较大的范畴,通常包括对数据库参数配置、自身代价优化模型的调优等。本节主要介绍对数据库参数配置进行自动调优的功能。

2.1  参数自调优的使用场景

通常数据库系统会提供大量参数供DBA进行调优,openGauss提供了500多个参数。很多参数都与数据库的表现密切相关,如负载调度、资源控制、WAL机制等。

数据库参数调优的目的是满足用户对性能的期望,保障数据库系统的稳定可靠。大部分场景中,数据库参数调优依赖DBA去识别和调整,但DBA调优存在很多限制。主要包括三个方面。

(1) DBA要花费大量时间,在测试环境中对所要部署的业务进行调优;而每次上线新业务,调优过程需要重新来一遍,对于企业来说,人力成本巨大。

(2) DBA通常仅关注少部分关键调优参数,使得调优过程不能完全匹配业务,而且资源利用率及数据库性能并不一定是最优的。而且,其他次优参数与数据库表现的隐式关系也没有被充分挖掘出来。

(3) DBA通常只精通某一个特定的数据库调优,譬如擅长调优A数据库的DBA很可能不擅长调优B数据库,因为二者的底层实现存在很大差异,不可以使用同一套经验进行调优。同时,当硬件环境发生了变化,DBA的经验不一定能发挥作用。多业务混合负载场景下,也是如此。

针对上述调优限制,实现一种数据库参数自动调优的方法,来减少DBA运维代价,提升数据库整体的性能就显得尤为重要了。

2.2  现有的参数调优技术

参数调优在各个领域是一项通用的技术,该技术在各领域不断取得进展。与很多领域一样,数据库中也包含各种各样的参数用于调优,这些参数往往随着业务的变化需要不断进行调整。总体来看,数据库的参数调优主要有以下几种方法。

1. 基于规则

基于规则的参数调优是比较简单、通用的方法,通过对人工调优的经验进行整理,编写成各式各样的规则来对数据库系统进行调优。该方法的优点是速度快、可解释性好、稳定性高,缺点是规则随着系统的变化可能会不再适用、推荐的参数往往不是最优的。著名的采用该方法的工具为MySQKTuner-perl。

2. 基于搜索算法


假设数据库系统只需要调一个参数,且这个参数与性能之间的关系又非常简单(如二者呈线性相关、变化曲线呈二次函数关系),则可以通过二分搜索算法查找出最优的参数值。那么试想:如果系统需要调整多个参数,这些参数彼此之间又互相影响,这时应该如何去调优呢?显然,这不是通过二分法就可以解决的了,这在数学上属于一个组合优化问题,即在有限的对象集(此处指所有参数*组合后的可能结果集)中找出最优对象(此时是最优参数配置)的问题。对于组合优化问题,一般的解法包括近似算法(approximation algorithm)、启发式算法(heuristic algorithm)、遗传算法等。由于启发式算法实现相对简单,结果比较稳定,因而广泛应用。如参数优化方法bestconf就属于此类。基于启发式算法的参数调优方法具有应用场景普遍、优化效果稳定的特点,一般不需要根据系统的变化而进行算法的重新适配,但是每次启动都需要重新探索、不能够重复利用历史探索经验、而且往往容易陷入局部最优。相关搜索算法在其他参数调优领域也有较多的实践,如AutoML中对机器学习算法超参数的调优。

3. 基于监督学习

监督学习(supervised learning)是一种通过显式地输入特征向量和结果标签,寻找二者之间映射关系的一种机器学习算法。它可以根据训练数据学习或建立一个模型,并基于此模型推测新的实例。如果监督学习模型的输出是连续的值则称为回归分析,如果预测一个分类标签则称为分类。

如果可以人为地建立数据库系统的特征(如workload特征、硬件环境特征等),并提供在该特征下的最优参数,那么就可以通过上述数据拟合出一个模型,并据此推测出新的数据库系统上何种参数最优。

该方法的优点是一旦训练好模型,推荐新参数的过程将非常快,缺点是训练模型比较复杂(需要收集大量的数据,这些数据本身就不是很容易获取)、模型的输入特征选择比较困难、如果系统发生变化则该模型需要重新训练。例如学术界比较著名的成果OtterTune便是采用了类似的方法。

4. 基于强化学习

强化学习(reinforcement learning,RL)在近些年发展迅速,基于深度学习的强化学习算法如DQN(deep q-networks,深度Q学习)、DDPG(deep deterministic policy gradient,深度确定性策略梯度算法)与PPO(proximal policy optimization,近端策略优化)等算法先后诞生,该类算法在游戏领域取得了比较好的效果,能够实现自动打游戏甚至游戏操作优于大多数的人类选手。与此同时,强化学习与监督学习不同,强化学习并不需要用户给定一个数据集,而是通过与环境进行交互,通过奖惩机制来学习哪些应该做,哪些不能做,从而给出更优的决策。

显然,强化学习能够应用到游戏领域,是因为游戏结果的好坏是比较明显的奖惩机制。输赢本身就是一个很好的价值导向,甚至能够不断获得经验值的游戏过程还能够得到连续不断的奖励,这就更容易让算法学到如何获取更多的经验。而反观数据库的调优过程,其实与游戏过程类似。数据库性能的好坏是比较明显的价值导向,数据库的参数配置就相当于游戏过程中的动作,数据库的状态信息也是可以获得的。因此,通过强化学习来进行数据库参数的调优是一个比较好的方案,该方法能够模仿DBA的调优过程,通过数据库性能的高低来激励好的参数配置。该方法的特点是能够从历史经验中进行学习,用训练后的模型进行参数推荐的过程也比较快,而且并不需要用户给定大量的训练数据。缺点是模型的训练过程比较复杂,算法中的奖励机制、数据库系统的状态等都需要精心设计,强化学习训练过程也比较慢。采用该类方法的代表性项目是由清华大学提出的QTune。

通过上述介绍,可以得出似乎并没有一种非常完美的方法能够覆盖到所有的应用场景。严格地讲,每类方法本身并没有优劣之分,只有更加适合业务场景的方法才能够称之为最优方法。因此,接下来将介绍一下openGauss开源的数据库参数调优工具X-Tuner,该工具综合了上述多种调优策略的优势。

2.3  X-Tuner的调优策略

总的来说,对数据库进行参数调优可以分为两大类,分别是离线参数调优和在线参数调优,X-Tuner同时支持上述两类调优模式。

(1) 离线参数调优是指在数据库脱离生产环境的基础上进行调优的,一般是在上线真实业务前进行压力测试,并通过压力测试的反馈结果进行参数调优。

(2) 在线参数调优是指不阻塞数据库的正常运行,在数据库运行中进行参数调优或推荐的过程。

具体来说,调优程序X-Tuner包含三种运行模式。

(1) recommend:获取当前正在运行的workload特征信息,根据上述特征信息生成参数推荐报告。报告当前数据库中不合理的参数配置和潜在风险等;输出当前正在运行的workload行为和特征;输出推荐的参数配置。该模式是秒级的,不涉及数据库的重启操作,其他模式可能需要反复重启数据库。

(2) train:通过用户提供的benchmark信息,迭代地进行参数修改和benchmark(一种用于测量硬件或软件性能的测试程序)执行过程,训练强化学习模型。通过反复的迭代过程,训练强化学习模型,以便用户在后面通过tune模式加载该模型进行调优。

(3) tune:使用优化算法进行数据库参数的调优,当前支持两大类算法,一种是深度强化学习,另一种是全局搜索算法(全局优化算法)。深度强化学习模式要求先运行train模式,生成训练后的调优模型,而使用全局搜索算法则不需要提前进行训练,可以直接进行搜索调优。如果在tune模式下,使用深度强化学习算法,要求必须有一个训练好的模型,且训练该模型时的参数与进行调优时的参数列表(包括max与min)必须一致。

无论是离线参数调优还是在线参数调优,X-Tuner都是支持的,他们的基本结构也是共用的。如图1所示,是X-Tuner各个模块的结构示意图以及交互形式。

图1  参数调优工具X-Tuner的逻辑结构图

如图1所示,X-Tuner可以大致分为DB侧、算法侧、主体逻辑模块以及benchmark,它的各个部分的功能说明如表1所示。

表1  X-Tuner的结构介绍


X-Tuner结构

说明

DB

通过DB_Agent模块对数据库实例进行抽象,通过该模块可以获取数据库内部的状态信息、当前数据库参数、以及设置数据库参数等。DB侧包括登录数据库环境使用的SSH连接

算法侧

用于调优的算法包,包括全局搜索算法(如贝叶斯优化、粒子群算法等)和深度强化学习(如DDPG

X-Tuner主体逻辑模块

通过Enviroment模块进行封装,每一个step就是一次调优过程。整个调优过程通过多个step进行迭代

benchmark

由用户指定的benchmark性能测试脚本,用于运行benchmark作业,通过跑分结果反映数据库系统性能优劣

1. 离线参数调优流程概述

X-Tuner利用长期在openGauss上进行参数调优的先验规则,根据系统的workload、环境特征推荐初始参数调优范围,该范围便是待搜索的配置参数空间。利用算法(如强化学习、启发式算法等)在给定的参数空间上不断进行搜索,即可找到最优的参数配置。

常规评价调优效果好坏的方法是运行benchmark,包括TPC-C、TPC-H以及用户自定义的banchmark,用户只需要进行少量适配即可。离线参数调优的流程图如图2所示。

图2  离线参数调优过程的流程图

对于离线调优,用户通过benchmark模拟真实环境中的workload,使用调优工具X-Tuner根据不同参数在benchmark上的表现来判断什么参数能够取得最佳表现。需要注意的是,整个离线调优过程是迭代式的,即设置完一次参数后,执行一次benchmark用于检验本次设置的参数好坏。上述过程称之为一次调优过程,那么X-Tuner只需要多次执行上述过程,即可找到一个最佳的参数配置。X-Tuner可以根据上一个调优过程的反馈,决定下一次调优中参数的寻找方向,这个过程也是优化算法的探索过程。

细心的读者可能会发现,上述过程是需要有一个初始参数配置的,这个初始参数配置对于已经训练好的强化学习模型来说,会利用模型进行初始化。若是采用搜索算法,则根据先验规则进行初始化。

由于某些数据库参数需要重启后方可生效,因此离线参数调优过程也可能是需要频繁地重启数据库的。离线调优过程与DBA手动调优过程比较相似,都是通过观察-试探-再观察-再试探进行的,只不过这个试探过程不是基于DBA的人工经验,而是通过算法的分析进行的。该过程也是比价耗时的,主要耗在执行benchmark上。

对于一些场景,可以采用explain命令替代,这样就可以省掉了执行benchmark的时间,但是explain并不能直接反映参数对缓冲区、WAL等数据库系统内部模块的影响,因此可使用的场景是有限的。业内的一个比较前沿的方法,是通过AI的方法,预估数据库的性能表现,一般称之为性能评估模型(performance model),通过该模型,可以省去执行benchmark的时间,从而压缩调优时间。不过该方法主要停留在理论界,距离在普适场景上的应用尚有差距,目前也在openGauss的演进方向中。

X-Tuner目前支持的强化学习算法主要为DDPG,支持的搜索算法主要为粒子群算法(particle swarm optimization,PSO)与贝叶斯优化算法(bayesian optimization)。

2. 在线参数调优流程概述

X-Tuner采集操作系统的统计信息和workload特征,根据训练好的监督学习模型或先验规则,推荐给用户对应的参数修改建议。在线参数调优过程的流程图如图3所示。

图3  在线参数调优过程的流程图

2.4  openGauss关键源码解析

X-Tuner在项目中的源代码路径为:openGauss-server/src/gausskernel/dbmind/tools/xtuner。

1. 项目结构

X-Tuner文件结构如表2所示。

表2  X-Tuner主要文件结构


文件结构

说明

setup.py

安装脚本

share

配置文件示例

test

单元测试文件的目录

tuner

调优程序主代码目录

tuner/algorithms

算法子模块

tuner/algorithms/pso.py

粒子群算法

tuner/benchmark

压力测试驱动脚本存储的目录

tuner/benchmark/sysbench.py

sysbench驱动脚本

tuner/benchmark/template.py

压力测试驱动脚本的模板

tuner/benchmark/tpcc.py

TPC-C驱动脚本

tuner/benchmark/tpcds.py

TPC-DS驱动脚本

tuner/benchmark/tpch.py

TPC-H驱动脚本

tuner/character.py

获取系统workload特征的模块

tuner/db_agent.py

封装数据库操作的模块

tuner/db_env.py

离线调优流程控制模块

tuner/env.py

保持与强化学习gym库的接口一致

tuner/exceptions.py

定义常见异常

t

上一篇: PSO:一种 particles swarm optimization 算法简介

下一篇: 简单易懂!详解第三部分:粒子群优化算法PSO