面试官:谈谈你对PG体系结构的理解?

运维 数据库运维 架构
今天本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来介绍一下PostgreSQL的架构。

今天本文主要从日志文件、参数文件、控制文件、数据文件、redo日志(WAL)、后台进程这六个方面来介绍一下PostgreSQL的架构。

架构

PostgreSQL的主要架构如下:

面试官:谈谈你对PG体系结构的理解?

一、日志文件

1. 日志文件种类

  • $PGDATA/log 运行日志(pg10之前为$PGDATA/pg_log)
  • $PGDATA/pg_wal 重做日志(pg10之前为$PGDATA/pg_xlog)
  • $PGDATA/pg_xact 事务提交日志(pg10之前为$PGDATA/pg_clog)
  • 服务器日志,可以在启动的时候指定,比如pg_ctl start -l ./alert.log

2.  运行日志

运行日志主要相关的参数如下,默认没有开启的话没有log目录,开启后会自动生成。

面试官:谈谈你对PG体系结构的理解?

面试官:谈谈你对PG体系结构的理解?

3. 事务日志pg_xact

pg_xact是事务提交日志,记录了事务的元数据。默认开启。内容一般不能直接读。

4. 服务器日志

如果用pg_ctl启动的时候没有指定-l参数来指定服务器日志,错误可能会输出到cmd前台。服务器日志记录了数据库的重要信息。

lsof或许可以过滤出在写的日志文件

  1. $lsof -c postgres| grep REG | grep -v /usr | grep -v /dev | grep -v /SYS 

二、参数文件

1. postgresql.conf

pg的主要参数文件,有很详细的说明和注释,和Oracle的pfile,MySQL的my.cnf类似。默认在$PGDATA下。很多参数修改后都需要重启。9.6之后支持了alter system来修改,修改后的会存在$PGDATA/postgresql.auto.conf下,可以reload或者 restart来使之生效。

主要的参数如下:

面试官:谈谈你对PG体系结构的理解?

面试官:谈谈你对PG体系结构的理解?

2. pg_hba.conf

这个是黑白名单的设置。文件里有详细的参数说明,默认参数如下:

  • type 列有local,host,hostssl,hostnossl四种。local是本地认证
  • database 可以是all,或者指定的数据库
  • user列可以是all,或者具体的用户
  • address 可以是ip或者网段
  • method比较重要,有"trust", "reject", "md5", "password", "scram-sha-256", "gss", "sspi", "ident", "peer", "pam", "ldap", "radius" or "cert"这么多可选。trust是免密登录;reject是黑名单拒绝;md5是加密的密码;password是没有加密的密码;ident是Linux下PostgreSQL默认的local认证方式,凡是能正确登录服务器的操作系统用户(注:不是数据库用户)就能使用本用户映射的数据库用户不需密码登录数据库

3. pg_ident.conf

pg_ident.con是用户映射配置文件。结合pg_hba.connf中,method为ident可以用特定的操作系统用户和指定的数据库用户登录数据库。如下:

pg_ident.conf如下:

面试官:谈谈你对PG体系结构的理解?

pg_hba.conf如下:

面试官:谈谈你对PG体系结构的理解?

三、控制文件

1. 控制文件位置

  1. $PGDATA/global/pg_control 

控制文件在数据库目录的global目录下。控制文件记录了数据库的重要信息。

2. 查看控制文件

pg_controldata可以查看控制文件的内容

  1. $ pg_controldata $PGDATA 
  2. pg_control version number: 1100 
  3. Catalog version number: 201809051 
  4. Database system identifier: 6684270596680436587 #dbid 
  5. Database cluster state: in production # primary 
  6. pg_control last modified: Thu 16 May 2019 02:26:37 PM CST 
  7. Latest checkpoint location: 0/48812A0 
  8. Latest checkpoint's REDO location: 0/4881268 #redo 位置 
  9. Latest checkpoint's REDO WAL file: 000000010000000000000001 #wal文件号 
  10. Latest checkpoint's TimeLineID: 1 
  11. Latest checkpoint's PrevTimeLineID: 1 
  12. Latest checkpoint's full_page_writes: on 
  13. Latest checkpoint's NextXID: 0:572 #下一个事务id 
  14. Latest checkpoint's NextOID: 16388 #下一个OID 
  15. ..... 

controlfile记录了数据库运行的一些信息,比如数据库id,是否open,wal的位置,checkpoint的位置,等等。controlfile是很重要的文件,数据库部署和调整。

四、数据文件

1. page

pg中,每个索引和表都是一个单独的文件,pg中叫做page。默认是每个大于1G的page会被分割pg_class.relfilenode.1这样的文件。

Page默认大小为8KB,最大32KB,一个数据块中可存放多行的数据。块中的结构如下图:

面试官:谈谈你对PG体系结构的理解?

块头记录了如下信息:

  • 块的checksum值
  • 空闲空间的起始位置和结束位置
  • 特殊数据的起始位置
  • 其他一些信息
  • 行指针是一个32bit的数字,具体结构如下:
  • 行内容的偏移量,占15bit;
  • 指针的标记,占2bit;
  • 行内容的长度,占15bit。

行指针中表示行内容的偏移量是15bit,能表示的最大偏移量是2^15=32768,因此块的最大大小是32768,即32KB。

2. page物理位置

page的物理位置在$PGDATA/BASE/DATABASE_OID/PG_CLASS.RELFILENODE

需要注意的是,pg_class.relfilenode类似dba_objects.data_object_id,truncate表之后relfilenode会变。对应的物理文件名字也会变。

五、WAL日志

1. wal位置

wal在$PGDATA/pg_wal下。10之前为pg_xlog

2. wal命名格式

文件名称为16进制的24个字符组成,每8个字符一组,每组的意义如下

面试官:谈谈你对PG体系结构的理解?

3. 手动切换WAL日志的命令

在PG10之前:

  1. highgo=# select pg_switch_xlog(); 
  2.  pg_switch_xlog  
  3. ---------------- 
  4.  0/B000C48 
  5. (1 row) 

在PG10之后:

  1. highgo=# select pg_switch_wal(); 
  2.  pg_switch_wal  
  3. ---------------- 
  4.  0/B000C48 
  5. (1 row) 

六、后台进程

pg后台进程说明如下:

面试官:谈谈你对PG体系结构的理解?

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2022-03-21 09:05:18

volatileCPUJava

2021-08-09 07:47:40

Git面试版本

2021-11-25 10:18:42

RESTfulJava互联网

2021-11-05 10:07:13

Redis哈希表存储

2020-12-01 08:47:36

Java异常开发

2020-06-12 15:50:56

options前端服务器

2020-06-19 15:32:56

HashMap面试代码

2021-09-16 07:52:18

算法应用场景

2021-05-31 11:43:19

B-树MySQL索引

2021-06-02 10:23:06

索引B+树数据

2019-05-10 10:50:04

Spring AOPJDK动态代理CGLIB动态代理

2021-11-10 07:47:49

组合模式场景

2021-11-02 22:04:58

模式

2022-02-21 17:24:18

序列化对象存储

2021-08-16 08:33:26

git

2021-11-03 14:10:28

工厂模式场景

2020-12-04 06:27:04

序列化面试官Java

2021-11-05 07:47:56

代理模式对象

2021-11-09 08:51:13

模式命令面试

2020-02-28 15:42:26

AOPJDKCGLib
点赞
收藏

51CTO技术栈公众号