Chapter 7. 体系结构
7.1. PostgreSQL 体系概念
在我们继续之前,我们应该理解一些 PostgreSQL系统体系的基本概念.理解了 PostgreSQL 各部分之间的相互作用能让 我们更容易理解下一章的内容.在数据库的范畴里, PostgreSQL 使用一个简单的"每用户一进程"的 client/server 模型.一个 PostgreSQL 会话由下面一些UNIX进程(程序)组成:
*
一个监控的守护进程 (postmaster),
*
用户的前端应用(如,psql 程序),和
*
一个或者多个后端数据库服务器 (postgres进程本身).
一个 postmaster 管理某台主机上的一定的数据库集合. 这个数据库集合叫做一个(数据库的)集群. 如果某个前端应用想访问某个节点中的某一数据库, 它就会进行与应用链接到一起的接口库(函数)调用(比如,libpq). 库把用户的请求通过网络发给 postmaster (Figure 7-1(a)), postmaster接着便启动一个新的后端服务进程 (Figure 7-1(b)))
Figure 7-1. 联接是如何建立的
并将前端进程和这个新的服务进程联接起来 (Figure 7-1(c)). 从这时起,前端进程和后端服务将不再通过 postmaster 而是直接进行通讯.因而, postmaster 总是在运行,等待着联接请求,而前后端进程则是起起停停. libpq 库能够让一个前端与后端做多个联接. 不过,每个后端进程仍然是一个单线程的进程,任意时刻只能执行一个查询. 因此,任何前端到后端之间的通讯都是单线程的.
这种体系结构表明 postmaster 和后端总是跑在同一台机器上(数据库服务器), 而前端应用可以在任何地方运行.必须牢记这一点, 因为在客户机上用户可以访问的文件在数据库服务器上不一定可 以访问(或者只能通过不同的路径名访问).
同时我们还应该注意 postmaster 和 postgres服务进程是以 PostgreSQL "超级用户"的用户标识(user-id)运行的.要注意的是 PostgreSQL 超级用户不一定非要是一个特殊 的用户(如,一个叫postgres的用户),尽管有许多系统 是用这个用户名.另外, PostgreSQL 超级用户绝不能是 UNIX 超级用户root! 只要是 Unix 系统环境,那么 PostgreSQL 超级用户是一个普通的非特权用户时是最安全的. 在任何情况下,所有与数据库有关的文件都属于这个 PostgreSQL 超级用户.