openGauss 核心体系架构深度解析

openGauss 核心体系架构深度解析

openGauss 是一款高性能、高安全、高可靠的企业级开源关系型数据库。要掌握它的运维与调优,必须深入理解其底层的体系结构。本文将从配置文件、逻辑架构、内存结构和存储结构四个维度进行详细剖析。

在这里插入图片描述

一、关键配置文件

在启动数据库之前,我们首先要关注两个决定数据库行为的核心文件,它们通常位于数据目录下。

在这里插入图片描述

1. 核心参数配置

这是数据库的总控文件,相当于人的心脏

作用:决定了数据库的内存分配如 shared_buffers、连接限制如 max_connections、日志记录以及端口监听等全局行为

生效机制:修改此文件中的大部分参数(尤其是涉及内存和端口的)需要重启数据库才能生效,部分参数可通过 reload 在线生效

2. 客户端认证策略

这是数据库的门卫文件,全称为 Host-Based Authentication

作用:它严格定义了允许哪些客户端 IP、通过什么认证方式如 md5, sha256, trust、访问哪个数据库以及使用哪个用户名

重要性:配置错误会导致拒绝连接或产生严重的安全漏洞

二、逻辑架构与进程结构

openGauss 的逻辑架构设计非常清晰,各组件分工明确,共同支撑起庞大的数据处理请求。

在这里插入图片描述

1. OM

角色:大管家

功能:提供数据库日常运维和配置管理的接口与工具

场景:我们日常使用的 gs_om 命令就是该模块的体现,用于执行集群的启动、停止、状态查询等操作

2. Client Driver

角色:联络员

功能:负责接收来自应用层的访问请求,并向应用返回执行结果

机制:它负责与 openGauss 实例建立通信链路,发送 SQL 命令。常见的驱动包括 JDBC、ODBC 和 Python 驱动

3. Datanode

角色:核心工兵

功能:负责存储业务数据、执行数据查询任务

高可用架构:实例包含主Primary、备 Standby两种类型

部署建议:为了实现高可用,建议将主、备实例分散部署在不同的物理节点中,防止单点故障。

4. Storage

角色:仓库

功能:指服务器的本地存储资源(即物理磁盘),用于持久化存储数据。


三、内存结构:速度的桥梁

内存是数据库性能的关键瓶颈所在,它充当了慢速磁盘与快速 CPU之间的桥梁。

在这里插入图片描述

1. Shared Buffer

定义:数据库服务器的共享内存缓冲区

核心机制:数据库中的读写操作都是针对内存中的数据。磁盘中的数据必须在处理前加载到此缓冲区中

适用场景:它是加速 I/O 访问速度的核心组件,主要服务于传统的行存储表(OLTP 场景)

2. Cstore Buffer

定义:专门为列存储 (Column Store)表使用的共享缓冲区

调优策略:在以列存表为主的分析型场景(OLAP)中,几乎不用 shared buffer。此时应减少shared_buffers 的配置大小,增加cstore_buffers 的大小,以获得更好的分析性能

3. MOT

定义:一种全内存存储引擎

特点:所有数据和索引都完全驻留在内存中,而非缓存机制

优势:在高性能(极低查询和事务延迟)、高可扩展性(高吞吐量和并发量)以及高资源利用率方面拥有显著优势

四、存储结构:数据的物理家园

数据库节点负责存储数据,其逻辑结构呈现出清晰的层级关系,类似于文件系统的目录结构。

在这里插入图片描述

1. 表空间

本质:是一个目录,系统可以存在多个表空间。
作用:里面存储的是它所包含的数据库的各种物理文件。通过表空间,可以将不同库的数据映射到不同的物理磁盘上(如将热数据放在 SSD)
关系:每个表空间可以对应多个Database(多对多关系的物理承载方)

2. 数据库

作用:用于管理各类数据对象(如表、索引、视图)。
隔离性:各数据库间相互隔离,无法直接跨库访问。
分布:一个数据库管理的对象可以分布在多个Tablespace 上。

3. 数据文件

对应关系:通常每张表只对应一个数据文件。
自动切分:如果某张表的数据量大于 1GB,系统会自动将其切分为多个后缀名为 .1, .2 的数据文件进行存储,以便于操作系统管理。

4. 表

归属:每张表只能属于一个数据库。
约束:每张表只能对应到一个Tablespace。也就是说,一张表的所有数据文件必须在同一个表空间目录下。

5. 数据块

定义:是数据库管理的基本单位,也称为 Page(页)
默认大小:8KB
I/O机制:所有的磁盘 I/O 操作都不是按行读写,而是按Block进行批量读写,以提高效率。


五、练习题

1. 在 openGauss 中,负责接收应用访问请求并返回执行结果的组件是?
A. OM
B. Client Driver
C. Storage
D. Shared Buffer

2. 关于 Shared Buffer 的描述,下列哪项是正确的?
A. 专门用于存储列存表数据
B. 所有数据和索引必须永久驻留在其中
C. 充当慢速磁盘与快速 CPU 之间的桥梁
D. 在列存场景下应尽可能调大

