暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

1_PostgreSQL体系结构

原创 怕晒的太阳 2022-11-03
1647

PostgreSQL数据库启动时会启动若干个进程,其中有Postmaster(守护进程)、postgres(服务进程)、syslogger、checkpointer、bgwriter、walwriter等辅助进程

1.进程和内存架构图


Postgresql数据库启动时,先启动一个叫 Postmaster 的主进程。它会fork 出一些辅助子进程,这些辅助子进程各自负责自己的功能。主要辅助子进程如下:
SysLogger(系统日志)进程  #需要打开参数logging_collector=on
BgWriter(后台写)进程
WalWriter(预写式日志)进程
PgArch(归档)进程    #需要打开参数archive_mode=on
AutoVAcuum(系统自动清理)进程
PgStat(统计收集)进程

以下图的版本是PostgreSQL15,其中统计收集被优化了


2.架构详解:

Postmaster进程  

Postmaster是守护进程,实际上是第一个postgres进程,主要职责有:
• 数据库的启停
• 监听客户端连接
• 为每个客户端连接衍生(fork)专用的postgres服务进程
• 当postgres进程出错时尝试修复
• 管理数据文件
• 管理数据库的辅助进程  

postgres进程 

Postgres进程是实际上是postmaster的子进程:

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

本地内存  

• 本地内存是服务器进程独占的内存结构,每个postgre子进程都会分配一小块相应内存空间,随着连接会话的增加而增加,它不属于实例的一部分
• work_mem:用于排序的内存
• maintenance_work_mem:用于内部运维工作的内存,如VACUUM垃圾回收、创建和重建索引等等
• temp_buffers:用于存储临时表的数据 

 数据库实例 

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

 共享内存

• Shared Buffer:
– 用于缓存表和索引的数据块
– 数据的读写都是直接对BUFFER操作的,若所需的块不再缓存中,则需要从磁盘中读

– 在buffer中被修改过的,但又没有写到磁盘文件中的块被称之为脏块
– 由shared_buffers参数控制尺寸
• WAL(Write Ahead Log) Buffer:
– 预写日志缓存用于缓存增删改等写操作产生的事务日志
– 由wal_buffers参数控制尺寸
• Clog Buffer:
– Commit Log Buffer是记录事务状态的日志缓存 

辅助进程

• Backgroup writer:
– 工作任务是将shared buffer中的脏数据页写到磁盘文件中
– 使用LRU算法进行清理脏页
– 平时多在休眠,被激活时工作
• Autovacuum launcher/workers:
– 自动清理垃圾回收进程
– 当参数autovacuum设为on的时候启用自动清理功能
– Launcher为清理的守护进程,每次启动的时候会调用一个或多个worker
– Worker是负责真正清理工作的进程,由autovacuum_max_workers参数设定其数量 

• WAL writer:
– 将预写日志写入磁盘文件
– 触发时机:
    • WAL BUFFER满了
    • 事务commit时;
    • WAL writer进程到达间歇时间时;
    • checkpoint发生时;
• Checkpoint:
– 用于保证数据库的一致性
– 它会触发bgwriter和wal writer动作
– 拥有多个参数控制其启动的间隔  

• Syslogger:
– 采集PostgreSQL的运行状态,并将运行日志写入日志文件
– logging_collector参数为on时启动,不建议关闭
– log_directory设定日志目录
– log_destination设定日志输出方式,甚至格式
– log_filename设定日志文件名
– log_truncate_on_rotation设定是否重复循环使用且删除日志
– log_rotation_age设定循环时间
– log_rotation_size设定循环的日志尺寸上线 

• Archiver:
– 用于将写满的WAL日志文件转移到归档目录,该进程只有在归档模式才会启用
• Statistics Collector:
– 统计信息的收集进程。收集表和索引的空间信息和元组信息等,甚至是表的访问信
息。收集到的信息除了能被优化器使用以外,还有autovaccum也能利用,甚至给数
据库管理员作为数据库管理的参考信息 

数据库 Database cluster

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

3.PostgreSQL目录结构 

1.安装目录结构
Postgresql安装目录下,可以在安装编译时指定安装目录,软件目录结构如下:



2.数据库data数据目录


• base: 该目录包含数据库用户所创建的各个数据库,同时也包括postgres、 template0和template1的pg_default tablespace

• pg_wal:该目录包含wal日志,WAL日志目录,非常重要。

    日志文件默认为16M,编译安装时可指定大小: --with-wal-segsize=64( 64M)

    格式:000000010000000000000008

    当空间不足,导致数据库启动不了。可以把比较旧的xlog移动到别的目录。

    wal_keep_segments=100 保留文件数。占用空间wal_keep_segments*16M
• log: 该目录包含数据库日志。 (目录名可自定义)

• global: 该目录包含集群范围的各个表和相关视图。 ( pg_database、 pg_tablespace )

• pg_clog: 该目录包含事务提交状态数据。文件并不大,不需要特别维护。

• pg_multixact: 该目录包含多事务状态数据(等待锁定的并发事务)

• pg_notify :该目录包含LISTEN/NOTIFY状态数据。

• pg_serial:该目录包含了已经提交的序列化事务的有关信息。

• pg_snapshots:该目录包含导出的快照。

• pg_stat_tmp:该目录包含统计子系统的临时文件。

• pg_subtrans:该目录包含子事务状态数据。

• pg_tblspc:该目录包含表空间的符号链接。

• pg_twophase:该目录包含预备事务的状态文件。

• pg_commit_ts:该目录包含已提交事务的时间。

• pg_dynshmem:该目录包含动态共享内存子系统使用的文件。

• pg_logical:该目录包含逻辑解码的状态数据。

• pg_replslot:该目录包含复制槽数据。

• pg_stat:该目录包含统计子系统的永久文件。

• PG_VERSION:包含版本信息。 

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

• pg_xact: Commit log目录,非常重要。 V9版本以前为pg_clog目录

• postgresql.conf: 该database cluster的配置文件,文本格式

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

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

最后修改时间:2022-11-17 08:49:31
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论