一、PostgreSQL物理架构

postgresql的物理架构非常简单,它由共享内存、一系列后台进程和数据文件组成。

二、Shared Memory

共享内存是服务器服务器为数据库缓存和事务日志缓存预留的内存缓存空间。其中最重要的组成部分是Shared Buffer和WAL Buffer。

  • Shared Buffer:是数据页缓冲区。Shared Buffer的目的是减少磁盘IO,大部分oltp工作负载都是随机IO,因此从磁盘获取非常慢。为了解决这个问题,postgre将数据缓存在RAM中,来提高性能。对于shared_buffers,没有一个特定的推荐值。但是一般来说,对于专用DB服务器,shared_buffers的值应该大约是系统总RAM的25%。
  • WAL Buffer:是预写日志(wal)缓冲区。在备份和恢复的场景下,WAL Buffer和WAL文件是极其重要的。如果要调优的系统有大量并发连接,那么wal_buffers的值越高,性能越好。

三、PostgreSQL 进程类型

PostgreSQL有四种进程类型

  1. Postmaster (Daemon) Process(主后台驻留进程)
  2. Background Process(后台进程)
  3. Backend Process(后端进程)
  4. Client Process(客户端进程)
  • Postmaster Process:PostgreSQL启动时第一个启动的进程。启动时,他会执行恢复、初始化共享内存的运行后台进程操作。运行期间,当有客户端发起链接请求时,它还负责创建后端进程。

如果通过pstree命令查看进程之间的关系,你会发现Postmaster进程是其他所有进程的父进程。

  • Background Process
进程 作用
logger 将错误信息写到log日志中
checkpointer 当检查点出现时,将脏内存块写到数据文件
writer 周期性的将脏内存块写入文件
wal writer 将WAL缓存写入WAL文件
Autovacuum launcher 当自动vacuum被启用时,用来派生autovacuum工作进程。autovacuum进程的作用是在需要时自动对膨胀表执行vacuum操作。
archiver 在归档模式下时,复制WAL文件到特定的路径下。
stats collector 用来收集数据库统计信息,例如会话执行信息统计(使用pg_stat_activity视图)和表使用信息统计(pg_stat_all_tables视图)
  • Backend Process

  最大后台链接数通过max_connections参数设定,默认值为100。后端进程用于处理前端用户请求并返回结果。查询运行时需要一些内存结构,就是所谓的本地内存(local memory)。本地内存涉及的主要参数有:

  1. work_mem:用于排序、位图索引、哈希链接和合并链接操作。默认值为4MB。
  2. maintenance_work_mem:用于vacuum和创建索引操作。默认值为64MB。
  3. temp_buffers:用于临时表。默认值为8MB。
  • Client Process

  客户端进程需要和后端进程配合使用,处理每一个客户链接。通常情况下,Postmaster进程会派生一个子进程用来处理用户连接。

四、数据库结构

数据库相关概念:

  1. PostgreSQL由一系列数据库组成。一套PostgreSQL程序称之为一个数据库群集。
  2. 当initdb()命令执行后,template0 , template1 , 和postgres数据库被创建。
  3. template0和template1数据库是创建用户数据库时使用的模版数据库,他们包含系统元数据表。
  4. initdb()刚完成后,template0和template1数据库中的表是一样的。但是template1数据库可以根据用户需要创建对象。
  5. 用户数据库是通过克隆template1数据库来创建的;

表空间相关概念:

  1. initdb()后马上创建pg_default和pg_global表空间。
  2. 建表时如果没有指定特定的表空间,表默认被存在pg_default表空间中。
  3. 用于管理整个数据库集群的表默认被存储在pg_global表空间中。
  4. pg_default表空间的物理位置为$PGDATA\base目录。
  5. pg_global表空间的物理位置为$PGDATA\global目录。
  6. 一个表空间可以被多个数据库同时使用。此时,每一个数据库都会在表空间路径下创建为一个新的子路径。
  7. 创建一个用户表空间会在$PGDATA\pg_tblspc目录下面创建一个软连接,连接到表空间制定的目录位置。

表相关概念:

  1. 每个表有三个数据文件。
  2. 一个文件用于存储数据,文件名是表的OID。
  3. 一个文件用于管理表的空闲空间,文件名是OID_fsm。
  4. 一个文件用于管理表的块是否可见,文件名是OID_vm。
  5. 索引没有_vm文件,只有OID和OID_fsm两个文件