3. 如果业务场景以列存表 (Column Store) 为主,应该如何调整内存参数?
A. 增加 shared_buffers,减少 cstore_buffers
B. 减少 shared_buffers,增加 cstore_buffers
C. 同时增加 shared_buffers 和 cstore_buffers
D. 禁用 shared_buffers

4. MOT (Memory-Optimized Table) 的主要特点是?
A. 数据存储在磁盘,索引存储在内存
B. 仅用于缓存临时数据
C. 所有数据和索引都在内存中
D. 性能低于行存表,但节省空间

5. openGauss 中数据块 (Block) 的默认大小是多少?
A. 4KB
B. 8KB
C. 16KB
D. 32KB

6. 当一张表的数据文件超过多大时,系统会自动将其切分为多个文件?
A. 512MB
B. 1GB
C. 2GB
D. 4GB

7. 关于 Database (数据库) 的描述,错误的是?
A. 数据库之间相互隔离
B. 一个数据库可以分布在多个表空间上
C. 一个表空间只能对应一个数据库
D. 用于管理各类数据对象

8. 哪个配置文件主要负责控制数据库的连接权限和认证方式?
A. postgresql.conf
B. pg_hba.conf
C. cluster_config.xml
D. backup.conf

9. OM (Operation Manager) 模块的主要功能不包括?
A. 数据库日常运维
B. 配置管理
C. 执行 SQL 数据查询
D. 提供管理接口工具

10. 为了保证高可用,建议将 openGauss 的主、备实例如何部署?
A. 部署在同一个物理节点的不同目录下
B. 部署在同一个物理节点的同一个目录下
C. 分散部署在不同的物理节点中
D. 均部署在内存中

11. Tablespace (表空间) 在文件系统层面对应的是什么?
A. 一个具体的文件
B. 一个目录
C. 一个磁盘分区
D. 一个内存区域

12. 下列关于 Table (表) 与 Tablespace 的关系,说法正确的是?
A. 一张表的数据文件可以跨越多个 Tablespace
B. 一张表对应的数据文件必须在同一个 Tablespace 中
C. 一张表可以不属于任何 Tablespace
D. 一张表可以属于多个 Database

13. postgresql.conf 文件中的参数修改后,通常需要进行什么操作才能生效?
A. 立即自动生效
B. 重启数据库或重载配置
C. 重新安装数据库
D. 修改客户端驱动

14. 在 openGauss 进程结构中,哪个组件负责持久化存储数据?
A. Storage
B. Client Driver
C. OM
D. Memory

15. 为什么说内存充当了桥梁的作用?
A. 因为内存比 CPU 慢
B. 因为磁盘 I/O 速度远低于 CPU 处理速度
C. 因为内存容量无限大
D. 因为所有数据必须永久保存在内存中


六、答案与解析

1.B. Client Driver

解析:Client Driver 负责与 openGauss 实例通信,发送 SQL 命令并接收执行结果。OM 是运维模块。

2.C. 充当慢速磁盘与快速 CPU 之间的桥梁

解析:Shared Buffer 是行存共享缓冲区,用于缓存从磁盘读取的数据页,解决 CPU 与磁盘速度不匹配的问题。

3.B. 减少 shared_buffers,增加 cstore_buffers

解析:Cstore buffer 是专门为列存表设计的。在列存场景下,几乎不使用 shared buffer,因此应减少其大小以释放内存给 cstore buffer。

4.C. 所有数据和索引都在内存中

解析:MOT 是内存优化表,其核心特征就是数据和索引完全驻留内存,以此获得高性能和低延迟。

5.B. 8KB

解析:openGauss 默认的数据块(Block/Page)大小为 8KB,这是 I/O 的基本单位。

6.B. 1GB

解析:Datafile Segment 机制规定,如果某张表的数据大于 1GB,会分为多个数据文件存储。

7.C. 一个表空间只能对应一个数据库

解析:这是错误的说法。每个表空间可以对应多个 Database,即多个数据库可以共用一个表空间。

8.B. pg_hba.conf

解析:pg_hba.conf (Host-Based Authentication) 是专门用于配置客户端认证策略(黑白名单)的文件。

9.C. 执行 SQL 数据查询

解析:执行 SQL 查询是 openGauss 实例(Datanode)的工作,OM 负责运维和配置管理(如启动、停止)。

10.C. 分散部署在不同的物理节点中

解析:为了容灾和高可用,主备实例不能在同一台物理机上,否则物理机故障会导致整个集群不可用。

11.B. 一个目录

解析:Tablespace 在物理层面就是一个目录,用于指定数据文件在文件系统中的存储路径。

12.B. 一张表对应的数据文件必须在同一个 Tablespace 中

解析:一张表只能属于一个 Database,也只能位于一个 Tablespace 中。

13.B. 重启数据库或重载配置

