刘俊凯 发表于 2024-6-19 20:50:04

GaussDB技能解读——GaussDB架构先容(一)

目录
1 GaussDB 关键架构目的
2 GaussDB分布式架构
2.1 GaussDB 分布式关键技能架构
3  数据计算路由层(Coordinator)关键技能方案
3.1 分布式优化器
3.2 分布式实行框架

GaussDB是华为自主创新研发的关系型数据库,基于华为在数据库领域20多年的战略投入,通过多维度的技能创新,在行业实践中构筑了高可用、高安全、高性能、高弹性、高智能的技能优势,在数据库替换场景中,具备易摆设、易迁徙的特性。作为国内当前唯一可以或许做到软硬协同、全栈自主的数据库,GaussDB已经在金融、政务、能源、交通等关键信息基础办法行业积聚了丰富的实践履历,是企业数字化转型、核心数据上云、分布式改造的信赖之选。
从本期开始,Gauss松鼠会将一连推出GaussDB技能解读系列文章,带您了解GaussDB的架构及关键技能原理。本篇将从GaussDB 关键架构目的、GaussDB分布式架构、数据计算路由层(Coordinator)关键技能方案等三方面临GaussDB架构进行先容。
1 GaussDB 关键架构目的

GaussDB在架构设计上,采用组件化原则,分为GaussDB Kernel内核和GaussDB Kernel OM两部门。在产物形态上,提供面向云数据库服务GaussDB(for openGauss)的分布式安装包和集中式安装包,提供面向当地化安装的小型化安装包。
根据华为云提供的观察报告,当前全球数据库市场增长超预期,云是数据库增长最紧张驱动力。得益于云数据库的迅猛发展,AWS市场份额超越IBM,成为数据库市场空间第三位,聚焦公有云、混淆云构筑具备竞争力的可商用分布式数据库版本,数据库已成为公有云Top收入泉源,同时通过数据库服务可以或许更大地提拔公有云服务粘性。GaussDB Kernel面向云服务提供GaussDB产物,主要客户包罗金融(银行、证券、保险)行业、政府(政务云、财政等)和大企业客户。结合产物可信要求定义及可信实行计谋分析的内容,以及业界数据库厂商前沿动态,GaussDB Kernel在云服务场景中的架构目的按照一下几个维度来展开:


[*] 高性能:建立基于x86平台与鲲鹏平台的绝对性能领先,鲲鹏平台相对x86平台保证50%性能优势,到达单机170万tpmC,分布式全局强一致32节点1500万tpmC,承载用户关键业务负载;具备性能韧性本领,5倍压力下性能不抖动、十倍压力下系统不崩溃,同时具备抗过载逃生本领;具备大并发、低时延本领,单节点支持1万并发、单集群支持10万级并发访问请求,ms至秒级事件处理时延,支撑政企客户核心业务负载。
[*] 云原生:通过GTM-Lite技能轻量化处理全局读一致性点与写一致性点,集群扩展性到达256节点,未来通过全球时钟技能演进,在跨Region全局一致性下去除单点瓶颈;面向业务陡增等业务场景,构建基于哈希聚簇的存储结构和弹性扩容方案,实现秒级存储节点扩缩容和业务无感的计算节点弹性伸缩;构建分布式备机只读技能,只读性能提拔100%以上。
[*] 高可用:AZ内主备高可用,1主多备,RPO=0、RTO<10s;同城跨AZ高可用,RPO=0、RTO<60s;跨Region容灾,RPO<10s、RTO<5min;提供备份规复、PITR、闪回、ALT等企业级高可用特性;构建基于Paxos协议的多副本高可用和并行逻辑复制技能,实现RPO=0的同城双集群高可用容灾和基于流式复制的多地多中心容灾,保证机房级、区域级、都会级故障下的数据库高可用。
[*] 高安全:继承可信实行计谋中安全可信需求,从安全,韧性,隐私等维度构筑安全可信本领,结合业界安全技能前沿发展,设计全密态数据库和防窜改数据库,保证用户敏感数据免于泄露和窜改;构建数据库安全自治管控方法,辨认和拦截攻击者的异常行为;构建从接入、访问控制、加密到审计全方位纵深防御的安全防护体系。
[*] 高智能:面向云化场景故障运维诉求,基于AI技能,提供端到端自治运维管理本领,全面提拔数据库产物服务可靠性和可用性;构筑自学习数据库内核,尤其是智能优化器,办理数据库内优化实行过程中计划不准、无法自顺应等难题;结合业界前沿技能,构建库内AI引擎,基于SQL-like浅易语法,提供数据库内置的机器学习训练和推理本领,为用户提供普惠AI;提供向量数据库本领,支撑盘古大模型、NAIE-NetGPT和GTS领域知识库等场景,进步大模型的预测效率。
GaussDB Kernel提供的当地化版本的架构目的包括:


