暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

【从Oracle到PG】PostgreSQL数据库体系结构概述

有朋友问文章标题为什么都用“从Oracle到PG”,初衷并非是要将Oracle迁移到PostgreSQL,也许是出于Oracle DBA的习惯,总是有意无意地在写作过程中带点O的思想。

但愿通过两者的横向对比,在PostgreSQL的学习上可以找到一个相对容易理解的切入点,期盼可以对PostgreSQL或Oracle有更深刻的理解。

同样,本篇文章在介绍PostgreSQL体系结构之前,还是想先来回顾一下Oracle的体系结构。

下面这个图来自Oracle 19C 官网:

oracle-19C instance and database


Oracle 19C多租户的体系结构图看起来比较复杂,下面这个简单一点的是11g-R2版本比较经典的体系结构图:

Oracle 体系结构

简单介绍一下,Oracle服务由实例+存储两大模块构成,其中实例由内存结构和一组后台进程组成:


对照Oracle的体系结构,PostgreSQL的体系结构可以分为三大部分:

1.进程结构:一堆后台进程。
2.内存结构:共享内存和私有内存区。
3.存储结构:数据文件、Wal日志、配置文件等物理的实体文件。


参考Oracle的结构图,我这里将PostgreSQL体系结构画个图对比:

PostgreSQL-11.5 体系结构图-Aken

一、进程结构

PostgreSQL所有进程都由postmaster主进程fork而来。

PostgreSQL 进程结构

postmaster进程是pg启动时产生的第一个进程,之后由该主进程fork出以下的后台进程:

    [postgres@akendb01]$ps -ef | grep postgres
    postgres 9187 1 0 17:05 ? 00:00:00 aken/dbapp/pgsql/1105/bin/postmaster -D aken/data/pgsql/1105/data
    postgres 9264 9187 0 17:05 ? 00:00:00 postgres: logger --后台日志写进程
    postgres 9295 9187 0 17:05 ? 00:00:00 postgres: checkpointer --检查点进程,对应oracle的ckpt进程。
    postgres 9297 9187 0 17:05 ? 00:00:00 postgres: background writer --后台写进程,对应Oracle的dbwr进程。
    postgres 9298 9187 0 17:05 ? 00:00:00 postgres: walwriter --wal日志写进程,对应Oracle的lgwr进程。
    postgres 9299 9187 0 17:05 ? 00:00:00 postgres: autovacuum launcher --autovacuum的检测进程,必要时会通知postmaster进程fork产生autovacuum进程。
    postgres 9300 9187 0 17:05 ? 00:00:00 postgres: archiver --wal日志归档进程
    postgres 9301 9187 0 17:05 ? 00:00:00 postgres: stats collector --统计信息收集进程
    postgres 9302 9187 0 17:05 ? 00:00:00 postgres: logical replication launcher --复制同步相关

    当客户端连接DB的时候,首先通过和postmaster通信请求建立连接,postmaster主进程检查客户端进程符合连接条件后fork产生对应的“服务进程”backend process和客户端进程建立session。这里的机制和Oracle的监听进程产生server process比较相似。


    二、内存结构

    Oracle中划分为PGA和SGA,PostgreSQL也可以划分为私有内存区和共享内存区两大区域。


    其中:

    私有内存区:temp_buffers、work_mem和maintenance_work_mem,属backend process进程私有。

    共享内存区:主要包括:shared_buffers、wal_buffers、commit logs、后台进程也会在共享内存区占用一部分内存。

    注意:这里的shared_buffers和Oracle的shared_buffers不一样,目前版本的PostgreSQL不像Oracle的shared_buffer一样用来缓存SQL执行计划,而是像Oracle的buffer cache 一样,用来缓存数据页。


    三、存储结构

    PostgreSQL的存储结构主要包括各个database的数据文件、wal日志的日志文件、wal的归档文件、提交日志clog files、配置文件(postgresql.conf、postgresql.auto.conf、pg_hba.conf、recovery.conf)。


    具体的逻辑和物理结构在接下来的文章做总结整理。

    以上是对postgresql体系结构的概括,主要包括三大块:进程结构、内存结构、存储结构。有兴趣的同学可进一步深入研究。


    系列回顾

    【从Oracle到PG】PostgreSQL-11.5源码编译安装

    【从Oracle到PG】PostgreSQL访问认证问题处理

    【从Oracle到PG】PostgreSQL参数配置和查看详解


    欢迎投稿



            中国开源软件推进联盟PostgreSQL分会,欢迎大家积极投稿,向PGer分享自己的实践经验、心得体会,共建PG中国生态。

    投稿邮箱:

    partner@postgresqlchina.com

    最后修改时间:2019-12-16 10:55:53
    文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论