Postgresql架构体系解析的更多相关文章

  1. 「译」JUnit 5 系列:架构体系

    原文地址:http://blog.codefx.org/design/architecture/junit-5-architecture/ 原文日期:29, Mar, 2016 译文首发:Linesh ...

  2. 分布式系统的那些事儿(六) - SOA架构体系

    有十来天没发文了,实在抱歉!最近忙着录视频,同时也做了个开源的后台管理系统LeeCX,目前比较简单,但是后续会把各类技术完善.具体可以点击“原文链接”. 那么今天继续说分布式系统的那些事. 我们现在动 ...

  3. Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案

    Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案 1. 运行平台:跨平台 android ios pc mobile 1.1. -------------前端 界面------ ...

  4. Netty-Channel架构体系源码解读

    全文围绕下图,Netty-Channel的简化版架构体系图展开,从顶层Channel接口开始入手,往下递进,闲言少叙,直接开撸 概述: 从图中可以看到,从顶级接口Channel开始,在接口中定义了一套 ...

  5. 阿里巴巴飞天大数据架构体系与Hadoop生态系统

    很多人问阿里的飞天大数据平台.云梯2.MaxCompute.实时计算到底是什么,和自建Hadoop平台有什么区别. 先说Hadoop 什么是Hadoop? Hadoop是一个开源.高可靠.可扩展的分布 ...

  6. 基于golang分布式爬虫系统的架构体系v1.0

    基于golang分布式爬虫系统的架构体系v1.0 一.什么是分布式系统 分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统.简单来说就是一群独立计算机 ...

  7. WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇]

    原文:WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[元数据描述篇] 在[WS标准篇]中我花了很大的篇幅介绍了WS-MEX以及与它相关的WS规范:WS-Policy.WS-Tra ...

  8. 基于EF+WCF的通用三层架构及解析

    分享基于EF+WCF的通用三层架构及解析 本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务 ...

  9. 手机CPU架构体系分类及各大厂商

    手机cpu相关知识,这对于开发Android应用程序适应各个机型有一定的辅助作用 . 手机cpu架构体系分类 指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分,代表架构分别是x86.A ...

  10. HBase伪分布式安装(HDFS)+ZooKeeper安装+HBase数据操作+HBase架构体系

    HBase1.2.2伪分布式安装(HDFS)+ZooKeeper-3.4.8安装配置+HBase表和数据操作+HBase的架构体系+单例安装,记录了在Ubuntu下对HBase1.2.2的实践操作,H ...

随机推荐

  1. 【每日一题】【字符串与数字互转】【去除空格】【大数处理】2021年12月12日-8. 字符串转换整数 (atoi)

    请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数). 函数 myAtoi(string s) 的算法如下: ...

  2. Django连接数据库(mysql)与Django ORM实操(增删改查) 前端页面

    目录 一:pycharm链接数据库(MySQL) 1.pycharm右侧Database工具栏 2.下载对应的驱动,填写MySQL数据库信息连接(当前为客户端) 3.pycharm连接MySQL数据库 ...

  3. 服务器迁移遇到的bug

    目前有个客户做了个下单系统,系统运行了太多的扩展了,但是又没有文档,我就想着能不能把服务器打包成镜像,然后用新服务直接使用?? 事实是完全OK的.服务器用的阿里云. 但是遇到一个bug,我目前还没解决 ...

  4. 三步快速搭建Typora图床(SM.MS+PicGo)

    三步快速搭建Typora图床(基于SM.MS+PicGo) 前言 在有些同学使用Typora的过程中,会发现Typora不像Word一样,在文档脱离本机后依然正常显示图片,自己的tyopora文件在发 ...

  5. 对象和类—Java世界的细胞

    对象和类-Java世界的细胞 今天向大家介绍我自己关于Java中对象和类的一些体会,中有不足还请大家多多指教 1.面向对象程序设计 为什么会产生面向对象 我认为人们在最初探索计算机世界时,常常会从计算 ...

  6. 一个简单的rust字符串时钟

    1.简介   用rust写的一个简单的练手的demo,一个字符串时钟,在终端用字符串方式显示当前时间.本质是对图片取灰度,然后每个像素按灰度门限用星号代替灰度值,就把图片变为由星号组成的字符型图案.把 ...

  7. [OpenCV实战]23 使用OpenCV获取高动态范围成像HDR

    目录 1 背景 1.1 什么是高动态范围(HDR)成像? 1.2 高动态范围(HDR)成像如何工作? 2 代码 2.1 运行环境配置 2.2 读取图像和曝光时间 2.3 图像对齐 2.4 恢复相机响应 ...

  8. 20 张图带你全面了解 HTTPS 协议,再也不怕面试问到了!

    本文详细介绍了 HTTPS 相较于 HTTP 更安全的原因,包括对称加密.非对称加密.完整性摘要.数字证书以及 SSL/TLS 握手等内容,图文并茂.理论与实战结合.建议收藏! 1. 不安全的 HTT ...

  9. [Leetcode]完全平方数

    题目 代码 class Solution { public: int numSquares(int n) { vector<int> dp(n + 1, INT_MAX); dp[0] = ...

  10. visualstudio2017 community版本,有点失去信心了,同样两行代码,外观看不出任何区别,但是一个报错

    不多废话,先上代码 注意查看函数fputs_FILE,该函数的两行代码fopen_s是同样的,但事实上: 第一条fopen_s执行起来会报错,但是第二条就不会!!! /* 练习:获取用户键盘输入,写入 ...