[*] 高性能:支撑业务1千并发本领,性能达1000+ TPS;
[*] 高可用:提供多种摆设形态的本领:一主一备、一主多备等;
[*] 高安全:支持数据库备份加密、网络毗连安全管理及传输加密;支持三权分立,即数据库管理员、安全管理员、审计管理员权限职责分离;支持访问控制;
[*] 高智能:提供丰富高效的DFx运维监测手段,后续朝向基于AI的自治运维调优方向发展,降低BCM相关产物或办理方案的运维成本,提拔易用性;
[*] 小型化:数据库安装包巨细<25MB,且数据库刚启动后的底噪内存<250MB。
2 GaussDB分布式架构

2.1 GaussDB 分布式关键技能架构



[*] Coordinator:  负责吸收SQL请求,路由分发请求到对应的数据节点。同时维护系统元数据(路由分片信息,表定义)。

https://img-blog.csdnimg.cn/img_convert/f9a6a6d9340e1f17f83b78cd5fbd95de.png
图1 Coordinator逻辑模型


[*] Datanode:  数据节点存储分片数据。副本复制采用Quorum/Paxos协议。

https://img-blog.csdnimg.cn/img_convert/0540e570f67832ded1da5ef336a129c3.png
图2 DN逻辑模型


[*] SECURITY: 安全子系统,主要包罗了Kerberos认证,登录认证,安全审计,角色管理与访问控制,安全通信,透明数据加密,防窜改账本,全密态数据,数据脱敏等功能。

https://img-blog.csdnimg.cn/img_convert/89107ffe246fba9dfc6b0e62f7415d67.png
图3 安全逻辑模型


[*] GTM:  全局事件管理器, 负责产生CSN号,提供全局统一快照。

https://img-blog.csdnimg.cn/img_convert/af1215d2fcca7dc2e33e5bc44762440d.png
图4 GTM逻辑模型


[*] CM:  集群管理系统, 主要包括 CM Agent,  CM Server和分布式设置中心。

https://img-blog.csdnimg.cn/img_convert/346cd56cc32335c378f4b2f54cdc84fe.png
图5 CM逻辑模型


[*] OM运维子系统,主要包括了安装,卸载,启动,停止数据库,备份规复,升级,扩容数据库,打补丁,节点替换, 巡检功能,故障定位定界,参数管理,初始化工具及当地客户端工具。

https://img-blog.csdnimg.cn/img_convert/db725bd7ead29af3639f0689818ea815.png
图6 OM逻辑模型


[*] AI子系统,主要自治运维管理系统,如索引保举、慢SQL诊断、分布键保举;库内AI引擎;智能优化器,如智能基数估计和计划自顺应选择。

https://img-blog.csdnimg.cn/img_convert/f152505456a81c57190d3775b95ce9f1.png
图7 AI逻辑模型


[*] 驱动子系统,包括支持JDBC、ODBC、Python、GO等主流数据库驱动接口,适用于Java/C/C++/python/go 应用步调开发者。对于高级开发者而言,亦可采用libpq动态库接口和ecpg接口的方式,对数据库进行接入访问。

https://img-blog.csdnimg.cn/img_convert/6ecf4839b36f4e93f22c637c1429823c.png
图8 驱动逻辑模型
关键模块2层逻辑模型:
存储引擎模块:

https://img-blog.csdnimg.cn/img_convert/e540866783955d5cd9f8212bde46c6e2.png
图9
SQL引擎:

https://img-blog.csdnimg.cn/img_convert/aa7f80fda5e3b0dc1931def12fd7418b.png
图10
兼容性和接口模块:

https://img-blog.csdnimg.cn/img_convert/45cbcaad046e6e7f4841b5f2038ae741.png
图11
基础组件:

https://img-blog.csdnimg.cn/img_convert/2c88bb2356ecdcb175ac8c76ba846963.png
图12
分布式管理:

