浅谈DM达梦数据库体系结构概念
-
DM逻辑结构
DM和Oracle一样也分数据库和实例,两者的概念也基本一致。
但是不同点在于:达梦是单进程、多线程,而oracle是多进程的。
DM这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。
一般是一个数据库对应一个实例,但是DSC(DM共享集群)多个实例对一个数据库。
DM8 逻辑存储结构如下:
1>数据库由一个或多个表空间组成;
2>每个表空间由一个或多个数据文件组成;
3>每个数据文件由一个或多个簇组成;
4>段是簇的上级逻辑单元,一个段可以跨多个数据文件;
5>簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
6>页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
-
DM物理存储结构
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。
典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等。
2.1配置文件
配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩展名,如dm.ini, dmarch.ini。
2.2控制文件
每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息。
2.3数据文件
数据文件以 dbf 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁 盘上的一个物理文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。
2.4重做日志文件
重做日志文件又叫redo日志。主要用于数据库的备份和恢复。
2.5归档日志文件
利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,如果没有归档日志文件,则只能利用备份进行恢复。
2.6逻辑日志文件
如果在DM数据库上配置了复制功能,复制源就会产生逻辑日志文件。
2.7物理逻辑日志文件
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 DBMS_LOGMNR
包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内
容会被存储在重做日志文件中。
2.8备份文件
备份文件以 bak 为扩展名。
2.9日志文件(跟踪日志,事件日志)
用户在 dm.ini 中配置 SVR_LOG 和 SVR_LOG_SWITCH_COUNT 参数后就会打开跟踪日志。
DM 数据库系统在运行过程中,会在 log 子目录下产生一个“dm_实例名_日期”命名的 事件日志文件。事件日志文件对 DM 数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、IO错误等一些致命错误。
2.10数据重演文件
重演文件用于数据重演,存储了从抓取开始到抓取结束时,DM 数据库与客户端的通信消息。
-
DM内存结构
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
3.1内存池
DM Server 的内存池包括共享内存池和其他一些运行时内存池。
3.1.1共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。在 DM Server 的
运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,
此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一
片较大内存,即为内存池,当系统在运行过程中需要申请内存时,可在共享内存池内进行申
请,当用完该内存时,再释放掉,即归还给共享内存池。
3.1.2 运行时内存池
除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。
这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存
池、虚拟机内存池等。
3.2缓冲区
3.2.1数据缓冲区
数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是 DM Server 至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用。
3.2.2日志缓冲区
日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘 IO 而使系统
性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,
先将其放置到日志缓冲区中。
3.2.3字典缓冲区
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。
3.2.4SQL缓冲区
SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。
很多应用当中都存在反复执行相同 SQL 语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了 SQL 语句执行效率,但同时给内存也增加了压力。
3.3排序区
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
3.4哈希区
DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。
-
DM管理线程
DM 服务器使用“对称服务器构架”的单进程、多线程结构。对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。
DM进程中主要包括监听线程、IO线程、工作线程、调度线程、日志线程。
4.1监听线程
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
4.2工作线程
工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
4.3IO线程
在数据库活动中,IO 操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把 IO 操作从工作线程中分离出来则是明智的做法。
需要进行IO操作的时机主要有三种:
(1)需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
(2)缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
(3)检查点到来时,需要将所有脏数据页写入磁盘。
4.4调度线程
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
(1)检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
(2)清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
(3)检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
(4)执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池
(5)自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI参数设置的自动检查点执行间隔定期执行检查点操作;
(6)会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
4.5日志FLUSH线程
任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的 REDO 日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散 IO 写入效率更高。日志 FLUSH 线程和 IO 线程分开,能获得更快的响应速度,保证整体的性能。
如果系统配置了实时归档,在 FLUSH 线程日志刷盘前,会直接将日志通过网络发送到实时备库。
如果配置了本地归档,则生成归档任务,通过日志归档线程完成。
4.6日志归档线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。
将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线程中一起做会严重影响系统性能。
4.7日志APPLY线程
在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。
4.8定时器线程
在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。通常情况下,DM Server 需要进行定时操作的事件主要有以下几种:
逻辑日志异步归档;
异步归档日志发送(只有在 PRIMARY 模式下,且是 OPEN 状态下);
作业调度。
4.9逻辑日志归档线程
逻辑日志归档用于 DM7 的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。
本地逻辑日志归档线程:
本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。
远程逻辑日志归档线程:
远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。任务的类型包括同步发送和异步发送。
4.10MAL系统相关线程
MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
DM线程相关的动态视图
