GBase8s服务器主要由上图三部分组成。
1.进程部分
进程控制数据库的活动,这些进程也称做虚拟进程,英文缩写为VP,在 UNIX 层面这些进程的名称是oninit,我们也习惯称之为虚拟处理器,每一类的虚拟进程用来完成特定的一组任务,如写逻辑日志、从磁盘读数据,每一类虚拟进程上运行的线索都属于同一类,每个虚拟进程类中的虚拟进程运行的程序是相同的,每个虚拟进程只属于其中一个类,每一类VP由一个或多个虚拟进程组成,大多数类虚拟进程的数量是系统管理员可以配置的,并可以根据需要动态增加。
虚拟进程是以root用户运行的,可通过ps -ef|grep oninit命令查看。
2. 共享内存部分
共享内存由三部分组成,驻留段、虚拟段和消息段。
● 驻留部分:包含缓冲池和其他的系统信息。
● 虚拟部分:包含线索和会话的信息,以及他们所使用的数据。这部分内存会动态增加,因此由数据库服务器负责申请和释放内存空间。
● 消息部分:消息缓冲用于应用程序和数据库服务器的通信,这部分是可选的,仅当使用共享内存连接时才需要进行配置。每个共享内存连接占用的内存开销是12KB。
2.1 驻留段
2.1.1 缓冲池
缓冲池是共享内存的驻留部分的主要存储空间,是最大的一部分内存,缓冲池存放表中的数据页,用来加快表的访问速度。当多个用户读写相同的数据时,将不再需要从磁盘中访问数据。
可以定义多个不同页面大小的缓冲池,每个页面大小的缓冲池只能有一个,每个缓冲池的大小可以通过配置文件中的bufferpool参数修改。
2.1.2 物理日志
物理日志主要是为了数据库服务器的容错机制而引入的,当数据被从磁盘读到内存之后,如果被修改了,物理日志包含了第一次被修改的数据页和索引页的前映像。
为了减少物理日志磁盘IO的次数,其写日志时使用了缓冲phybuff,而不是每次都写盘,先写到缓冲,由数据库控制在需要时将缓冲中的数据刷新到物理日志。
2.1.3 逻辑日志
当数据库记日志时,逻辑日志包含了数据操作语句(DML)insert、delete、update 的内容,也保存数据定义语句(DDL)的操作记录,GBase 8s是多库的结构,所有的数据库共享相同的逻辑日志文件,不同数据库中的事务日志在日志文件中可以交叉存放。
写到数据库日志中的数据可能很大,为了减少写盘的IO次数,数据先放在缓冲logbuff中,稍后再写到磁盘中,服务器为逻辑日志申请了三个缓冲。
2.1.4 LRU队列
缓冲池被组织成许多的LRU队列,当服务器需要把一个页面从磁盘读到共享内存中时,首先要找到一个可以存放这个页面的缓冲,每个缓冲是通过LRU 队列来跟踪的,LRU队列有一个干净的队列,称做FLRU(Free LRU),有一个脏队列,称做MLRU (Modified LRU)。
当服务器需要一个缓冲页时,它会随机在这些FLRU队列中选择一个没有被其他用户线索锁住的页面,如果这个页面要被修改,这个页面将被放到MLRU队列中;如果这个页面已经被读进来,但不会被修改,这个页面将被放到FLRU的最近经常用的页面队列中。
2.2 虚拟内存段
虚拟内存段的主要用途:
● 记录用户会话信息:每个会话有一个缓冲池,用于保存私有数据,缓冲池的名称和用户会话的ID是相同的,每个用户连接成功时,数据库将为其分配一个会话ID,当用户连接断开之后,缓冲池也随即释放。
● 缓冲数据字典信息:当一个用户第一次执行 SQL 语句时,它需要表的信息,数据库服务器必须从系统表中检索这些信息,如果这些系统表的信息不在内存中,就需要从磁盘中读取这些信息到内存中,这些表的信息放在内存结构中将使得访问的速度更快,这个内存结构就称做数据字典缓冲池,后续的会话会重用这些内存结构中的表信息。
● 缓冲存储过程:当一个过程被第一次调用时,这个过程的执行计划会从系统表sysprocplan 读到存储过程缓冲池中,后续的用户会从缓冲池中调用这个过程,时间和内存都节约了下来。
● 线索信息:多线索的缓冲池包括了用于控制线索的结构和堆栈的信息。
● 排序:排序所需的临时空间从虚拟段中申请。
● 大缓冲:当AIO VP将大的块信息写到磁盘上时会使用大的缓冲。
● 全局信息:不属于某个特定会话的不同种类的信息。
虚拟段中保存的数据的特性,决定了这部分内存会根据用户的活动而变化,当数据库中的活动很高时,可能需要创建更多的缓冲池,已有的缓冲池会被扩大。如果需要很多的缓冲,另外一个虚拟段会动态增加。
3.磁盘部分
首先要保证有空间给数据库使用,这个空间是通过称做 chunk 的单元来指定的,chunk是一组连续的空间,一般是一个文件或者逻辑卷,有些用户也习惯把逻辑卷称做裸设备。
4.相关名词介绍
4.1 页面
当一个chunk被增加到数据库服务器之后,它被分成许多更小的单元,称做页面,页面是数据库服务器的基本 IO 单元,所有的数据都存放在页面上。例如,当插入一条记录时,这条记录会存放在一个页面上;当需要把数据从磁盘读到内存时,这个页面上所有的数据都会被读到内存中。
除了root dbspace以外,可以为其他的dbspace指定页面大小,这个页面大小是默认的页面大小的倍数,即从2KB到16KB。
4.2 dbspace
dbspace由一个或者多个chunk组成,如图2-10所示,当dbspace空间不够时,可以给它增加额外的chunk。数据库和表创建在特定的dbspace上。这意味着只要dbspace上有空间,表和数据库空间就会按其空间的需要增长。每个数据库至少有一个 dbspace,称做 root dbspace。
4.3 tblspace
存放一个表的数据页面的逻辑组合称做tblspace,tblspace代表的空间不一定是连续的,这些页面可以在一个chunk上,也可以在多个chunk上。对于不分片的表, tblspace总是在同一个dbspace上;对于分片的表,每个dbspace会有一个tblspace id编号,这个tblspace id编号存放在sysfragment表的partn列中。
4.4 简单大对象
GBase 8s中可以存放一些简单大对象的数据,这些大对象可以是图像、声音和一些源代码文件。任何计算机文件系统中存放的东西都可以存放在数据库中,这些数据的存储上限是2GB。有两种类型的简单大对象:text 和 byte。text 数据类型用来存放可打印的二进制文本, byte类型用来存放任何二进制的数据,如表格、程序装载模块、图像和声音。
4.5 blobspace
blobspace 逻辑上也是由很多的物理空间组成,或者说由很多的chunk 组成,如图2-13所示。每个blobspace至少由一个chunk组成,当blobspace的空间不够时,可以给blobspace增加空间。
4.6 智能大对象
在GBase 8s中还提供一种用户自定义类型,称做smart large object,这种数据类型也可以存放大量的数据,当数据库创建时,这些数据类型会自动创建并存放在sysxtdtypes表中。smart large object是存放用户自定义类型的理想场所。smart large object存放在sbspace上,sbspace也是由一个或者多个chunk组成。
4.7 逻辑日志
逻辑日志是一组连续的磁盘空间,用来存放用户的交易记录,如果创建的数据库是记录日志的,交易记录中将包括数据库中所有的变化,所有数据库共享相同的逻辑日志。
4.8 物理日志
数据库有一个特殊的日志用来做自动的恢复,这个日志称做物理日志,物理日志是磁盘上的一组连续的空间。
当一个页面被读到内存并被修改时,这个页面原来的内容会被写到物理日志中,这个页面的拷贝也称做前映像,物理日志中只包括缓冲中第一次对这个页面的修改,对相同页面的后续修改将不在物理日志中记录。
4.9 数据缓冲
当数据库需要访问数据时,首先要定位数据存放在哪里,然后把数据读到缓冲池的页面中,一旦这些数据在内存中,如果后面的用户需要访问相同的数据,将直接在内存中访问这些数据,所有的用户可以共享这些数据。把数据从磁盘读到共享缓冲池的操作称做数据缓冲。
如果数据库要修改(insert、update、delete)一个页面,将直接在缓冲中进行修改。这意味着所有的用户可以立即访问修改的数据。这些修改的数据将在稍后一点的时间被刷新到磁盘上。