《postgresql指南--内幕探索》第二章 进程与内存架构

本文参考书籍《postgresql指南–内幕探索》的
Chapter 2:Process and Memory Architecture
该书的网络内容可参考:The Internals of PostgreSQL

进程架构

Postgresql 是一个C/S架构的关系型数据库,由多个后台进程管理数据库,下面分别介绍一些这些进程:

  • postgres server process :是所有进程的父进程
  • backend process:每一个客户端的连接都有一个后端进程存在
  • backgroud processes:为管理数据库而产生的一些进程
  • backgroud work processes:9.3以后版本开始有这个进程
    进程架构图如下:
    在这里插入图片描述

下面简短的介绍一些这几个进程的作用

postgres server process

正如上所说,是所有进程的父进程,早期的版本叫postmaster.

pg_ctl start执行后,这个进程就会启动。然后,从物理内存中分配内存给shared memory,然后产生很多其他的backgroup processes ,等待客户端来连接,每产生一个连接就会生成一个backend process,一个postgres server process只能监听一个端口,默认端口是5432。尽管一台机器可以运行多个server,但是端口必须不同。

backend processes

通过TCP协议和客户端建立通讯,当客户端断开时,连接消失。允许多个客户端同时连接,连接数由max_connections参数控制,默认是100,如果客户端频繁的和服务端建立连接然后断开,会增加数据库的开销,导致服务器负载不正常,因为数据库本身不提供连接池的功能,如果有需要,可以使用pgbouncer或者pgpool-II。

backgroud processes

下面列出了相关的服务端进程,这里只做简单的介绍:

processdescription
background writer进程将shared buffer pool中的脏数据写到磁盘,检查点总能触发这个进程
checkpointer在9.2版本以后,检查点会触发产生这个进程
autovacuum launcher为vacuum process周期性的调用autovacuum work processes
WAL writer周期性的从wal buffer刷新数据到磁盘
statistics collector收集统计信息进程,比如pg_stat_activity 和pg_stat_database的数据
logging collector (logger)将错误信息写入到日志
archiver将日志归档的进程

这里显示了PostgreSQL数据库的进程信息。在以下示例中,一个postgres服务器进程(pid为9687),两个后端进程(pids为9697和9717)以及上表中列出的几个后台进程正在运行。

postgres> pstree -p 9687
-+= ​00001 root /sbin/launchd
​\-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
  ​|--= 09688 postgres postgres: logger process     
  ​|--= 09690 postgres postgres: checkpointer process     
  ​|--= 09691 postgres postgres: writer process     
  ​|--= 09692 postgres postgres: wal writer process     
  ​|--= 09693 postgres postgres: autovacuum launcher process     
  ​|--= 09694 postgres postgres: archiver process     
  ​|--= 09695 postgres postgres: stats collector process     
  ​|--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle  
  ​\--= 09717 postgres postgres: postgres sampledb 192.168.1.100(54964) idle in transaction 
内存架构

在Postgresql中,内存大概被分为两块:

  • Local memory area – 为每一个backend process 分配的内存
  • Shared memory area – PostgreSQL server 所有的backgroud process使用的内存
    在这里插入图片描述
本地内存区域

每一个backend process 都会分配一块local memory area,每一块区域又分为三个子区域 ,见下表:

sub-areadescription
work_mem用户在sort,distinct,merge join,hash join的时候会用到这块区域
maintenance_work_memvacuum,reindex会用到这块区域
temp_buffers存储临时表会用到这块区域
共享内存区域

这块区域在服务器启动的时候分配,这块区域也是分为好几个子区域,见下面介绍:

sub-areadescription
shared buffer pool将表或者索引的page从磁盘加载到shared buffer,然后在shared buffer操作
WAL buffer为了确保服务器故障不会丢失任何数据,PostgreSQL支持WAL机制。WAL数据(也称为XLOG记录)是PostgreSQL中的事务日志;WAL缓冲区是在写入持久性存储之前WAL数据的缓冲区。
commit log提交日志(CLOG)为并发控制(CC)机制保留所有事务的状态(例如,进行中,已提交,已中止)。

除此之外,PostgreSQL还分配了几个区域,如下所示:

  • 各种访问控制机制的子区域。(例如,信号灯,轻量级锁,共享锁和排他锁等)
  • 各种后台进程的子区域,例如checkpointer和auto vacuum。
  • 事务处理的子区域,例如保存点和两阶段提交。
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是一种开源关系型数据库管理系统,具有高度可扩展性、安全性和可靠性,是许多企业和应用程序的首选数据库。在本指南中,我们将深入探讨PostgreSQL的内部结构和运作方式,以帮助您更好地理解和优化您的数据库。 1. PostgreSQL架构 PostgreSQL架构由多个进程组成,每个进程都具有特定的任务。以下是PostgreSQL的主要组件: - 后台进程:管理数据库文件、完成备份和恢复操作以及其他管理任务。 - 前台进程:处理客户端请求、执行SQL查询和更新操作。 - 共享缓存:存储常用表和索引的数据块,以提高查询性能。 - 数据文件:存储数据库表和索引的数据。 PostgreSQL的体系结构非常灵活,可以在不同的硬件和操作系统上运行,并且可以根据需要进行配置。 2. 数据库对象 PostgreSQL支持多种类型的数据库对象,包括表、视图、索引、函数、存储过程和触发器等。这些对象可以存储在不同的命名空间中,例如公共命名空间、用户命名空间和模式命名空间。每个对象都有一个唯一的OID(对象标识符),用于在系统中标识它。 3. 数据库事务 PostgreSQL使用多版本并发控制(MVCC)来管理事务,这意味着每个事务都可以看到数据库的某个历史状态。当一个事务更新数据时,它实际上只是在数据库中创建了一个新版本的数据,而不是直接更新现有数据。这使得多个事务可以同时读取和更新相同的数据,而不会相互干扰。 4. 查询处理 PostgreSQL使用优化器来处理SQL查询,选择最有效的执行计划。优化器考虑了多种因素,包括查询条件、表大小、索引可用性和查询类型等。一旦找到最佳执行计划,PostgreSQL就使用执行器执行查询并返回结果。 5. 数据库安全 PostgreSQL提供多种安全功能,包括用户认证、访问控制和加密通信。用户可以通过用户名和密码进行身份验证,并根据需要进行授权。管理员可以使用访问控制列表(ACL)来限制用户对特定数据库对象的访问权限。此外,PostgreSQL还支持SSL和TLS协议来加密数据传输。 总结 PostgreSQL是一个功能强大、高度可扩展和安全的关系型数据库管理系统。它使用多版本并发控制来管理事务,具有灵活的架构和优化器来处理SQL查询,同时提供多种安全功能来保护数据安全。通过深入了解PostgreSQL的内部结构和运作方式,您可以更好地优化和管理您的数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值