目录
1. 逻辑存储结构
2. 物理存储结构
3.内存结构
3.1 内存池
3.2 缓冲区
3.3 排序区
3.4 哈希区
4. 管理DM线程
4.1 监听线程
4.2 工作线程
4.3 IO线程
4.4调度线程
4.5 日志FLUSH线程
4.6日志归档线程
4.7日志APPLY线程
DM数据库中的所有数据文件组合都存放在一个或多个表中,而所有的数据库内部对象都存放在表空间中。
由此可以看出DM的存储层次如下:
1.数据库有一个或多个表空间组成。
2.每个表空间有一个或多个数据文件组成。
3.每个数据文件有一个或多个簇组成。
4.段是簇的上级逻辑单元,一个段可以跨多个数据文件。
5.簇由磁盘上连续的页组成,一个簇总是在一个数据文件中。
6.页是数据库中最小的分配单元,也是数据库中使用的最小的IO单元。
DM数据库使用了磁盘上大量的物理存储结构来保存和管理用户的数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件。
DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了划分,并采用了不同的管理模式。
DM的内存池包含有共享内存池和运行时内存池。
共享内存池是DM Server在启动时从操作系统申请的一大片内存。在DM Server的运行期间,经常会申请与释放小片内存,而直接向操作系统申请和释 放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。于是DM采用共享内存池的方式:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
除了共享内存池,DM Server的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方;日志缓冲区是用于存放重做日志的内存缓冲区;字典缓冲区主要存储一些数据字典,如模式信息、表信息、列信息、触发器信息等。SQL缓冲区提供执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。
排序缓冲区提供数据排序所需要的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
DM Server提供了参数来指定排序缓冲区的大小,参数SORT_BUF_SIZE在DM配置文件dm.ini 中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值20M。
DM8提供了哈希链接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用DM8创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。
DM服务器使用“堆成服务器架构”的单进程、多线程结构。DM进程中主要包括监听线程、IO线程、工作线程、调度线程、日志线程等。
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。 它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行 相应的处理,负责所有实际的数据相关操作。DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。
在数据库活动中,IO操作历来都是最为耗时的操作之一。DM Server需要进行IO操作的时机主要有以下三种:
1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
3. 检查点到来时,需要将所有脏数据页写入磁盘。
IO线程在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的 任务有以下一些:
1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列 由工作线程执行;
2. 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
3. 检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
4. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
5. 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
6. 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自 动断开连接;
7. 必要时执行数据更新页刷盘;
8. 唤醒等待的工作线程。
任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓 冲区中,当事务提交或者执行检查点时,会通知FLUSH线程进行日志刷盘。由于日志具备 顺序写入的特点,比数据页分散IO写入效率更高。日志FLUSH线程和IO线程分开,能获 得更快的响应速度,保证整体的性能。DM8的日志FLUSH线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。
如果系统配置了实时归档,在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。 将日志FLUSH线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离FLUSH线程来做,如果放在FLUSH线程中一起做会严重影响系统性能。
在配置了数据守护的系统中,创建了一个日志APPLY线程。当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。
达梦在线服务平台网址:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台 (dameng.com)