https://img-blog.csdnimg.cn/img_convert/4ab34957cc8a42f614c1dc4a8778ac95.png
图13
3  数据计算路由层(Coordinator)关键技能方案

GaussDB Kernel V5版本的Catalog还是当地存储, 所以还需要思量catalog的持久化问题.未来演进元数据解耦,Coordinator 无状态, 就不需要思量Catalog持久化问题了。但是跨节点场景下的事件提交在Coordinator上还是要持久化的。

https://img-blog.csdnimg.cn/img_convert/196d64f086907251ded57460ce6fd424.png
图14 Coordinator模块图
路由信息:每个表数据共分16384个hash bucket来存储,每个DN对应存储多少个hash bucket的数据。SQL优化器模块会根据Query的条件主动剪枝DN。
Pooler毗连池:维护和每个DN毗连的socket信息,缓存建立的毗连。
3.1 分布式优化器

优化器的查询重写基础依赖于关系代数的等价变换。等价变换关系如下图所示:

https://img-blog.csdnimg.cn/img_convert/1aee44ab271470ce1b4bffece2643860.png
图15 关系代数的等价变换
基于规则的查询重写,基本规则如下。


[*] 常量化简:如 SELECT * FROM t1 WHERE c1=1+1; 等价于SELECT * FROM t1 WHERE c1=2;
[*] 消除DISTINCT:CREATE TABLE t1(c1 INT PRIMARY KEY, c2 INT); SELECT DISTINCT(c1) FROM t1; SELECT c1 FROM t1;
[*] IN谓词展开:SELECT * FROM t1 WHERE c1 IN (10,20,30); 等价于SELECT * FROM t1 WHERE c1=10 or c1=20 OR c1=30;
[*] 视图展开:CREATE VIEW v1 AS (SELECT * FROM t1,t2 WHERE t1.c1=t2.c2); SELECT * FROM v1; 等价于 SELECT * FROM t1,t2 WHERE t1.c1=t2.c2;
[*] 条件下移:t1 join t2 on … and t1.b=5 等价于 (t1 where t1.b=5) join t2
[*] 条件通报闭包:a=b and a=3 -> b=3
[*] 消除子链接:如 select * from t1 where exists(select 1 from t2 where t1.a=t2.a); 等级于 select * from t1 (semi join) (select a from t2) t2 where t1.a=t2.a;

查询重写规则较多,在此不一一列举。
在基于代价的查询优化技能上,主要关注三个关键问题。分别是:结果集行数估算、实行代价估算以及路径搜索。其核心目的是,为多个物理实行的代价进行评分,最后选择出一个最优的计划,输出到实行器。
行数估算方面,通过analyze手段,收集基表的统计信息,统计信息包括:各个数据表的规模、行数以及页面数等。在表中,也会统计各个列的信息,包括distinct值(该列不雷同的值的个数),空值的比例,MCV(most common value,用于纪录数据倾斜情况)以及直方图(用于纪录数据分布情况),根据基表统计信息,估算过滤、join的中间结果统计信息。未来将基于AI进行多维度统计信息收集,收集更准确的行数信息,以辅助更优的计划选择。
实行代价估算方面,根据数据量估算不同算子的实行代价,各个实行算子的代价之和即为实行计划的总代价。算子的代价,主要包罗几个方面:CPU代价、IO代价、网络代价(分布式多分片场景)等。未来需要根据物理情况的不同,调解不同算子的实行代价比例,同时通过AI技能构建更精准的代价模型。
表1 代价估算算子种类
算子分类作用主要算子 表扫描算子
从存储层扫描数据
Seqscan, Indexscan
毗连算子
进行两表毗连
Hashjoin, MergeJoin, Nestloop
聚集算子
进行聚集操作
Hashagg, Groupagg
网络传输算子
网络上传输数据
Stream(redistribute, broadcast)
排序算子
进行排序算子
Sort
路径搜索方面,GaussDB Kernel V5采用自底向上的路径搜索算法,对于单表访问路径,一般有两种:


