PG内核解读-第1节PostgreSQL系统概述

PG内核解读-第1节PostgreSQL系统概述

一、本系列教程介绍

image.png

本课程主要面向PostgreSQL DBA、高校学生、内核开发爱好者。解决PostgreSQL DBA遇到的问题,希望用户可以通过查看代码深入了解PG原理。

让没有接触过数据库内核的同学,了解内核基本原理、代码实现,可以完成简单功能开发,大家一起共同学习、共同成长。

本系列的章节设置,参照彭智勇老师的《PostgreSQL数据库内核分析》,内容互补。每章节先介绍架构、原理、使用,再介绍代码。

二、PostgreSQL概述(历史、架构)

image.png

PostgreSQL是一个功能强大的开源对象关系型数据库系统,使用和扩展了SQL语言,并结合了许多安全存储和扩展最复杂数据工作负载的功能。

PostgreSQL的起源可以追溯到1986年,作为加州大学伯克利分校POSTGRES项目的一部分,并且在核心平台上进行了30多年的积极开发。

PostgreSQL凭借其经过验证的架构,可靠性,数据完整性,强大的功能集,可扩展性以及软件背后的开源社区的奉献精神赢得了良好的声誉,以始终如一地提供高性能和创新的解决方案。

image.png

从数据库开源角度来看,MySQL和PostgreSQL是最重要的两个产品。阿里数据库基于MySQL和PostgreSQL已有的开源产品主要有:单机数据库AliSQL;分库分表中间件TDDL;分布式数据库PolarDB for PG与PolarDB-X;Key-Value Cache的Tair。

image.png

如上图所示,是PostgreSQL的架构。其中,Postmaster是PostgreSQL启动的第一个进程。Postmaster会执行恢复、初始化、内存共享等进程。当客户端发起链接请求时,它还负责创建后端进程。

backend processes通过TCP协议和客户端建立通讯,当客户端断开时,连接消失。允许多个客户端同时连接,连接数由max_connections参数控制,默认是100,如果客户端频繁的和服务端建立连接然后断开,会增加数据库的开销,导致服务器负载不正常,因为数据库本身不提供连接池的功能,如果有需要,可以使用pgbouncer或者pgpool-II。

在Shared Memory方面,主要作为数据块的缓冲区,以便提高读写性能。WAL日志缓冲区和Commit log缓冲区也存在于Shared Memory中。除此之外,Shared Memory保存了进程信息、锁信息、全局统计信息等。

Individual Memory用于存储一些不需要全局存储的数据,主要有Work_mem、Maintenance_work_mem和临时缓冲区。其中,临时缓冲区用于访问临时表的本地缓冲区。

image.png

上图是PostgreSQL的逻辑架构,在默认情况下,客户端通过端口“5432”连接到集群‘data’,默认数据库是‘postgres’,默认模式‘public’。它们也可以指定其他连接属性。

系统模式主要有pg_catalog、information_schema、pg_temp等等。

如果多个集群同时在一台服务器上,每个集群都单独管理。每个管理的实例会使用不同的端口。

image.png

传统的数据库集群,通过配置数据文件,将其存储在集群的数据目录中,通常被称为PGDATA。常见的位置PGDATA是/var/lib/pgsql/data。在同一台机器上,由不同服务器实例管理的多个集群。其中,base是每个数据库对于的子目录的子目录;global包含了集群范围的表的文件和全局控制信息等。

如上图所示,该PGDATA目录包含几个子目录和控制文件。除此之外,集群配置文件postgresql.conf、pg_hba.conf和pg_ident.conf一般存储在PGDATA。

image.png

如上图所示,是PostgreSQL模块和代码目录结构。当Main函数进来之后,启动Postmaster进程,通过Postmaster发送不同的Postgres进程。如果Postgres收到Libpq请求,最终会让执行引擎来执行相关命令。

在这一过程中,PostgreSQL依赖了底层原数据的提取方法。上图目录包括了相关的执行引擎,正则处理,全文检索等等,整个结构清晰可见。

image.png

PostgreSQL在执行initdb的时,会初始化一个目录,这个目录会生成相关的子目录和一些文件。其中,在data目录下,包含了数据库用户所创建的各个数据库,同时也包括postgres、template0和template1的pg_default tablespace。

当文件存储超出1G,PostgreSQL会将其拆分成多个文件来,而拆分的文件名将由pg_class中的relfilenode字段来决定。

PostgreSQL的日志文件主要包括运行日志文件,重做日志文件,事务日志文件,服务器日志文件。

PostgreSQL的控制文件主要记录了数据库相关的运行信息。比如id,open,wal,checkpoint的位置等等,其中controlfile是很重要的文件。

PostgreSQL的WAL文件通常默认保存在$PGDATA/pg_wal目录下。文件名称由16进制的24个字符组成,每8个字符一组。

