【 PG 入门系列 】PostgreSQL的体系结构(三)

2022/2/20 19:35:36

本文主要是介绍【 PG 入门系列 】PostgreSQL的体系结构(三),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

PostgreSQL的体系结构(三)

  • 1. PG的体系结构
    • 1.1. Postmaster进程
    • 1.2. postgres进程
    • 1.3. 本地内存
    • 1.4. 数据库实例(INSTANCE)
      • 1.4.1. 共享内存
      • 1.4.2. 辅助进程
    • 1.5. Database Cluster
    • 1.6. 查询验证
  • 2. PG的数据目录结构
  • 3. PG的层级结构

Postgresql 系列博文讲解(B站同步介绍教学:https://space.bilibili.com/282421760)
支持一下,关注一波微信公众号:【 钥道不止 】

1. PG的体系结构

在这里插入图片描述PostgreSQL与Oracle都是使用共享内存的进程结构,而MySQL是线程模型。

1.1. Postmaster进程

守护进程,实际上是第一个postgres进程,主要职责有:

  • 数据库的启停
  • 监听客户端连接
  • 为每个客户端连接衍生(fork)专用的postgres服务进程
  • 当postgres进程出错时尝试修复
  • 管理数据文件
  • 管理数据库的辅助进程

1.2. postgres进程

实际上是postgres的子进程:

  • 直接与客户端进程通讯
  • 负责接收客户端所有的请求
  • 包含数据库引擎,负责解析SQL和生成执行计划等
  • 根据命令的需要调用各中辅助进程和访问各内存结构
  • 负责返回命令执行结果给客户端
  • 在客户端断开连接时释放进程

1.3. 本地内存

本地内存是服务器进程独占的内存结构,每个postgre子进程都会分配一小块相应内存空间,随着连接会话的增加而增加,它不属于实例的一部分。

  • work memory:用于排序的内存
  • maintenance work memory:内部运维工作的内存,如VACUUM垃圾回收、创建和重建索引
  • temp buffer:用于存储临时表的数据

1.4. 数据库实例(INSTANCE)

  • 实例是管理和访问数据库的一套方法,即所有客户端的请求,最终都会转
    换成实例对数据库磁盘文件的各种操作,从而达到读写数据的目的
  • 实例和数据库是一一对应的
  • 实例包含了若干个内存结构和进程

1.4.1. 共享内存

  • Shared buffer
    用于缓存表和索引的数据块。
    数据的读写都是直接对buffer操作,若所需的块不在缓存中,则需要从磁盘中读取。
    在buffer中被修改过的,但又没有写到磁盘文件中的块被称之为脏块。
    大小由shared_buffers参数控制。
  • WAL(Write Ahead Log) buffer:预写日志缓存
    用于缓存增删改等写操作产生的事务日志。
    大小由wal_buffers参数控制
  • Clog buffer:日志缓存
    Commit Log Buffer是记录事务状态的日志缓存
  • Stats buffer
  • Other buffer

1.4.2. 辅助进程

  • Backgroup write:后台写进程(BgWrite),LRU算法清理脏页,将shared buffer中的脏数据页写到磁盘文件中
  • AutoVacuum launcher/workers:系统自动清理进程(自动清理垃圾回收进程)
    当参数autovacuum设为on的时候启用自动清理功能。
    Launcher为清理的守护进程,每次启动的时候会调用一个或多个worker。
    Worker是负责真正清理工作的进程,由autovacuum_max_workers参数设定其数量。
  • WAL Writer:预写式日志进程,将预写日志写入磁盘文件
    触发时机:
    • WAL BUFFER满了;
    • 事务commit时;
    • WAL writer进程到达间歇时间时;
    • checkpoint发生时。
  • Checkpointer:检查点进程
    用于保证数据库的一致性
    它会触发bgwriter和wal writer动作
  • Archiver:归档进程(PgArch)
    用于将写满的WAL日志文件转移到归档目录,该进程只有在归档模式才会启用
  • SysLogger:系统日志进程
    采集PostgreSQL的运行状态,并将运行日志写入日志文件;
    logging_collector参数为on时启动,不建议关闭;
    log_directory设定日志目录;
    log_destination设定日志输出方式,甚至格式;
    log_filename设定日志文件名;
    log_truncate_on_rotation设定是否重复循环使用且删除日志;
    log_rotation_age设定循环时间;
    log_rotation_size设定循环的日志尺寸上线。
  • WAL Sender/Receiver
  • Stats collector:统计信息收集进程(PgStat)
    收集表和索引的空间信息和元组信息等,甚至是表的访问信息。收集到的信息能被优化器和autovaccum利用,甚至给数据库管理员作为数据库管理的参考信息。

1.5. Database Cluster

  • 这里的database cluster并非数据库集群,而是数据库簇,即数据库。PostgreSQL在磁盘上的一整套文件集合叫做database cluster。
  • 数据库包含了数据文件、日志文件等多种文件,用于存储用户数据和保证数据一致性。

1.6. 查询验证

# 进入postgres用户
su - postgres
# 查看postgres进程
ps -ef | grep postgres

在这里插入图片描述

2. PG的数据目录结构

在这里插入图片描述

  • base目录用于存放数据库的所有实体文件,下属子目录均以数据库OID命名
    数据库子目录下是以对象OID命名的文件

  • PG_VERSION 是当前数据库数据格式对应的版本号

  • _fsm结尾的文件是数据文件对应的FSM(free space map)文件,用位图方式来标识哪些block是空闲的

  • _vm结尾的文件是数据文件对应的VM(visibility map),在做多版本并发控制时是通过在元组头上标识“已无效”来实现删除或更新的,最后通过VACUUM功能来清理无效数据回收空闲空间。

  • pg_hba.conf:客户端认证配置文件,可以配置客户的连接协议、加密方式、ACL等等

  • pg_wal:WAL日志目录。

  • pg_xact:Commit log目录。V9版本以前为pg_clog目录。

  • postgresql.conf:配置文件,文本格式。

  • postgresql.auto.conf:也是参数配置文件,所有通过alter命令修改的命令,都会保存在这个文件中,该文件中的参数将会覆盖postgresql.conf文件相同参数的值,该文件为二进制

  • postmaster.pid:Postmaster主进程的操作系统PID,数据库实例正常启动以后就会生成该文件。

  • 表空间目录可以任意指定,结构与base目录类似

3. PG的层级结构

在这里插入图片描述



这篇关于【 PG 入门系列 】PostgreSQL的体系结构(三)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程