[*] 全表扫描:对表中的数据逐个访问。
[*] 索引扫描:借助索引来访问表中的数据,通常需要结合谓词一起使用。
优化器起首根据表的数据量、过滤条件、和可用的索引结合代价模型来估算各种不同扫描路径的代价。例如:给定表定义CREATE TABLE t1(c1 int); 假如表中数据为1,2,3…100000000一连的整型值并且在c1列上有B+树索引,那么对于SELECT * FROM t1 WHERE c1=1; 来说,只要读取1个索引页面和1个表页面就可以获取到数据。然而对于全表扫描,需要读取1亿条数据才能获取同样的结果。在这种情况下索引扫描的路径胜出。
索引扫描并不是在所有情况下都优于全表扫描,它们的优劣取决于过滤条件可以或许过滤掉多少数据,通常数据库管理系统会采用B+树来建立索引,假如在选择率比较高的情况下,B+树索引会带来大量的随机I/O,这会降低索引扫描算子的访问效率。比如SELECT * FROM t1 WHERE c1>0;这条语句,索引扫描需要访问索引中的全部数据和表中的全部数据,并且带来巨量的随机I/O,而全表扫描只需要顺序的访问表中的全部数据,因此在这种情况下,全表扫描的代价更低。
多表路径天生的难点主要在于如何枚举所有的表毗连顺序(Join Reorder)和毗连算法(Join Algorithm)。假设有两个表t1和t2做JOIN操作,根据关系代数中的交换律原则,可以枚举的毗连顺序有t1 × t2和t2 × t1两种,JOIN的物理毗连算子有Hash Join、Nested Loop Join、Merge Join三种类型。这样一来,可供选择的路径有6种之多。这个数量随着表的增多会呈指数级增长,因此高效的搜索算法显得至关紧张。GaussDB Kernel 通常采用自底向上的路径搜索方法,首天赋生了每个表的扫描路径,这些扫描路径在实行计划的最底层(第一层),在第二层开始思量两表毗连的最优路径,即枚举计算出每两表毗连的大概性,在第三层思量三表毗连的最优路径,即枚举计算出三表毗连的大概性,直到最顶层为止天生全局最优的实行计划。假设有4个表做JOIN操作,它们的毗连路径天生过程如下:


[*] 单表最优路径:依次天生{1},{2},{3},{4}单表的最优路径。
[*] 二表最优路径:依次天生{1 2},{1 3},{1 4},{2 3},{2 4},{3 4}的最优路径。
[*] 三表最优路径:依次天生{1 2 3},{1 2 4},{2 3 4},{1 3 4}的最优路径。
[*] 四表最优路径:天生{1 2 3 4}的最优路径即为最终路径。
多表路径问题核心为Join Order,这是NP(Nondeterministic Polynomially,非确定性多项式)类问题,在多个关系毗连中找出最优路径,比较常用的算法是基于代价的动态规划算法,随着关联表个数的增多,会发生表搜索空间膨胀的问题,进而影响优化器路径选择的效率,可以采用基于代价的遗传算法等随机搜索算法来办理。
另外为了防止搜索空间过大,可以采用下列三种剪枝计谋:


[*] 尽大概先思量有毗连条件的路径,尽量推迟笛卡尔积。
[*] 在搜索的过程中基于代价估算对实行路径采用LowBound剪枝,放弃一些代价较高的实行路径。
[*] 保留具有特殊物理属性的实行路径,例如有些实行路径的结果具有有序性的特点,这些实行路径大概在后序的优化过程中避免再次排序。
分布式实行计划天生方面,相关关键技能流程如图所示:

https://img-blog.csdnimg.cn/img_convert/cffba13258d6249800eaa3238f6dd7e2.png
图16 分布式实行计划天生
3.2 分布式实行框架

GaussDB Kernel V5 实行框架位于SQL优化器与存储引擎之间,负责根据优化器输出的实行计划,实行数据存取以及相关的计算操作,将相关结果返回到客户端。其目的是,更好地利用各个节点的计算资源,更快地完成实行任务,并返回结果。


[*] 单节点实行引擎:GaussDB Kernel V5 支持行存表的行实行引擎,以及列存表向量化实行引擎,提供Adaptor算子(RowAdapter,VectorAdapter)支持行列存储的自顺应切换。对于行实行引擎来说,颠末逐层的算子处理,一次处理一个元组,直到再无元组为止,具体过程不在此处赘述。对于列实行引擎来说,一次处理一个batch,尽量读取更多的数据,减少IO的次数,提供高CPU的利用效率,流水线实行过程中,调用次数尽量少。

https://img-blog.csdnimg.cn/img_convert/dc79e7e3cf4ca058084f19864bbe737a.png
图17 行列存实行引擎主动切换


