DM8体系结构
一、数据库和实例
-
数据库
从DM8开始,数据库指的是磁盘上存放在DM数据库中的数据的 集合 ,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。 -
实例
实例一般是由一组正在运行的DM后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作DM数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。 -
区别与关联
- DM数据库是存储在服务器的磁盘上,而DM实例是存储在服务器的内存中;
- 任何时候,一个实例只能关联一个数据库;通常情况下,一个数据库也只能由一个实例来操作,但是在共享储存集群中,可以有多个实例操作同一个数据库。
二、DM逻辑存储结构
DM逻辑存储结构主要有记录、页、簇、段、表空间,以下是他们之间的关系,其中数据文件属于物理存储结构:
- 数据库由一个或多个表空间组成;
- 每个表空间由一个或多个数据文件组成;
- 每个数据文件由一个或多个簇组成;
- 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
- 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
- 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
2.1 表空间
在 DM 数据库中,表空间由一个或者多个数据文件组成。DM 数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。在创建DM数据库时,会自动创建4个表空间:
- SYSTEM表空间,主要存放了有关于数据库字典的信息,又称之为系统表空间;
- ROLL表空间,存放了事务运行过程中所执行DML操作之前的值,用于确保事务的读一致性;
- MAIN表空间,一般作为用户的默认表空间,用来存放用户的业务数据;
- TEMP表空间,用来完成操作时所用到的临时表空间,例如排序、中间结果集等,由数据库自动运维。
2.2 记录
数据库中的每一行都是一条记录。记录是存储在页上的,由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此 DM 规定 每条记录的总长度不能超过页面大小的一半 。
2.2 页
- 数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,可以为 4KB、8KB、16KB 或者 32KB。
- FILLFACTOR 是 DM 数据库提供的一个与性能有关的数据页级存储参数,它指定一个数据页初始化后插入数据时最大可以使用空间的百分比(100)。为了充分利用空间,用户可以设置一个很高的 FILLFACTOR 值,如 100,但是这可能会导致在后续更新数据时,频繁引起页分裂,而导致需要大量的 I/O 操作。为了提高更新数据的性能,可以设置一个相对较低(但不是过低)的 FILLFACTOR 值,使得后续执行更新操作时,可以尽量避免数据页的分裂,提升 I/O 性能,不过这是以牺牲空间利用率来换取性能的提高。
2.3 簇
簇是数据页的上级逻辑单元,由同一个数据文件中 16 个或 32 个或 64 个连续的数据页组成。
2.4 段
段是簇的上级逻辑分区单元,它由一组簇组成,这些簇在磁盘上不一定连续。在同一个表空间中,一个段可以跨越不同的文件。而一个簇只能来自一个文件,其包含的页也是连续的 16 或者 32 个。
- 数据段
- 临时段
- 回滚段
三、DM物理存储结构
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:
- 用于进行功能设置的配置文件;
- 用于记录文件分布的控制文件;
- 用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;
- 用来进行问题跟踪的跟踪日志文件等。
3.1 配置文件
-
3.1.1 数据库服务配置
- dm.ini 是数据库启动所必须的配置文件,参数的属性分为:手动、静态和动态,主要的配置模块包括:
- 控制文件
- 实例名
- 内存
- 线程
- 查询
- 检查点
- IO
- 数据库
- 预先装载表
- 客户端缓存
- REDO日志生成
- REDO重做/重演
- 事务
- 安全
- 兼容性
- 用户请求跟踪
- 系统跟踪
- MONITOR 监控
- 数据守护
- 全文索引
- 配置文件
- 备份还原
- DMDSC
- 其他以及未列在 dm.ini 中的 INI 配置项
- dmmal.ini 是 MAL 系统的配置文件。需要用到 MAL 环境的实例,所有站点 dmmal.ini 需要保证严格一致。
- dmarch.ini 用于本地归档和远程归档。有以下几种类型:
- 本地归档 LOCAL
- 远程实时归档 REALTIME
- 远程异步归档 ASYNC
- 同步归档 SYNC
- 即时归档 TIMELY
- 远程归档 REMOTE
- RAFT 归档 RAFT/LEARNER
- dm_svc.conf 是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能生效。
- sqllog.ini 用于SQL日志的配置,当且仅当INI参数SVR_LOG=1时使用。
- dm.ini 是数据库启动所必须的配置文件,参数的属性分为:手动、静态和动态,主要的配置模块包括:
-
3.1.2 复制配置
- dmrep.ini 用于配置复制实例。
- dmllog.ini 用于配置逻辑日志。
- dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。
3.2 控制文件
每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:
- 数据库名称;
- 数据库服务器模式;
- OGUID 唯一标识;
- 数据库服务器版本;
- 数据文件版本;
- 数据库的启动次数;
- 数据库最近一次启动时间;
- 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
- 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。
3.3 数据文件
数据文件以 dbf 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。数据文件按数据组织形式,可以分为如下几种:
- B树数据
- 堆表数据
- 列存储数据
- 位图索引
3.4 重做日志文件
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。
3.5 归档日志文件
归档日志文件,就是在归档模式下,重做日志被连续写入到归档日志后,所生成了归档日志文件。只有在归档模式下运行时,DM 数据库才会将重做日志写入到归档日志文件中。
3.6 逻辑日志文件
DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。是一个流式的文件,它有自己的格式,且不在页,簇和段的管理之下。逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。
3.7 物理逻辑日志文件
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,用于获取数据库系统的历史执行语句。要开启物理逻辑日志的功能,需要满足下面两个条件:
- 首先,要设置 RLOG_APPEND_LOGIC 为 1、2、3 或者 4;
- 其次,通过设置参数 RLOG_IGNORE_TABLE_SET=1 或者建表(或修改表)时指定 ADD LOGIC LOG 开 启 。
3.8 备份文件
备份文件以 bak 为扩展名,自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。
3.9 SQL日志文件
用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志,是一个纯文本文件,通常命名格式为“dmsql_实例名.log”,内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。
3.10 事件日志文件
事件日志文件记录了 DM 数据库运行时的关键事件。例如
- 系统启动、关闭、内存申请失败、IO 错误等一些致命错误;
- 数据库运行过程中的日志信息;
- 备份还原过程中备份还原操作的阶段性信息等。
初始化过程中产生的 ELOG 会保存在 ELOG_PATH 参数指定的目录下,名称为“dmini+时间+日期”;系统启动和运行过程中产生的 ELOG 保存在系统 log 目录下。
四、DM内存结构
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
4.1 内存池
-
4.1.1 共享内存池
DM 为了服务性能,避免降低系统运行效率,一次向操作系统申请一片较大内存,作为共享内存池,这样数据库在运行过程中需要申请小片内存时,可在共享内存池中申请,当用完该内存,再释放掉,即归还给共享内存池。 -
4.1.2 运行时内存池
除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
4.2 缓冲区
-
4.2.1 数据缓冲区
数据库缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘读取数据页之后,数据页所存储的地方。- 类别
DM Server中有四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。 - 读多页
知道用户需要读取大量数据时,可以设置一次读取多页就可以减少I/O次数,从而提高数据的修改、查询效率。但是设置的参数值要合适。
- 类别
-
4.2.2 日志缓冲区
为了避免由于直接的磁盘IO而影响系统的性能,系统在运行过程中产生的日志不会立即被写入磁盘,而是先放到内存中缓冲,这部分就是日志缓冲区。 -
4.2.3 字典缓冲区
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。 -
4.2.4 SQL缓冲区
SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括 计划、SQL 语句和结果集 缓存。
4.3 排序区
排序缓冲区提供数据排序所需要的内存空间。
4.4 哈希区
DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。
五、管理DM线程
5.1 监听线程
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。
5.2 工作线程
工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
5.3 IO线程
通常情况下,DM Server 需要进行 IO 操作的时机主要有以下三种:
- 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
- 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
- 检查点到来时,需要将所有脏数据页写入磁盘。
5.4 调度线程
调度线程用于接管系统中所有需要定时调度的任务。
5.5 日志 FLUSH 线程
为保证数据故障恢复的一致性,在数据页刷盘前必须先进行redo日志的刷盘,日志的刷盘工作则是由FLUSH线程来执行的。
5.6 日志归档线程
将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做。
5.7 日志APPLY线程
在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。
5.8 定时器线程
定时器线程是为了实现用户需要数据库完成在某个时间点开始进行某种操作或者在某个时间段内反复进行某种操作等这样的需求而设计的。
5.9 逻辑日志归档线程
逻辑日志归档用于 DM8 的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。
5.10 MAL系统相关进程
MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
5.11 线程信息的查看
DM提供了很多动态视图可以让用户直观的了解当前系统中有哪些进程在工作,以及这些进程的相关信息。
- V$LATCHES 记录当前正在等待的线程信息;
- V$THREADS 记录当前系统中活动线程的信息;
- V$PROCESS 记录服务器进程信息。
更多的内容可以登录达梦的社区进行查看:https://eco.dameng.com