DM7总体构架解析
概述DM7数据库管理系统是在总结DM系列产品的经验和教训基础上,吸收主流数据库产品优点,学习适应OLAP应用的专用数据库技术,采用类JAVA的虚拟机技术,重新设计的新一代数据库产品。采用全新的体系架构,极大提升了达梦数据库产品的性能、语言丰富性、可扩展性,能同时兼顾OLTP和OLAP请求,从根本上提升了DM产品的品质。
相对于DM6,DM7中新增和改进特性多达数百项,本文将为您介绍DM7众多新特性中最为重要和最具创新性的部分。
系统核心构架 DM7采用高效的多线程体系结构,由不同的功能线程协同完成服务器的整体功能。
图1 系统结构
系统总体结构如图1所示,数据库内核提供词法和语法分析、事务管理、封锁、多核查询引擎、安全管理、备份恢复、缓冲区、日志以及操作系统和硬件抽象层等功能。在此基础上,用户可以基于数据库内核来搭建两种类型的集群结构:无共享的大规模并行集群和共享磁盘的集群。在客户端,用户可以通过DM7提供的各种标准接口来访问达梦数据库或者是数据库集群,也可以通过各种客户端工具来对达梦数据库进行管理。
操作系统和硬件抽象层:对操作系统和硬件环境提供封装API,使得一套源代码可以在不同平台下运行,屏蔽操作系统和硬件的差异,简化上层处理逻辑。各种操作系统和硬件环境下保持一致的存储格式和消息通信格式。
缓冲区管理:该模块将用户需要访问的数据从磁盘加载到内存中,并提供高效、高并发的缓冲区访问和淘汰机制,使得可以支撑大量并发用户的数据访问。
日志管理:提供事务的持久性能力,任何已提交的事务都持久性的生效。
事务管理:提供多版本并发控制机制,使得系统能够保证事务的原子性、隔离性,并提供很高的并发访问能力,查询在任何时候能够不被封锁。
锁管理:提供并发更新数据时的封锁能力,避免出现数据的不一致。
多核查询引擎:内置多个查询处理引擎,针对不同的查询使用自适应的查询引擎,如全文检索引擎、对象-关系数据处理引擎、空间数据处理引擎等。
安全管理:提供内置的安全机制,使得系统的安全级别能够达到四级。
备份恢复管理:提供各种备份恢复功能,如完整备份、增量备份、并行备份与恢复、基于时间点的恢复等。
无共享集群:基于DM7数据库提供基于数据划分的高性能大规模并行集群功能,多个节点能够并行处理同一个请求,提升系统性能,并且通过节点间的守护技术来保证系统中的任意节点出现故障时,仍然能够提供不间断的服务。
共享磁盘集群:基于DM7数据库提供共享磁盘架构的集群功能,多个集群节点共享一份数据,能够通过增加/删除节点来提升系统性能,并且也能够在节点出现故障时提供不间断的服务。
JDBC/ODBC等接口:提供应用中常见的JDBC、ODBC、.NET DATA PROVIDER、PHP、OLEDB等接口,供各种应用程序调用。
管理/交互式工具:提供图形化的数据库管理和SQL执行工具,便于DBA/数据库使用人员对数据库直接进行管理。
性能监视工具:用于监控系统性能,帮助数据库管理人员分析系统瓶颈/错误,并提供适当的系统调整/优化建议。
迁移工具:用于从其他各种主流数据库或者较低版本的达梦数据库迁移数据到最新的DM7数据库管理系统。
控制台工具:用于配置达梦数据库的各种参数以及进行脱机备份与恢复等。
数据仓库套件:
其他工具:如数据库重演工具用于帮助重现问题、快速数据装载工具用于快速将文本文件中的数据装载到DM7中等等。
高性能查询处理技术 DM7采用基于代价的查询优化策略,使用了多趟处理策略,结合面向堆栈的虚拟机执行器,并借助重用等优化手段,争取达到最优的查询效果。
查询语句分析优化过程并非一蹴而就,而是分多个阶段进行变换处理,直至最终生成物理查询计划。
PARSE:进行语法检查,将原始语句转换为对应语法树。
PHASE A:进行语义分析,将标识符翻译为对应字典对象。
PHASE B:关系变换。
1、按照规则将语法树变换为关系(REL)树;
2、处理子查询,将IN、EXISTS查询变换为半连接(SEMI JOIN);
3、处理子查询的相关性,将相关性去除,变为与引用表的连接(JOIN)。
PHASE C:利用统计信息进行代价优化。
1、对于单表查询,选择合适索引。
2、对于多表链接,选择连接顺序,选择物理连接操作符
PHASE E:表达式优化
1、重用语句中相同表达式,避免重复计算
2、尽量选择批量指令执行计算,减少反复调用的代价
PHASE G:并行优化,构造并行操作符,使用多线程处理水平分区表的查询。
DM7查询优化器利用优化规则,将所有的相关子查询变换为等价的关系连接,从而取消查询的嵌套关系。
例如:
select count(*)
from c_order
where exists (
select *
from c_order_line
where o_id = ol_o_id
and ol_quantity > 10
)
上面的关系树就会被转化为与其等价的如下语句(伪SQL)的关系树:
select count(*)
from c_order A semi_join (
select B.ROWID
from c_order_line, c_order B
where B.o_id = ol_o_id and ol_quantity > 10
group by B.ROWID
) on A.ROWID = B.ROWID
对于半连接或其中嵌套的因去除相关型而引入的连接,可以基于一定的规则进行优化。如上例中关系树可再被优化为如下语句的关系树:
select count(*)
from c_order semi_join c_order_line
where A.o_id = ol_o_id and ol_quantity > 10
相关子查询的平坦化,极大降低了代价优化的算法复杂程度,使得优化器可以更容易地生成较优的查询计划。
DM7在之前版本虚拟机的基础上,为进一步完善了功能、提高执行效率,做了如下改进。
1. 采用以字长为分配单位的标准堆栈,提高空间利用率,充分利用CPU的2级缓存,提升性能。
2. 增加栈帧概念,方便实现函数/方法的跳转,为PL/SQL脚本的调试提供基础。
3. 增加内存运行堆的概念,实现对象、数组、动态的数据类型存储。
4. 采用面向栈的表达式计算模式,减少虚拟机代码的体积、数据的移动。
5. 重新定义指令系统,增加对对象、方法、参数、堆栈的访问,便于实现PL/SQL的执行。
而实现的虚拟机结构如下图所示。
DM7面向堆栈的虚拟机执行器,可以在指令与操作符间平滑地切换执行,也能够轻松地实现过程/函数的调用。借助简单高效的指令系统,以及直观快速的堆栈数据传输机制,可以有效提升SQL脚本或过程/函数的执行效率。
SQL语句从分析、优化到实际执行,每一步都需要消耗系统资源。查询计划的重用,可以减少重复分析操作,有效提升语句的执行效率。DM7采用参数化常量方法,使得常量值不同的查询语句,同样可以重用查询计划。经此优化后的计划重用策略,在应用系统中的实用性明显增强。
查询结果集同样可以缓存。相同的查询语句,如果涉及表数据没有变化,则可以直接重用缓存的结果集。查询结果缓存,在数据变化不频繁的OLAP应用模式,或存在大量类似编目函数查询的的应用环境下有非常良好的性能提升效果。
在服务器端实现结果集缓存,可以在提升查询速度的同时,保证缓存结果的实时性和正确性。
强大灵活的语言分析达梦数据库对数据库的操作提供了灵活语言支持。达梦不仅支持功能强大的PL/SQL,还支持类C语言的BLOCK语句块。
1. PLSQL
PL/SQL是达梦数据库的过程化语言,包括一整套的数据类型、条件结构、循环结构和异常处理结构,PL/SQL可以执行SQL语句,SQL语句中也可以使用PL/SQL函数。PL/SQL支持所有SQL数据类型和所有SQL函数。支持游标、%ROWTYPE、%TYPE、EXCEPTION和数组类型,同时支持所有达梦对象类型。例如:
declare
cursor cc(x int) is select id, name from sysobjects where id < x;
r cc%rowtype[];
cnt int;
k cc%rowtype;
begin
open cc(20);
cnt = 10;
r = new cc%rowtype[cnt];
for i in 1..cnt loop
fetch cc into r[i];
end loop;
for i in 1..9 loop
for j in i + 1..10 loop
if r[i].name > r[j].name then
k = r[i];
r[i] = r[j];
r[j] = k;
end if;
end loop;
end loop;
for i in 1..cnt loop
print r[i].id;
print r[i].name;
end loop;
close cc;
end;
/
2. BLOCK语句块
达梦数据库提供了类C语言的BLOCK语句块,支持C语言的基本数据类型,支持C语言格式的条件结构、循环结构和异常处理结构,GOTO等结构,BLOCK语句块中支持SQL语句和函数。另外BLOCK语句块中还支持引用游标、%ROWTYPE、%TYPE、EXCEPTION、数组类型和记录类型。例如:
{
sysobjects%rowtype r;
sysobjects%rowtype y[];
ref cursor cc;
int i;
y = new sysobjects%rowtype[10];
open cc for 'select * from sysobjects where id < 10';
i = 1;
do
{
fetch cc into r;
if(cc%found)
{
y[i] = r;
i++;
}
}
while(cc%found);
for (i = 1; i <= 10; i ++)
{
r = y[i];
print r.id;
print r.name;
}
}
/
大规模并发处理技术 DM7在事务处理、任务调度、数据组织等各个方面充分发挥多线程并发特性,减少同步冲突,为大规模的并发处理提供有效保障
事务处理的并发改进首先体现在对多版本并发控制的支持上。DM7采用“历史回溯”策略,对于数据的多版本并发控制实现了原生性支持。DM7改造了数据记录与回滚记录的结构。在数据记录中添加字段记录最近修改的事务ID及与其对应的回滚记录地址,而在回滚记录中也记录了该行上一更新操作的事务ID与相应回滚记录地址。通过数据记录与回滚记录的链接关系,构造出一行数据的完整更新历史各版本。
使用多版本并发控制技术,查询与更新操作间互不干扰,有效提高了高并发应用场景中的执行效率。
其次,DM7采用DDL高并发技术, DDL语句在分析阶段就转换为基本的DML操作,借助字典对象本地化策略,在DDL执行期间不必封锁整个数据字典,可以有效降低DDL操作对整体系统并发执行的影响。
DM7事务处理中还通过对行锁资源的优化改善封锁性能。DM7改进了行锁的结构,在锁上添加位图,记录相邻的一组数据行。在默认情况下,一个行锁最多可以登记64个连续的行。在连续更新操作中,这种构造可以有效减少实际生成行锁的个数,进而可以降低锁升级的概率以及以此带来的副作用。
DM7采用更加有效的异步检查点机制,不再长时间占用系统缓冲区,逻辑更加简单,速度更快,对整体系统运行影响更小。
在任务调度方面,DM7采用的动态可调的工作线程机制,可以对实际应用环境自动进行适应调整,在快速反应与资源控制使用间很好地平衡。
DM7的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。这样可以保证用户所有请求及时响应。但当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列。而等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。
在执行模块中,采用了查询内并行处理的机制。DM7支持水平分区技术,将一个数据表拆分为多个相对独立的子表。在对分区表执行查询操作时,借助并行操作符,可以由多个子线程分别扫描不同的子表数据,从而实现查询内的并行处理。
在数据的组织方面同样有对并发的支持改进。DM7摒弃原有的逻辑ROWID,改为采用实际物理地址作为记录的标识。采用物理ROWID,取消了数据记录中的附加ROWID字段,减少了数据规模。在进行并发数据装载插入时,不再需要因获取顺序的ROWID而相互等待,也不必为ROWID排序而争抢B树资源,从而提升并发处理效率。
高效的内存管理根据系统中子模块的不同功能,对内存采用了不同的管理模式。
1. 内存池
小片内存的申请与释放频繁发出系统调用,可能会引起线索切换,降低系统运行效率。内存池一次向操作系统申请一片较大内存,当系统在运行过程中需要申请内存时,则在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给内存池。系统对内存池有效的管理,使小片内存的申请与释放不会对系统影响太大。
2. 数据缓冲区
为缓解全局缓冲区的访问瓶颈问题,进一步的提高效率,DM7采用了多缓冲区机制,将全局缓冲区划成多个分片。数据页按照其页号,进入各自缓冲区分片。每个缓冲区分片有自己的临界区,访问不同的缓冲区分片,不会导致访问冲突。这种机制可以降低全局数据缓冲区并发访问的冲突概率。
3. 字典缓冲区
每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,DM为字典设置了其专有的缓冲区。为保证事物的隔离性,DM中的执行计划并不是直接使用字典缓冲区的内容,而是根据字典缓冲区的内容生成一份自己独有的字典对象并使用。
高可用性 1. 快速的自动故障恢复
DM7服务器始终只是一个进程,无论采用何种保护措施,总是不可能完全避免系统故障的情况,如操作系统崩溃、机器掉电等。当外部故障消除后,DM服务器重新启动,需要快速消除当机造成的破坏,恢复到故障前状态,重新为客户端提供数据服务。而帮助数据库系统从故障中恢复,避免数据丢失和完整性破坏的工具,就是DM7的REDO日志系统。
DM7改造了REDO日志的管理策略。采用逻辑LSN值替代了原有的物理文件地址映射到LSN生成机制,极大简化了REDO日志的处理逻辑,从而也提高了日志自身的稳定性与可靠性。REDO日志可以压缩存储,有效减少IO代价。
在故障恢复时采用了并行处理机制执行REDO日志,有效减少重做花费的时间。
2. 基于redo日志的主备系统
主备系统是DM数据库管理系统提高容灾能力的重要手段。系统由一台主机与一或多台备机构成。主机提供正常的数据处理服务,备机则时刻保持与主机的数据同步。一旦主机发生故障,备机中的一台立刻可以切换成为新的主机,继续提供服务器。主备机的切换是通过服务器、观察器与接口自动完成的,对客户端几乎完全透明。
DM7的主备系统基于优化后的REDO日志系统开发,功能更加稳定可靠。主备机间传递压缩的日志数据,通信效率大大提升。
DM7主备环境搭建非常简单。首先在主机生成完全备份,还原到备机上。然后连接主备机器。主机就可以利用归档日志自动与备机同步数据。主备系统搭建就此完成。利用备份文件与归档日志,主备环境的搭建不再需要繁琐的操作或冗长的时间等待。
服务器新增了配置模式,DM7服务器系统可以在不停机状态下在单机系统与主备系统间平滑变换,其在特殊环境下的实用性不言而喻。
借助改进的字典缓存机制,DM7的主备系统可以提供全功能的数据库支持。客户端访问主机系统没有任何的功能限制,而备机同样可以作为主机的只读镜像,支持客户端的只读查询请求。
3. 可靠的备份与恢复
DM数据库系统可以提供数据库或整个服务器的冷/热备份以及对应的还原功能,达到数据库数据的保护和迁移。
DM7在原有数据库级备份/还原功能基础上,新增了表级物理备份功能。
表级备份操作将指定表B树的所有数据页保存在备份文件中,并在控制页中记录其关联信息。还原时,从目标数据段中逐个分配新页,复制内容,并按照记录中关联信息重新构造还原出新的B树。
表级物理备份兼具了物理备份的快速性和逻辑备份的针对性,具有很强的实用性。表级备份可以作为特定对象数据迁移与快速装载的解决方案。基于表级备份技术的进行数据库的备份还原,还可以达到数据库文件的重组与收缩目的。
4. 逻辑日志
DM7在物理的REDO日志之外,又添加了逻辑日志。逻辑日志记录数据库表上的所有插入、删除、更新等数据变化。可以指定部分表记录逻辑日志,也可以设置所有表记录。借助逻辑日志,DM7系统可以提供操作分析、数据重演以及数据复制等高级功能。
5. 高级复制
DM7的复制功能基于逻辑日志实现。主机将逻辑日志发往从机,而从机根据日志模拟事务与语句重复主机的数据操作。相对语句级的复制,逻辑日志可以更准确地反映主机数据的时序变化,从而减少冲突,提高数据复制的一致性。
海量数据分析在数据分析型应用中,查询往往需要连续扫描超多行数据。这对数据的快速处理提出了新的要求。在DM7系统中,采用列存储加快数据的IO装载,而后,数据的批量处理则成为快速处理的利器。
1. 列式存储
列存储表是相对普通的行存储表而言的,其间主要的不同就是列存储表的每一个列的数据都是存储在一起的,它不再是以记录为单位存储。一批数据存储在一个区中,区中记录有最大值,最小值。
列存储的存储特点,最明显的重要好处之一,就是由于查询中的选择规则是通过列来定义的,每个区描述项中都存储了区数据中的最大值及最小值,并且每个列的数据都是连续存储,因此整个列存储表的每个列是自动索引化的。
使用列存储表组织数据的另一个优点就是,列存储在压缩方面比传统的关系型数据库更加有效。
使用列存储表组织数据的另一个重要优势是读取的数据量以及其吞吐量。基于列来读取数据,仅仅需要读出想要了解的数据。
2. 分段式数据压缩
传统的普通行存储表数据不能以一种通用的方式进行压缩,主要是由于存在以下两个问题:
1) 按行存储的数据存储方式不利于压缩。这是因为行存储的每一个列的数据类型一般不相同,如果一起压缩时,重复并不多,压缩效率非常低,所以一般情况下是每个列单独做压缩,但我们还是发现,即便这样,行存储数据的压缩,压缩率最多能有5-10%;
2) 在OLTP 环境中,大量读取和更新混杂在一起。每一次更新需要进行压缩操作,而读取只需解压缩操作,大多数的数据压缩算法在压缩时比解压缩时慢4 倍。这一开销将明显降低OLTP 数据库引擎的事务处理效率而使得数据压缩的代价昂贵到几乎不能忍受。
在数据仓库应用中,数据压缩可以用小得多的代价换取更大好处。其中包括减少对于存储量的要求;增大数据吞吐量,这相当于减少查询响应时间。
DM7列存储支持了数据压缩。这是由于每列的数据按列并且连续存储,相邻接的字段值具有相同的数据类型,其二进制值的范围通常也要小得多,所以压缩更容易,压缩比更高。经过我们长期试验及总结,对按列存储的数据通常能得到大于50%的压缩。这使得达梦数据库的列存储表在获得查询的优良性能的同时,减少了对于存储空间的需求。
DM7列存储表的实现方式是每一个列都分成若干个区,这样方便存储对应数据的统计信息,提高对数据的查询速度,更重要的是这样有效的将每个列的数据分片处理,分片管理,这样就可以在扫描数据时不一定进行全表扫描,同时在压缩数据时,将每一个区做为一个压缩包进行处理(分段压缩机制),而不是将整个数据列做为压缩数据(如此管理困难并且效率太低),这种分段压缩很有效的提高了系统效率,因为如果一个区需要进行扫描,则将这个区载入内存并解压,后面处理时这个区的所有数据都存放在内存中,这不仅减少了IO量,同时还提高了查询速度。
3. 批量数据处理
当数据读入内存后,按照传统策略,需要经过逐行过滤、连接、计算等操作处理后,才能生成最终结果集。在海量的数据处理场景下,必然产生大量重复的函数调用及数据的反复拷贝与计算代价。
在DM7中引入了数据的批量处理技术,即读取一批,计算一批,传递一批,生成一批。数据批量处理,具有显而易见的好处:
l 内存紧靠在一起的数据执行批量计算,可以显著提升操作系统CACHE命中率,从而提升内存处理效率。
l 数据成批而非单行地抽取与传递,可以显著减少在上下层操作符间流转数据的函数调用次数。
l 采用优化的引用方式在操作符间传递数据,可以有效降低数据复制的代价。
l 系统标量函数支持批量计算,可以进一步减少函数调用次数。
采用批量数据处理策略后,大批量数据查询的效率可以成倍提升。
DM7海量并行处理框架 DM7的海量并行处理(Massive Parallel Processing后文简称MPP)框架提供提供高端数据仓库解决方案,实现海量数据存储和处理、高并发处理、高性价比、高可用性等功能,以极低的成本代价,为客户提供业界领先的计算性能。
MPP架构中数据存储和查询的自动化并行,插入的数据会被自动分区保存到相应的节点,查询时在各节点的数据库引擎上并行执行查询,并将所有结果数据自动汇集到原查询节点上。
MPP架构采用的是完全对等的无共享架构,每个数据库服务器称为一个执行节点(Execute Point,后文简称EP),每个EP都是一个独立的达梦数据库。各个EP节点的功能完全一样,用户可连接MPP系统内的任意EP节点进行数据操作。MPP整体的结构如下图所示。
MAL系统负责在执行查询计划的过程中在协调任务相关的节点之间高效驱动数据流,完成发送消息、移动数据、收集操作结果等功能。EP节点之间的消息通信和数据移动都是通过嵌入在DM数据库系统内部的MAL通信系统完成。
MAL系统每个消息相当于一封邮件投递到对应的邮箱中,一旦收到信件,立刻通知系统从邮箱中取出信件,对信件进行处理,完成数据的整合。这种高效的通信机制有利于提高并行查询的效率,充分发挥高速网络的优势。
DM7采用的是基于散列的方法自动将数据分配到各个EP节点中,即在创建一个表的时候,用户指定一个或多个列作为“哈希分布”键,或者默认选择表的第一列,系统针对每个插入的数据行计算其哈希值,将数据放在其所属的EP节点上。
MPP系统在单节点的基础上增加了三个通讯操作符,包括收集、分发和广播,它们的作用是负责主EP和从EP,以及从EP之间的数据同步、移动。MPP系统的查询计划是在单节点普通查询计划的基础上,选择合适的位置插入通讯操作符节点,可充分利用单节点系统的查询优化机制,生成最优的查询计划。
用户连接上任意EP的操作,通过通讯操作符的执行,都可以将计划分发到各个EP上,在分布并行处理后将结果汇总返回。
对每个EP节点都可以配置数据守护功能,从而达到节点故障自动切换和恢复的功能,满足用户对数据可靠性、安全性的需求,解决由于节点的数据库实例异常、硬件故障等原因导致的数据库服务长时间中断问题,提高了系统的可用性和可靠性。
安全性 DM7在原有的安全级别上进一步提高了安全性。
1. 身份鉴别
DM7在原有的操作系统身份鉴别、基于Kerberos的集中式验证、数据库身份鉴别等方式基础上,新增了基于 PKI 的身份鉴别方式,同时支持多种鉴别机制相结合。
2. 多权分立
DM7对原有的三权分立权限管理模型进行改造,实现基于以数据拥有者为核心的“职责划分”权限模型,以应用系统中各角色所承担的职责为依据,细致设定各角色所能拥有的系统权限。相对于传统模型,新模型将数据控制权从数据库管理员手中转移到了数据拥有者手中,使得管理员与非授权的数据使用人员均无法对数据进行访问、探查。
3. 标记与强制访问控制
DM7针对国标《信息安全技术-数据库管理系统安全技术要求》中第四级-结构化保护级的要求,通过扩展标记对象的范围,支持对所有主体与客体进行默认标记或由系统安全员进行标记。同时,标记粒度进一步细化到列级,支持对所有主体与客体进行强制访问控制。
4. 安全审计
DM7的审计进一步提高了审计数据的独立性,审计文件可以脱离数据库系统保存和复制,提供专用工具进行检索、合并等维护操作。审计员可以设置将审计记录分类存储到不同的审计文件,提高了审计配置的灵活性。审计员可以设置将审计记录同时写入多个审计文件,保障审计记录的可靠性。同时,DM7还支持实时审计分析,实现了实时报警生成、违例进程终止、潜在侵害分析、基于异常检测和简单攻击探测。
5. 加密引擎
DM7实现了加密引擎,可以与支持线程级的密码模块协调工作,可以实现多线程数据流之间的无缝任意切换,支持现有的各种流密码、分组密码及其所有的工作模式、非对称密码,解决了多密码算法、多密钥的随机交叉加密的问题。
结语作为达梦公司迄今为止最具创新性的产品,DM7数据库管理系统创造性地融合了当今信息处理的各种前沿技术,实现了从数据库技术追赶到技术引领的跨越。新一代产品在通用性、高性能、可靠性、安全性、扩展性、数据分析、易用性等方面都有大幅增强。其众多的企业级特性的实现使得DM7完全能够满足大、中型企业以及金融、电信等核心业务系统的需要,是理想的企业级数据服务平台。