[*] 实行引擎主要算子:实行引擎提供算子种类如下。

https://img-blog.csdnimg.cn/img_convert/c14251848891f872b6ce9159744f3154.png
图18 实行引擎主要算子
实行算子主要功能具体列表如下。
扫描算子(Scan Plan Node):扫描节点负责从底层数据泉源抽取数据,数据泉源大概是来自文件系统,也大概来自网络(分布式查询)。一般而言扫描节点都位于实行树的叶子节点,作为实行数的数据输入泉源,典型代表SeqScan、IndexScan、SubQueryScan。
表2 扫描算子
算子类型含义 Seqscan
顺序扫描行存储引擎
CstoreScan
扫描列存储引擎
DfsScan
顺序扫描HDFS存储引擎
Stream
扫描网络算子(分布式数据库特有)
BitmapHeapScan
BitmapIndexScan
利用bitmap获取元组
TidScan
通过Tid获取元组
SubQueryScan
子查询扫描
ValueScan
扫描Value列表
CteScan
扫描CommTableExpr
WorkTableScan
扫描中间结果集
FunctionScan
函数扫描
IndexScan
索引扫描
IndexOnlyScan
直接从索引返回元组
ForgeinScan
外部表扫描
StreamScan
网络数据扫描

控制算子(Control Plan Node):控制算子一般不映射代数运算符,是为了实行器完成一些特殊的流程引入的算子,例如Limit、RecursiveUnion、Union
表3 控制算子
算子类型含义 Result
顺序扫描行存储引擎
ModifyTable
INSERT/UPDATE/DELETE操作的算子
Append
多个关系集合的追加操作
MergeAppend
多个有序关系集合的追加操作
BitmapAnd
顺序扫描HDFS存储引擎
BitmapOr
扫描网络算子(分布式数据库特有)
RecursiveUnion
利用bitmap获取元组
物化算子(Materialize Plan Node):物化算子一般指算法要求,在做算子逻辑处理的时间,要求把下层的数据进行缓存处理,由于对于下层算子返回的数据量不可提前预知,因此需要在算法上思量数据无法全部放置到内存的情况,例如Agg、Sort
表4 物化算子
算子类型含义 Materialize
物化
Sort
对下层数据进行排序
Group
对下层已经排序的数据进行分组
Agg
对下层数据进行分组(无序)
Unique
对下层数据进行去重操作
Hash
对下层数据进行缓存,存储到一个hash表里
SetOp
对下层数据进行缓存,用于处理intersect等集合操作
WindowAgg
窗口函数
Limit
处理limit子句
毗连算子(Join Plan Node):这类算子是为了应对数据库中最常见的关联操作,Join表关联。
表5 毗连算子
算子类型含义 Nestloop
对下层两股数据流实现循环嵌套毗连操作
MergeJoin
对下层两股排序数据流实现归并毗连操作
HashJoin
对下层两股数据流实现哈希毗连操作



[*] 线程池模型
每个组件 CN,  DN,  GTM, CMS  都是独立历程模型,  每个历程内部采用线程池模型。

https://img-blog.csdnimg.cn/img_convert/4f5e55c8fc0bf8cb35bd427ca810a8d4.png
图19 线程池模型


[*] ThreadPoolControler:线程池总控,负责线程池的初始化和资源管理
[*] ThreadSessionControler :会话生命周期管理
[*] ThreadPoolGroup:线程组,可以定义灵活的线程数量和帮核计谋
[*] ThreadPoolListener: 监听线程,负责变乱的分发和管理
[*] ThreadPoolWorker: 工作线程
设计关键要点:


[*] 线程池根据CPU的core分成多个thread group
[*] 每个thread group里有一个listen thread和多个worker thread
[*] listern thread负责监听一批活动毗连,同时分配任务给worker thread
[*] worker thread以事件维度担当任务派发来实行
本篇中,GaussDB架构从GaussDB 关键架构目的、GaussDB分布式架构、数据计算路由层(Coordinator)关键技能方案等三方面展开了先容,下篇文章将从数据持久化存取层(DataNode)关键技能方案、全局事件管理层(GTM)关键技能方案、集群管理层(CM)关键技能方案等方面先容GaussDB架构,敬请期待!
欢迎小同伴们交流~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: GaussDB技能解读——GaussDB架构先容(一)