ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2022-02-20 12:31:18  阅读:268  来源: 互联网

标签:文件 PostgreSQL postgres buffer 数据库 PG 进程 日志 体系结构


PostgreSQL的体系结构(三)

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的层级结构

在这里插入图片描述

标签:文件,PostgreSQL,postgres,buffer,数据库,PG,进程,日志,体系结构
来源: https://blog.csdn.net/suoyue_py/article/details/121140990

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有