三、PostgreSQL安装启动

image.png

接下来,开始PostgreSQL安装启动。相关步骤如上图所示,在网站下载相关源码之后,对源码进行编译安装,然后设置环境变量。

image.png

安装PostgreSQL之后,初始化PG并启动数据库,相关代码如上图所示。执行相关命令,初始化数据库之后,修改相关参数,通过执行启动和停止命令,确定数据库是否正常运行。

四、PostgreSQL常用命令、调试

image.png

接下来,介绍一些PostgreSQL的常用命令。首先,使用psql连接数据库。

连接数据库之后,输入数据库密码,创建一个表,插入信息并查询。

image.png

PostgreSQL的常用命令如上图所示,用户可以根据相关代码进行调试

image.png

本次演示使用的开发工具是Source Insight。Source Insight支持绝大多数语言,如C、C++、ASM、PAS、ASP、HTML等等。Source Insight不仅支持快速访问源代码和源信息,而且能显示reference trees,class inheritance diagrams和call trees。

image.png

接下来,开始演示上述地部分命令。用户可以在相关地址下载源码:

https://github.com/postgres/postgres.git

image.png

接下来,调用configure的相关文件。首先执行命令,获取Debug版。相关命令如下:

./configure–prefix=/home/michael.yw/pghome–enable-debug–enable-cassert CFLAGS="-ggdb-O0-g3-Wall-fno-omit-frame-pointer-fstack-protector-strong

然后,开始准备编译,相关命令如下:make-sj&&make instal。

image.png

接下来,调用命令,设置系统的环境变量。用户需要根据自己的位置对命令进行修改,相关命令如下:

vi~/.bashrc

export PATH=“/home/michael.yw/pghome/bin:$PATH”

export LD_LIBRARY_PATH=“/home/michael.yw/pghome/lib:$LD_LIBRARY_PATH”

export PGHOME=“/home/michael.yw/pghome”

export PGDATA=“/home/michael.yw/pgdata”

source~/.bashrc

image.png

完成上述操作之后,开始初始化数据库,相关代码如下:

initdb-D/home/michael.yw/pgdata

image.png

然后,开始配置相关参数,具体参数如下:

max_connections=100

max_wal_senders=10

max_replication_slots=10

max_worker_processes=10

shared_preload_libraries=‘pg_stat_statements’

listen_addresses=‘*’

port=6688

logging_collector=on

log_directory=‘log’

log_filename=‘postgresql-%a.log’

log_truncate_on_rotation=on

log_rotation_age=1d

log_rotation_size=0

log_checkpoints=on

log_connections=on

log_disconnections=on

log_error_verbosity=verbose

log_line_prefix=‘%m[%p]’

log_timezone=‘PRC’

log_autovacuum_min_duration=0

image.png

接下来,开始启动数据库。相关命令如下:

pg_ctl-D/home/michael.yw/pgdata-l/home/michael.yw/pgdata/logfile1 start

image.png

接下来,使用psql连接数据库。相关命令如下:

psql-p 6688-d postgres

image.png

然后,开始发起请求。创建一个表,相关命令如下:create table t1(a int,b text);

然后,插入一条数据。相关命令如下:insert into t1 values(1,‘aa’);

然后,查询一条数据,相关命令如下:select*from t1;

image.pngimage.png

接下来,查看psql的常用命令。相关位置如下:

cd/home/michael.yw/pghome/bin

ll/home/michael.yw/pghome/bin

pg_config工具是打印当前PostgreSQL的配置参数,方便与PostgreSQL交互的软件包,找到所需的头文件和库。

pg_ctl命令为PostgreSQL服务端应用程序,可以用来初始化,启动和停止及控制PostgreSQL服务器。

pg_dump用于备份PostgreSQL数据库。即使数据库正在被使用,它也能创建一致备份。pg_dump不阻塞其他用户读取或写入数据库。pg_dump只转储单个数据库。

如果用户需要备份一个对于所有数据库公共的全局对象,例如角色和表空间,应使用pg_dumpall。

在PG调试方面,select pg_backend_pid()意为查看当前连接pid。

image.png

接下来,开始调试PG。相关命令如下:ps-ef|grep michael

当psql链接到PostgreSQL数据库后,可以使用gdb跟踪PID进程。其中bt用来显示堆栈;f 8查看堆栈中不同层级函数;l查看周围代码;C+x a查看代码。

image.png

接下来,设置断点。相关命令如下:b exec_simple_query;

image.png

然后,显示断点。相关命令如下:info b。

image.png

完成上述操作之后,开始调试PG。相关命令如下:select*from t1。

image.png

如上图所示,是Source Insight的使用界面。

image.png

用户可以根据函数,通过刷新,找到引用该函数的ID,从而确定引用该函数的用户。方便用户清楚的看到各函数间的调用关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值