【赵渝强老师】高斯数据库(openGauss)的体系架构

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中的本地内存以及它们的作用。

相关推荐
V1ncent Chen1 小时前
SQL大师之路 13 聚合函数和分组
数据库·sql·mysql·数据分析
IvorySQL2 小时前
开源同行,感谢有你|IvorySQL 社区邀您领取贡献者证书
数据库·postgresql·开源
IvorySQL2 小时前
PostgreSQL 技术日报 (3月19日)|当 AI 代理开始批量创建数据库
数据库·postgresql·开源
2401_874732532 小时前
Python上下文管理器(with语句)的原理与实践
jvm·数据库·python
l1t2 小时前
与系统库同名python脚本文件引起的奇怪错误及其解决
开发语言·数据库·python
星空露珠3 小时前
迷你世界UGC3.0脚本Wiki角色模块管理接口 Actor
开发语言·数据库·算法·游戏·lua
IpdataCloud3 小时前
指纹浏览器为什么要自建IP检测?基于IP数据云离线库的架构实践
数据库·网络协议·tcp/ip·架构·edge浏览器
翻斗包菜3 小时前
MySQL 从入门到精通:数据库核心知识与实战指南
数据库·mysql
grizzliesster23 小时前
MySQL——表的约束
数据库·mysql