PG基础篇–核心架构

PG进程

PG基础篇--核心架构

启动PG时,会先启动一个Postmaster的主进程,还会fork出一些辅助子进程,这些辅助子进程各自负责一部分功能。

Logger(系统日志)进程

BgWriter(后台写)进程

WalWriter(预写式日志)进程

PgArch(归档)进程

AutoVacuum(系统自动清理)进程

PgStat(统计信息收集)进程

主进程Postmaster

主进程Postmaster是整个数据库实例的总控进程,负责启动和关闭数据库实例,用户可以运行postmaster,postgres命令并加上合适的参数来启动数据库,实际上,postmaster命令是一个指向postgres的链接。

主进程postmaster实际上是第一个postgres进程,此主进程还会fork出一些与数据库实例相关的辅助子进程,并对其进行管理。

当用户与pg数据库建立连接时,实际上是先与postmaster进程建立连接,此时,客户端程序会发出身份验证消息给postmaster主进程,postmaster主进程根据消息中的信息进行客户端身份验证,如果验证成功,postmaster主进程会fork出一个子进程来为该连接服务,fork出的子进程称为服务进程。

查询pg_stat_activity表时看到的PID就是这些服务进程的PID。

postgres=# select pid,usename,client_addr,client_port from pg_stat_activity;
pid | usename | client_addr | client_port
-------+----------+-------------+-------------
16159 | | |
16161 | postgres | |
24062 | postgres | | -1
24240 | postgres | | -1
24291 | postgres | | -1
16157 | | |
16156 | | |
16158 | | |
(8 rows)

当某个服务进程出现错误的时候,postmaster主进程会自动完成系统恢复。恢复过程中停掉所有的服务进程,然后进行数据库数据的一致性恢复,等恢复完成之后,数据库才可以接受新的连接。

Logger系统日志进程

logging_collect 设置为on时,主进程才会启动logger辅助进程。另外在配置文件中设置了日志文件的大小和存留时间,当一个日志文件达到了配置的大小或其他条件时,logger就会关闭旧的日志文件,并创建一个新的日志文件。如果收到了装载配置文件的信号(SIGHUP)就会检查配置文件中的配置参数log_directory和log_filename与当前配置是否相同,如果不同则会切换日志文件并使用新的配置。

BgWriter后台写进程

该进程主要负责把共享内存中的脏页写到磁盘上。

WalWriter预写式日志写进程

也叫xlog,写Wal日志的进程,在修改数据之前必须把这些修改操作记录到磁盘中,可以做异常宕机数据恢复,该日志保存在pg_xlog下,默认大小是16MB,为了满足恢复要求,在xlog目录下会产生多个wal日志,这样就可以保证在宕机后,未持久化的数据可以通过wal日志来恢复,那些不需要的wal日志就会被自动覆盖。

AutoVacuum自动清理进程

在pg中,对表进行delete操作后,原有的数据不会立即被删除,而且在更新数据时,也并不会在原有数据上更新,而是会新生成一行数据,也就是多版本。原有的数据只是被标识为删除状态,只有在没有并发的其他事务读到这些旧数据时,才会将其清除。这个清理工作就是有AutoVacuum进程来完成。

PgStat统计数据收集进程

主要做数据的统计收集工作,收集的信息主要用于查询优化时的代价估算。

pg内存

共享内存

共享内存主要用作数据块的缓冲区,以便提高读写性能,wal日志缓冲区和clog(commit log)缓冲区也存在于共享内存中,除此之外,一些全局信息也保存在共享内存中,如进程信息,锁信息,全局统计信息等。

本地内存

temp_buffers---临时缓冲区

用于存放数据库会话访问临时表数据,系统默认值为8M。

可以在单独的session中对该参数进行设置,尤其是需要访问比较大的临时表时,将会有显著的性能提升。

work_mem --- 工作内存或者操作内存。

其负责内部的sort和hash操作,合适的work_mem大小能够保证这些操作在内存中进行。

maintenance_work_mem ---维护工作内存主要是针对数据库的维护操作或者语句。主要针对VACUUM,CREATE INDEX,ALTER TABLE ADD FOREIGN KEY等操作。在对整个数据库进行VACUUM或者较大的index进行重建时,适当的调整该参数非常必要postresql文档提示在启用了autoacuum功能的情况下,该参数不能配置的过大。

pg存储结构

在默认表空间的base目录下有很多子目录,这些子目录的名称与相应数据库的OID相同。

postgres=# select oid,datname from pg_database;
oid | datname
-------+-----------
13593 | postgres
1 | template1
13592 | template0
16660 | db01
(4 rows)

drwx------ 2 postgres postgres 4096 May 11 10:47 1
drwx------ 2 postgres postgres 4096 May 11 10:47 13592
drwx------ 2 postgres postgres 12288 Jul 1 10:15 13593
drwx------ 2 postgres postgres 4096 May 15 11:36 pgsql_tmp

在这些库目录下面还有表,索引等数据库文件,会被分配一个文件号relfilenode。

默认表空间的目录 / database oid / relfilenode

select relnamespace,relname,relfilenode from pg_class where relname='test01';
relnamespace | relname | relfilenode
--------------+---------+-------------
2200 | test01 | 16521
(1 row)

如果是指定自己创建的表空间,则表和索引存储数据文件的目录为

表空间的根目录 / Catablog version 目录 / database oid / relfilenode

发表评论

相关文章