原文

作者:Raghavendra

很高兴在这里发布我的第一篇博客,是关于 PostgreSQL 构架的。

在很长一段时间里,我在工作、学习上都广泛地接触PostgreSQL。作为一个初学者,想到尝试给出一张关于 PostgreSQL 的架构图。PostgreSQL构架包括几部分:内存、进程和文件存储系统,这难以在一张图里展示所有东西。我尽我所能地给出一个关于PostgreSQL构架的概要。

大部分的设计都是在我们的PostgreSQL提交者(Heikki,Robert Haas,Bruce)的帮助下完成的, 我从他们身上学习到了很多关于PostgreSQL内部的东西。 非常感谢他们的协作让我了解到关于PostgreSQL的一切。我不是黑客,也不是构架师,仅仅是为PostgreSQL新手写了一篇文章。请留下你的评论、建议或者发现到我写文章的任何错误也可留言。

PostgreSQL 9.0 构架概述

PostgreSQL实例由一系列进程和内存组成。PostgreSQL 使用一个简单的 “每个用户一个进程” 的 客户/服务器 模型。PostgreSQL 有许多种类型进程。

  • postmaster进程,是后台监听进程,postmaster附加到共享内存段(我注:其实就是通过共享内存来进行进程间的通信),但是尽量避免访问它(我注:避免我们自定义去访问该共享内存,而是由PG内部各进程进行协调)。

  • 实用进程(bgwriter后台写进程,walwriter预写式日志写进程,syslogger系统日志进程,archiver归档进程,statscollector状态收集器进程 以及 autovacuum自动清理进程)以及

  • 用户后台进程(postgres进程自身,服务器进程)

当有一个客户端请求连接到数据库时,首先,请求被postmaster后台进程执行身份认证,受权之后会复制一个服务器后台进程(postgres进程)来处理该请求。从那时起,客户端进程和服务器端进程进程通信,而不再需要postmaster介入。因此,postmaster进程是一直在运行的,一直等待连接请求,然而客户端和服务器端进程会继续进行通信。libpq库允许一个单客户端连接到多个服务器进程。

然而,每个后台进程都是单线程的,一次仅仅只能执行一条查询;所以,任何的一个前端-后台连接都是单线程的。postmaster进程和postgres进程都是以PostgreSQL的”超级用户”身份的用户ID来运行的。每个打开数据库的会话里都会存在一个postgres进程。一旦经过身份验证的用户连接,它就会与共享内存直接连接(与谁,目的是做什么)。

内存

  • Shared Buffers,共享缓冲区
  • WAL Buffers,预写式日志缓冲区
  • clog Buffers,是一种 SLRU 类型的缓冲区(Commit log,提交日志缓冲区)
  • Other Buffers,其他缓冲区

PostgreSQL共享内存是非常大的并且所有缓冲区都没有同步的,这意味着都是独立的。一些专家/提交者已经将他们的大量关于PostgreSQL的经验信息放在网站上。结合PostgreSQL文档和这个构架图就会对PostgreSQL构架的有个基础的了解。以下链接有更多概述.

http://www.postgresql.org/docs/9.0/interactive/runtime-config-resource.html http://www.enterprisedb.com/docs/en/8.4/pg/runtime-config-resource.html http://www.postgresql.org/files/documentation/books/aw_pgsql/hw_performance/0.html

实用进程:

强制性进程:这些进程是没有选项来 开启/关闭 的

  • BGWriter

  • WAL Writer

可选进程:这些进程是有选项来 开启/关闭 的

  • Stats-collector,状态收集进程
  • Autovacuum launcher,自动清理进程
  • Archiver,归档进程
  • Syslogger,系统日志进程
  • WAL Sender,预写式日志发送进程
  • WAL Receiver,预写式日志接收进程

不久,我将会提交一张关于实用性进程和用户后台进程的概要图

献上我真诚的问候 Raghav