赞
踩
PostgreSQL作为一个单机的关系型数据库,与单机Oracle的架构是比较相似的,与MySQL的InnoDB引擎也比较像。据我目前的了解,单机数据库的整体架构都差不太多,都是包含一个主的进程,一些辅助进程,以及一个大的共享内存池。下面我们具体学习一下PG架构里面的这些部分。
PostgreSQL是一个多进程架构的客户端/服务器模式的关系型数据库管理系统。PG数据库中的一系列进程组合进来就是PostgreSQL服务端。这些进程可以细分为以下几大类:
从上图可以看出,PG数据库中有一个主的postgres server进程,针对每个客户端有一个backend postgres进程,另外有一系列的background后台进程(针对不同的功能模块)。所以这些进程都对应一个共享内存shared memory。
下面我们再具体学习一下每类进程的主要工作内容。
postgres server process是所有PG进程的父进程,在以前的版本中称为postmaster。当使用pg_ctl start启动数据库时,这个进程就被启动了, 然后它会启动一个共享内存shared memory,启动多个background后台进程,启动复制相关进程,如有需要也启动background worker progress,然后等待客户端的连接。
当接收到一个客户端连接时,它就会启动一个backend progress,专门服务于这个客户端。
postgres server process通常有一个对应的监听端口,默认是5432。如果一台机器上安装多个postgres实例有多个postgres server process,那么就需要修改对应的端口地址比如5433、5434等。
backend process也称为postgres进程,是由上面的postgres server process启动的用于服务于对应的客户端,通过TCP协议和客户端进行通信。
由于这个进程只能服务于一个特定的database,所以需要在连接PG数据库的时候指定一个默认连接的database。
PG允许多个客户端同时连接数据库,由max_connections参数控制最大并发连接数,默认是100。
如果有很多客户端频繁的对数据库进行短连接与释放连接,那么可能会造成连接耗时比较长,因为PG目前没有连接池的功能。针对于这种场景,一般通过像pgbouncer或pgpool-II这种插件来优化。
background process后台进程有多个,每个进程负责一个模块或是一类任务,下面表格总结每个进程的描述。
进程 | 描述 |
---|---|
background writer | 负责将共享内存中的脏页刷到持久化存储,在PG9.1或更早版本中也负责checkpoint的工作 |
checkpointer | 在PG9.2及之后版本中,引入用来单独处理checkpoint任务 |
autovacuum launcher | 向postgres server进程请求启动autovacuum worker进程,用来进行定期的aotuvacuum任务 |
WAL writer | 负责将共享内存中的WAL周期性的刷到持久化存储 |
statistics collector | 负责收集统计信息,如pg_stat_activity和pg_stat_database |
logging collector | 负责把错误消息写到日志文件 |
archiver | 负责归档日志 |
以下是一个环境中查看到的PG相关进程列表,
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
了解完进程架构后,我们再来了解一下内存架构,PG中的内存主要分为两类:
本地内存区有多个,每个对应一个backend progres进程,用于处于这个连接内部的一些工作,包括:
子区域 | 描述 |
---|---|
work_mem | 进行ORDER BY/DISTINCT语句相关的排序工作,以及像merge关联或hash关联之类的关联工作 |
maintenance_work_mem | 一些维护之类的工作,比如vacuum、reindex之类 |
temp_buffers | 存储临时表相关的工作 |
共享内存区在数据库启动时创建,也可以划分为多个子区域,包括:
子区域 | 描述 |
---|---|
shared buffer pool | 从持久化存储中把表及索引数据加载到这个区域直接操作数据 |
WAL buffer | 为了保证数据不丢失,PG支持WAL机制,WAL数据(XLOG)就是事务相关的日志,WAL buffer是WAL日志落盘前的缓冲区 |
commit log | commit log(CLOG)保存所有事务的状态,如in_progress、committed、aborted |
除此之外,共享内存区还包括一些其他的子区域:
以及其他子区域。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。