想学会更多实用技巧,欢迎加入青学会MOP技术社区(实名社区)。
加入方法:公众号后台回复关键字“加入”获取小助手微信,添加后登记入会。

同时欢迎大家在评论区留言互动交流!社区会不定期举行相关的抽奖、公开分享活动。
如果你有想了解的知识点希望我们发文可以后台私信。
正文开始
欢迎来到青学会&金仓专栏的第10期!本文将从实例结构、进程结构、内存结构、物理存储结构、逻辑存储结构等方面介绍金仓数据库的体系结构。
实例结构:
包含若干对存储的数据进行操作的数据库服务进程,还包括分配和管理内存,统计各种信息,以及实现各种协调工作的后台进程。一台设备上,可以同时运行多个实例。实例注册成实例服务后,会有唯一的名字标志一个实例。一个 KingbaseES 实例在操作系统上表现为一个 KingbaseES 进程,它可以由控制器启动,也可以单独用命令行启动。一个 KingbaseES 实例管理多个逻辑上的数据库。启动一个 KingbaseES 实例后,使用客户端可以访问到这个实例管理的任意一个数据库。

进程结构:
金仓数据库管理系统(KingbaseES)采用多进程架构,每个实例中包含多个进程,这些进程按功能可分为后台进程和服务进程两大类。这种架构设计使得KingbaseES能够高效地管理和操作数据库文件,提供稳定的服务。
2多进程结构
KingbaseES实例是一个多进程结构,每个实例中包含多个进程。这些进程协同工作,确保数据库的正常运行和高效管理。
后台进程
后台进程是KingbaseES实例中始终运行的进程,负责管理和维护数据库的内部操作。主要的后台进程包括:
主进程: 负责统一管理各服务进程和其他后台进程。 启动服务进程和其他后台进程。 在子进程退出时进行清理工作。 分发来自操作系统的信号到各子进程。 系统退出时,发送信号通知各子进程退出,然后再停止自己。 后台写进程: 定期将共享缓冲池中的脏页写入持久存储(如HDD、SSD)。 检查点进程: 执行检查点过程,确保数据的一致性和完整性。 自动vacuum进程: 定期执行清理和回收工作,包括删除过期的行版本和回收存储空间。 WAL日志写进程: 周期性地将WAL缓冲区中的WAL数据写入和刷新到持久存储。 统计进程: 收集和维护 sys_stat_activity
和sys_stat_database
等统计信息。归档进程: 将WAL日志文件归档到指定的位置,支持在线备份和恢复。 日志收集进程: 将数据库运行中的输出信息写入日志文件,便于故障排查和性能分析。 恢复进程: 当实例处于从恢复状态或开启热备份时,负责重做WAL日志,确保数据的一致性。 WAL日志发送、接收进程: 在RWC集群中,主节点通过WAL日志发送进程将WAL数据发送给备节点的WAL日志接收进程,实现数据复制。 kwr、ksh进程: 开启kwr和ksh功能时,这些后台进程负责收集和维护负载、会话历史数据。 自动作业进程: 开启自动作业功能时,自动作业后台进程实现作业的自动调度。
服务进程
服务进程是KingbaseES实例中为每个客户端连接创建的进程,负责处理客户端的数据库请求。主要特点包括:
客户端/服务器模型: KingbaseES使用客户端/服务器模型。主进程接收到客户端连接请求后,会为每个客户端创建一个新的服务进程。 处理客户端请求: 服务进程负责实际处理客户端的数据库请求,包括查询、插入、更新和删除等操作。 连接管理: 当客户端连接断开时,相应的服务进程会退出,释放资源
进程查看:
[root@kingbase ~]# ps -axf | head -1; ps -axf | grep kingbase | grep -v 'grep|sshd'
PID TTY STAT TIME COMMAND
9506 ? Ss 0:00 avahi-daemon: running [wykingbase.local]
109925 pts/1 S+ 0:00 | | \_ grep --color=auto kingbase
106972 ? Ss 0:00 /u01/app/Kingbase/ES/V9/KESRealPro/V009R001C001B0030/Server/bin/kingbase -D /u01/app/Kingbase/ES/V9/data
106973 ? Ss 0:00 \_ kingbase: logger
106975 ? Ss 0:00 \_ kingbase: checkpointer
106976 ? Ss 0:00 \_ kingbase: background writer
106977 ? Ss 0:00 \_ kingbase: walwriter
106978 ? Ss 0:00 \_ kingbase: autovacuum launcher
106979 ? Ss 0:00 \_ kingbase: stats collector
106980 ? Ss 0:00 \_ kingbase: kwr collector
106981 ? Ss 0:00 \_ kingbase: ksh writer
106982 ? Ss 0:00 \_ kingbase: ksh collector
106983 ? Ss 0:00 \_ kingbase: logical replication launcher
内存结构:
金仓数据库管理系统(KingbaseES)统一管理实例所用的内存资源。通过配置参数shared_buffers
,可以决定数据库实例使用的内存大小。系统启动时,数据库实例会向操作系统申请一块大内存作为共享内存,各个进程对内存资源的使用都在这块内存中进行操作。
共享内存的使用
共享内存是KingbaseES内存管理的核心,主要分为以下几个部分:
数据页面缓存: 用途:在内存中缓存数据页面,减少磁盘I/O操作。 配置: shared_buffers
参数决定了共享内存的大小。shared_buffers
越大,缓存的数据页面越多,相同条件下操作数据时的I/O操作越少。效果:提高查询性能,减少磁盘读写次数。 日志页面缓存: 用途:缓存WAL(Write-Ahead Logging)日志数据,确保事务的完整性和一致性。 配置: wal_buffers
参数设置日志页面缓存的大小。操作:操作数据时产生的日志首先存放在日志缓冲区中,然后由专门的写日志线程和服务线程将日志刷写到磁盘。 效果:减少日志写入的频率,提高性能。 排序和连接运算使用的缓存: 用途:在服务器对元组进行排序或连接运算时,需要用到内存缓存数据。 配置: work_mem
参数设置每个服务进程排序和连接运算使用的缓存大小。操作:如果所需的内存空间超过 work_mem
设置的大小,KingbaseES会使用临时文件来完成运算。效果:提高排序和连接运算的性能,减少临时文件的使用。 锁缓存: 用途:多线程并发操作时会用到锁,KingbaseES从共享内存中开辟独立的内存空间用于存放锁信息。 配置:锁缓存的大小由总的共享内存大小决定。 效果:确保并发操作的正确性和一致性,减少锁竞争。 临时分配的内存: 用途:服务器在处理数据流程中,用于临时存放数据所使用的内存。 配置:临时内存从共享内存中分配。 效果:提高数据处理的效率,减少内存碎片。
内存配置参数
shared_buffers: 描述:设置共享内存的大小,用于缓存数据页面。 默认值:通常为物理内存的25%左右。 建议:根据系统内存和数据库负载情况进行调整,通常设置为物理内存的25%到40%。 wal_buffers: 描述:设置WAL日志缓冲区的大小。 默认值:通常是 -1
,表示自动调整。建议:对于高负载系统,可以适当增加 wal_buffers
的大小,以减少日志写入的频率。work_mem: 描述:设置每个服务进程排序和连接运算使用的缓存大小。 默认值:通常是4MB。 建议:根据具体的查询负载和可用内存情况进行调整,对于复杂的查询可以适当增加 work_mem
的大小。
内存管理的优化
性能优化: 数据缓存:增加 shared_buffers
的大小可以提高数据缓存的效率,减少磁盘I/O操作。日志缓存:适当增加 wal_buffers
的大小可以减少日志写入的频率,提高性能。排序和连接:根据查询复杂度和可用内存,适当调整 work_mem
的大小,减少临时文件的使用。资源监控: 使用系统监控工具(如 top
、htop
)和数据库内置的监控工具(如pg_stat_activity
)来监控内存使用情况。定期检查和调整内存配置参数,确保系统在最佳状态下运行。
物理存储结构:
金仓数据库(KingbaseES)在初始化过程中会创建一个数据库实例,此实例会自动创建几个预定义的数据库:security
、template0
、template1
和 test
。这些数据库构成了数据库实例的基础架构,每个数据库中可以包含多种数据库对象,如表、索引、序列等。金仓数据库的所有数据在物理层面均以操作系统文件的形式存储于磁盘上,可以通过操作系统级别的命令进行查看和管理。
数据文件
页面组织:在金仓数据库中,数据文件是以页面的形式组织的,每个页面的大小为8KB。所有的I/O操作都是以页面为单位进行的。 文件结构:每个数据库在 data/base
目录下都有一个对应的子目录,该子目录的名称为该数据库在sys_database
表中的OID。在这个子目录中,每个表和索引都存储在独立的文件里,文件名通常与表或索引的文件节点号相对应。文件命名规则:对于临时表,文件名格式为 tBBB_FFF
,其中BBB
代表创建该文件的后台会话的后台ID,FFF
是文件节点号。除了主文件外,每个表和索引还包括空闲空间映射(后缀为_fsm
)和可见性映射(后缀为_vm
)分支,用于管理和优化存储。分段存储:当表或索引的大小超过1GB时,它们将被划分为1GB大小的段。首个段的文件名与其文件节点号相同,后续段则命名为 filenode.1
、filenode.2
等。
控制文件
金仓数据库使用位于data
目录及其子目录下的控制文件来记录和维护服务器的各种控制信息。这些文件对于数据库的正常运行至关重要,包括但不限于配置信息、数据库状态等。
日志文件
WAL日志:预写式日志(WAL)确保了数据的完整性和事务的一致性。它记录了对数据文件的所有修改,在事务提交前这些修改必须先被记录到WAL中。WAL的主要优点在于减少了磁盘写操作的次数,提高了系统的性能和可靠性。 事务日志:事务日志记录了事务的状态和可见性等信息,对于维护数据的一致性非常重要。主要的事务日志文件包括 sys_xact
、sys_csnlog
和sys_multixact
。在线日志:在线日志记录了用户的SQL操作和数据库运行期间的事件,有助于用户监控数据库状态并分析潜在的问题。这些日志默认记录在 sys_log
中,也可以根据需要配置到其他位置。
配置文件
金仓数据库的配置主要通过修改kingbase.conf
文件完成。此外,sys_hba.conf
和sys_ident.conf
文件用于控制客户端的认证过程,确保了数据库的安全访问。由ALTER SYSTEM
命令修改的配置参数会被自动记录在kingbase.auto.conf
文件中,方便了配置的管理和追踪。
[root@kingbase data]# ll
total 144
drwx------. 7 kingbase kingbase 4096 Oct 7 21:18 base
-rw-------. 1 kingbase kingbase 46 Oct 7 21:34 current_logfiles
drwx------. 2 kingbase kingbase 4096 Oct 7 21:34 global
-rw-------. 1 kingbase kingbase 357 Oct 7 21:18 initdb.conf
-rw-------. 1 kingbase kingbase 88 Oct 7 21:18 kingbase.auto.conf
-rw-------. 1 kingbase kingbase 27660 Oct 7 21:18 kingbase.conf
-rw-------. 1 kingbase kingbase 109 Oct 7 21:34 kingbase.opts
-rw-------. 1 kingbase kingbase 89 Oct 7 21:34 kingbase.pid
drwx------. 3 kingbase kingbase 4096 Oct 7 21:18 sys_aud
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_bulkload
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_commit_ts
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_csnlog
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_dynshmem
-rw-------. 1 kingbase kingbase 4159 Oct 7 21:18 sys_hba.conf
-rw-------. 1 kingbase kingbase 1371 Oct 7 21:18 sys_ident.conf
drwxrwxr-x. 2 kingbase kingbase 4096 Oct 7 21:34 sys_log
drwx------. 4 kingbase kingbase 4096 Oct 7 21:39 sys_logical
drwx------. 4 kingbase kingbase 4096 Oct 7 21:18 sys_multixact
drwx------. 2 kingbase kingbase 4096 Oct 7 21:34 sys_notify
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_replslot
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_serial
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_snapshots
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_stat
drwx------. 2 kingbase kingbase 4096 Nov 11 14:25 sys_stat_tmp
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_tblspc
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_twophase
-rw-------. 1 kingbase kingbase 3 Oct 7 21:18 SYS_VERSION
drwx------. 3 kingbase kingbase 4096 Oct 7 21:18 sys_wal
drwx------. 2 kingbase kingbase 4096 Oct 7 21:18 sys_xact
data目录下的必要内容说明:
| 项 | 类型 | 描述 |
|---|---|---|
| SYS_VERSION | 其他 | 一个包含KingbaseES主版本号的文件 |
| base | 数据文件 | 包含每个数据库对应的子目录,记录每个数据库内对象的 持久化数据或临时数据。 |
| current_logfiles | 控制文件 | 记录当前被日志收集器写入的日志文件的文件 |
| global | 数据文件 及控制文件 | 包含集簇范围的表的子目录,比如sys_database。此外,sys_control文件也存储在此目录下,该文件记录着 数据集簇标识符及版本、检查点信息、块大小等信息 |
| sys_commit_ts | 日志文件 | 包含事务提交时间戳数据的子目录 |
| sys_csnlog | 日志文件 | 包含事务提交序列号和子事务状态数据的子目录 |
| sys_dynshmem | 其他 | 包含被动态共享内存子系统所使用的文件的子目录 |
| sys_logical | 控制文件 | 包含用于逻辑复制的状态数据的子目录 |
| sys_multixact | 日志文件 | 包含多事务(multi-t ransaction)状态数据的子目录(用于共享的行锁) |
| sys_notify | 日志文件 | 包含LISTEN/NOTIFY状态数据的子目录 |
| sys_replslot | 其他 | 包含复制槽数据的子目录 |
| sys_serial | 日志文件 | 包含已提交的可序列化事务信息的子目录 |
| sys_snapshots | 其他 | 包含导出的快照的子目录 |
| sys_stat | 其他 | 包含用于统计子系统的永久文件的子目录 |
| sys_stat_tmp | 其他 | 包含用于统计信息子系统的临时文件的子目录 |
| sys_tblspc | 其他 | 包含指向表空间目录的符号链接的子目录,该符号链接所 指向的表空间目录中存储了所属该表空间的数据文件。 |
| sys_twophase | 日志文件 | 包含用于预备事务状态文件的子目录 |
| sys_wal | 日志文件 | 包含 WAL(预写日志)文件的子目录 |
| sys_xact | 日志文件 | 包含事务提交状态数据的子目录 |
| kingbase.auto.conf | 配置文件 | 一个用于存储由ALTER SYSTEM 设置的配置参数的文件 |
| kingbase.opts | 控制文件 | 一个 记录服务器最后一次启动时使用的命令行参数的文件 |
| kingbase.pid | 控制文件 | 一个锁文件,记录着当前的 kingbase 进程ID(PID)、集簇数据目录路 径、kingbase启动时间戳、端口号、Unix域套接字目 录路径(Windows上为空)、第一个可用的listen_address (IP地址或者*,或者为空表示不在TCP上监听 )以及共享内存段ID(服务器关闭后该文件不存在) |
data目录下可选内容说明:
| 项 | 类型 | 描述 |
|---|---|---|
| kingbase.conf | 配置文件 | 一个用于存储用户自设置的配置参数的文件 |
| sys_hba.conf | 配置文件 | 一个用于配置客户端认证方式的文件 |
| sys_ident.conf | 配置文件 | 一个用于配置客户端认证所需的用户名映射的文件 |
| sys_log | 日志文件 | 包含数据库在线日志文件的子目录 |
逻辑存储结构:

表空间
表空间是在文件系统中定义的,用于指定数据库对象(如表、索引等)存储位置的逻辑容器。通过表空间,数据库管理员可以灵活地管理数据库文件的物理存储位置,从而优化性能或解决磁盘空间不足的问题。
创建和管理: 创建:使用 CREATE TABLESPACE
语句可以创建新的表空间。创建时需要指定表空间的名称和目标路径。删除:使用 DROP TABLESPACE
语句可以删除已存在的表空间。但是,删除表空间之前必须确保该表空间不再被任何数据库对象使用。使用:在创建数据库对象时,可以通过 TABLESPACE
子句指定该对象使用的表空间。如果没有指定,默认使用系统表空间。用途: 磁盘空间管理:当主数据目录所在分区或卷空间不足时,可以通过创建新的表空间来扩展存储空间。 性能优化:可以根据数据库对象的使用频率和性能需求,将不同的对象存储在不同类型的存储介质上。例如,频繁使用的索引可以存储在高速SSD上,而较少使用的归档数据可以存储在较慢的HDD上。 注意事项: 表空间是数据库集簇的一部分,依赖于主数据目录中的元数据。因此,表空间不能被单独备份或附加到其他数据库集簇。 如果表空间所在的文件系统损坏或丢失,可能会影响整个数据库集簇的可用性。
段
段是表或索引等数据库对象在表空间中的物理存储单元。每个段对应一个物理文件,用于存储一个关系的部分数据。
结构: 一个段内部被划分为多个数据块(页面),每个数据块存储一部分数据。 当表或索引的大小超过1GB时,会被拆分为多个1GB大小的段。段文件的命名规则为 filenode.1
、filenode.2
等。用途: 通过将大型表或索引拆分为多个段,可以提高文件系统的性能和可靠性。 每个段文件的大小限制可以避免在某些文件系统中遇到的文件大小限制问题。
数据块
数据块(页面)是金仓数据库中管理数据的最小单位。所有I/O操作都以数据块为单位进行。
大小: 默认情况下,数据块的大小为8KB。这个大小可以在初始化数据库实例时通过配置参数进行调整。 数据块的大小必须是操作系统数据块大小的整数倍。 用途: 数据块是数据存储和检索的基本单位。每个数据块存储一定数量的行数据。 通过合理设置数据块的大小,可以优化I/O性能和内存使用效率。
通过对金仓数据库管理体系结构的全面介绍,我们可以看到,KingbaseES不仅具备强大的数据存储和管理能力,还在性能优化、高可用性和安全性方面表现出色。其多进程架构、丰富的内存管理机制以及灵活的表空间管理,使得KingbaseES能够在各种复杂的应用场景中稳定运行。
此外,如果您对kingbase数据库感兴趣,请继续关注我们的专栏。
往期文章回顾
MOP社区新闻
金仓专栏
告别繁琐!KingbaseES v9数据库一键安装-青学会&金仓专栏(1)
KingbaseES v9数据库Docker安装-青学会&金仓专栏(2)
DBA实战小技巧
实战:记一次RAC故障排查
DBA实战运维小技巧安装篇(一)Oracle 主流版本不同架构下的静默安装指南
DBA实战运维小技巧存储篇(一)根目录满了如何处理
DBA实战运维小技巧存储篇(二)打包迁移单机数据库至新存储
MOP社区投稿-内核开发
简单解析 IvorySQL 增强 Oracle xml 兼容能力的原理
简单讨论 PostgreSQL C语言拓展函数返回数据表的方式
简单分析 pg_config 程序的作用与原理
Redis 日志机制简介(一):SlowLog
Redis 日志机制简介(二):AOF 日志
Redis 日志机制简介(三):RDB 日志
pg_cron插件使用介绍
Redis 的指令表实现机制简介
pg几款源码工具介绍
Redis 事务功能简介