解析postgresql.conf 是核心参数文件,大多数参数(尤其是涉及内存和端口的)修改后需要重启 (gs_om -t stop/start) 或重载 (gs_om -t reload) 才能生效。

14.A. Storage

解析:Storage 指的是服务器的本地存储资源(磁盘),负责数据的持久化。

15.B. 因为磁盘 I/O 速度远低于 CPU 处理速度

解析:这是数据库引入缓冲区的根本原因。CPU 处理极快,磁盘 I/O 极慢,必须通过内存作为中间缓冲来加速访问。

日期:2025年12月23日
专栏:openGauss

Read more

用 Rust 打造二维码艺术大师:从想法到实现

用 Rust 打造二维码艺术大师:从想法到实现

二维码已经渗透到我们生活的方方面面,从支付到网站链接,几乎无处不在。但你有没有想过,二维码是怎么生成的?这些黑白方块也可以变得有趣和美观?今天我就来分享一下我用 Rust 实现的一个小项目:二维码艺术生成器(qr-artist)。 项目起源 这个想法源于一个简单的需求:如何让二维码既实用又美观?普通的黑白二维码虽然功能强大,但看起来有些单调。我想,能不能让二维码变得更有艺术感,比如用彩色像素来呈现? 技术选型 我选择了 Rust 作为开发语言,因为它在系统编程方面的优秀表现和内存安全特性。项目中主要使用了以下几个库: 1. qrcode - 用于生成二维码数据 2. image - 用于图像处理和保存 3. clap - 用于构建命令行界面 这些库都很成熟且文档完善,让我能够专注于核心功能的实现。 核心实现 1. 基础二维码生成 项目的核心是将 URL 转换为二维码数据,然后将其渲染为图像: // 创建二维码let code =QrCode::new(

By Ne0inhk
实战教程:Leaflet+SpringBoot 实现地图任意点位点击查看时间功能

实战教程:Leaflet+SpringBoot 实现地图任意点位点击查看时间功能

目录 前言 一、需求解析 1、地图展示 2、时区和时间的关系 3、经纬度和时区的关系 二、应用实现 1、经纬度和时区求解 2、Leaflet 实现地图点击 3、前后台交互 三、成果展示 1、亚洲地区 2、欧洲地区 3、拉美地区 4、澳洲地区 四、总结 前言         在数字化、全球化的当下,地理位置与时间信息的结合应用,已经渗透到出行导航、跨境调度、物流追踪、国际业务展示等众多场景。用户不再满足于单纯查看地图点位,更需要点击地图任意位置,即可快速获取当地真实时间,比如针对国外新闻的展示,对于我国的用户需要知晓事件发生的时间,一般有两个时间的概念,即北京时间和当地时间。北京时间是跟我们同一时区,让我们清楚的知道在我们的时间时刻中,在何时发生。而全球是个分为多个时区的模式,

By Ne0inhk
vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)

vue3:最新实现腾讯人脸核身+增强版人脸核身使用方法及示例源码,Vue3如何使用腾讯云慧眼人脸核身,提供人脸核身案例、身份信息核验、活体检测与核身比对等示例代码(后端spring与thinkphp)

功能说明 vue3(H5端/微信公众号网页/PC端) 实现腾讯人脸核身+增强版人脸核身使用教程及示例代码,详解Vue3项目如何集成使用腾讯云人脸核身功能的流程及完整源码,提供多个示例代码:基础人脸核身使用教程+增强版人脸核身+活体检测与核身对比+身份信息验证+实名信息认证等,包括前后端对接,后端Java(Spring boot)与PHP(thinkphp)。 完整源码,多种示例开箱即用! 😃 付费后没解决问题直接找我+指导你解决为止 第一步 先来看下基本的功能介绍以及如何申请。

By Ne0inhk
Flutter 组件 tree_iterator 适配鸿蒙 HarmonyOS 实战:高性能树状数据遍历,构建海量节点递归优化与分布式层级调度架构

Flutter 组件 tree_iterator 适配鸿蒙 HarmonyOS 实战:高性能树状数据遍历,构建海量节点递归优化与分布式层级调度架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 tree_iterator 适配鸿蒙 HarmonyOS 实战:高性能树状数据遍历,构建海量节点递归优化与分布式层级调度架构 前言 在鸿蒙(OpenHarmony)生态迈向万物智联、涉及海量传感器拓扑映射、复杂 UI 树状 DOM 解析及超大型目录层级处理的背景下,如何实现高效、内存友好的“非线性数据遍历”,已成为决定应用数据发现效率与算法性能表现的基石。在鸿蒙设备这类强调 AOT 极致性能与低堆内存占用的环境下,如果应用依然采用简单的递归(Recursion)进行深度数据挖掘,由于由于树状结构深度的不可控性,极易由于由于“栈溢出(Stack Overflow)”或“重复解析”导致系统的瞬时崩卡。 我们需要一种能够解耦数据结构与遍历逻辑、支持深度/广度优先算法且具备“零样板代码”调用的迭代器方案。 tree_iterator 为

By Ne0inhk