openGauss是基于PostgreSQL开发的,因此这里可以拿PostgreSQL来比较学习它的体系结构,这样比较容易理解。openGauss的体系架构中最重要的就是数据的存储结构,而数据存储结构分为逻辑存储结构和物理存储存储。其中,逻辑存储结构是数据库内部的组织和管理数据的方式;而物理存储结构是操作系统中组织和管理数据的方式。openGauss的主要结构如下图所示。
| 点击这里查看视频讲解:【赵渝强老师】高斯数据库(openGauss)的体系架构 |
一、 逻辑存储结构
openGauss的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都存放在相关的系统目录表中,比如数据库的oid和表的oid分别存放在pg_database,pg_class表中。下图展示了openGauss数据库的逻辑存储结构。
下面对openGauss数据库中的各种数据库对象进行说明。
1.1 数据库集群-Database Cluster
它也叫数据库集簇,是指由单个OpenGauss数据库服务器实例管理的所有数据库集合。组成数据库集群的这些数据库使用相同的全局配置文件和监听端口、共用数据库的后台线程和内存结构。一个数据库集群可以包括:多个数据库、多个用户以及数据库中的所有对象。
在文件系统术语中,一个数据库集群是一个单一目录,该目录称之为数据目录或数据区域,所有数据都将被存储在该目录中。它没有默认的位置,其文件系统位置可以由-D选项或者环境变量PGDATA指定,例如:
powershell
[postgres@opengauss gaussdb]$ pwd
/home/postgres/training/gaussdb
[postgres@opengauss gaussdb]$ bin/gs_ctl -D data/single_node/ -l logfile start
1.2 数据库-Database
在OpenGauss中,数据库本身也是数据库对象。不同的数据库在逻辑上彼此分离,除数据库之外的其他数据库对象(例如:表、索引等等)都属于它们各自的数据库。通过下面的语句可以查看OpenGauss数据库服务器中已存在的数据库。
(1)登录OpenGauss。
powershell
bin/gsql -d postgres
(2)查看OpenGauss中已有的数据库。
sql
openGauss=# \l
# 输出的信息如下:
List of databases
Name | Owner | Encoding |......
-----------+----------+----------+------
finance | postgres | UTF8 |......
postgres | postgres | UTF8 |......
school | postgres | UTF8 |......
scott | postgres | UTF8 |......
template0 | postgres | UTF8 |......
template1 | postgres | UTF8 |......
| | |......
(6 rows)
1.3 表空间-Tablespace
表空间是一个目录,在一个数据库集群中可以存在多个表空间。它里面存储的是数据库的各种物理文件。每个表空间可以对应多个数据库。表空间用作把逻辑上相关的数据结构放在一起。在数据库集群初始化的时候,会自动创建pg_default和pg_global两个表空间。其中:
- pg_global:该表空间用于存放系统表。
- pg_default:创建表时的默认表空间,该表空间的物理文件存储在数据目录中的base目录中,如:/home/postgres/training/gaussdb/data/single_node/base。
下面通过具体的操作来演示如何查看OpenGauss中已有的表空间和如何创建自己的表空间。
(1)登录OpenGauss。
powershell
bin/gsql -d postgres
(2)查看PostgreSQL中已有的表空间。
sql
openGauss=# \db
# 输出的信息如下:
List of tablespaces
Name | Owner | Location
------------+----------+----------
pg_default | postgres |
pg_global | postgres |
(2 rows)
(3)创建自己的表空间。
sql
openGauss=# create tablespace mydemotbs location '/home/postgres/training/mydemotbs';
CREATE TABLESPACE
1.4 模式-Schema
模式Schema是数据库中的命名空间,在数据库中创建的所有对象都是在Schema中创建。一个用户可以从同一个客户端连接中访问不同的Schema。而不同的Schema中可以有多个同名的表、索引、视图、序列、函数等等各种不同的数据库对象。可以通过下面的方式来查看当前数据库的Schema。
sql
openGauss=# \dn
# 输出的信息如下:
List of schemas
Name | Owner
-----------------+--------
blockchain | postgres
coverage | postgres
cstore | postgres
db4ai | postgres
dbe_perf | postgres
dbe_pldebugger | postgres
dbe_pldeveloper | postgres
dbe_sql_util | postgres
myuser | myuser
pkg_service | postgres
public | postgres
snapshot | postgres
sqladvisor | postgres
(13 rows)
1.5 段-Segment
一个段是分配给一个逻辑结构,如:一个表、一个索引或其他对象的一组区,它是数据库对象使用空间的集合。段可以有表段、索引段、回滚段、临时段和高速缓存段等,而最常用的段就是表段和索引段。
1.6 区-Extent
区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。一个段是由一个或多个磁盘盘区组成。当一段中间所有空间已完全使用,OpenGauss会自动为该段分配一个新的磁盘盘区范围。
1.7 块-Block(Page)
数据块是openGauss管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位。数据库是最小的逻辑存储单位,其默认值8K。通过参数block_size可以查看当前数据库的数据块大小。
sql
openGauss=# show block_size;
block_size
------------
8192
(1 row)
在OpenGauss中,数据的读写是以数据块为最小单位。在编译openGauss时通过指定BLCKSZ参数大小将决定数据块的大小。每个表文件由都由BLCKSZ字节大小的数据块组成。在分析型数据库中,适当增加BLCKSZ大小可以小幅度提升数据库的性能。
1.8 数据库对象-Database Object
openGauss提供了各种数据库对象,如表、视图、索引、序列、函数等等。在openGauss中的所有数据库对象都由各自的对象标识符(oid)进行内部的管理。数据库的oid存储在pg_database系统表中,可以通过下面的语句进行查询。
sql
openGauss=# select oid,datname from pg_database;
# 输出的信息如下:
oid | datname
-------+-----------
1 | template1
16384 | school
16420 | finance
14809 | template0
16470 | scott
14814 | postgres
(6 rows)
而数据库中的表、索引、序列等数据库对象的oid则存在了pg_class系统表中,例如可以通过下面的语句查询前面创建的testtable1表的OID。
sql
openGauss=# select oid,relname,relkind,relfilenode from pg_class where relname ='testtable1';
# 输出的信息如下:
oid | relname | relkind | relfilenode
-------+------------+---------+-------------
16517 | testtable1 | r | 16517
(1 row)
二、 物理存储结构
在数据库集群初始化的时候会创建一个目录,通常都会使用系统配置相关的环境变量$PGDATA来表示。当数据库初始化完成后,会在这个目录生成相关的子目录以及一些文件。下图就是openGauss数据库的物理结构:
三、 进程结构与线程结构
openGauss是一款单进程多线程的数据库。执行下面的命令列出openGauss的进程和线程信息。
powershell
[postgres@opengauss single_node]$ ps -ef|grep gaussdb
# 输出的信息如下:
postgres 2019 ... 1 ... /home/omm/training/gaussdb/bin/gaussdb -D data/single_node
# 从这里输出的信息中可以看出,OpenGauss的进程号是2019。
执行下面的命令列出openGauss进程包含的所有线程信息。
$ ps -T -p 2019
# 输出的信息如下:
PID SPID TTY TIME CMD
24388 24388 ? 00:00:00 gaussdb
24388 24389 ? 00:00:00 jemalloc_bg_thd
24388 24393 ? 00:00:00 gaussdb
24388 24394 ? 00:00:00 syslogger
24388 24395 ? 00:00:00 alarm
24388 24396 ? 00:00:00 reaper
24388 24398 ? 00:00:00 jemalloc_bg_thd
24388 24399 ? 00:00:00 jemalloc_bg_thd
24388 24403 ? 00:00:00 jemalloc_bg_thd
24388 24423 ? 00:00:00 gaussdb
24388 24424 ? 00:00:00 gaussdb
24388 24425 ? 00:00:00 gaussdb
24388 24427 ? 00:00:00 checkpointer
24388 24428 ? 00:00:00 Spbgwriter
24388 24429 ? 00:00:00 pagewriter
24388 24430 ? 00:00:02 pagewriter
24388 24431 ? 00:00:00 pagewriter
24388 24432 ? 00:00:00 pagewriter
24388 24433 ? 00:00:00 pagewriter
24388 24434 ? 00:00:00 WALwriter
24388 24435 ? 00:00:00 WALwriteraux
24388 24436 ? 00:00:00 AVClauncher
24388 24437 ? 00:00:00 Jobscheduler
24388 24438 ? 00:00:00 asyncundolaunch
24388 24439 ? 00:00:00 globalstats
24388 24440 ? 00:00:00 applylauncher
24388 24441 ? 00:00:00 statscollector
24388 24442 ? 00:00:00 txnsnapcapturer
24388 24443 ? 00:00:00 CfsShrinker
24388 24444 ? 00:00:01 percentworker
24388 24445 ? 00:00:02 ashworker
24388 24446 ? 00:00:00 TrackStmtWorker
24388 24447 ? 00:00:00 auditor
24388 24448 ? 00:00:00 2pccleaner
24388 24449 ? 00:00:00 faultmonitor
24388 24450 ? 00:00:00 WLMworker
24388 24451 ? 00:00:00 WLMmonitor
24388 24452 ? 00:00:00 WLMarbiter
24388 24453 ? 00:00:00 undorecycler
openGauss提供了系统视图PG_OS_THREADS获取当前节点下所有线程的状态信息,例如:
sql
openGauss=# select * from PG_OS_THREADS;
# 输出的信息如下:
thread_name
------------------------
WorkloadMonitor
Asp
gsql
Wal Writer Auxiliary
TwoPhase Cleaner
Wal Writer
CheckPointer
CfsShrinker
PercentileJob
WLMArbiter
ApplyLauncher
PageWriter
undo recycler
LWLock Monitor
InvalidBufferBgWriter
workload
statement flush thread
JobScheduler
(18 rows)
四、 内存结构
openGauss的内存结构分为两种不同的类型,它们分别是本地内存和共享内存。它们的关系如下图所示:
4.1 共享内存
openGauss的共享内存是指每个后台进程(backend process)共同使用的内存区域,下列举了openGauss中的共享内存以及它们的作用。
4.2 本地内存
openGauss的本地内存是指每个后台线程自己使用的内存区域,下表列举了openGauss中的本地内存以及它们的作用。