postgresql 流复制原理

news2025/1/12 18:44:10

这部分纯理论内容,结合配图和数据进程了解流复制的工作逻辑。

通过WAL完成复制的方式

PostgreSQL在数据目录下的pg_wal(旧版为pg_xlog)子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。

把WAL日志传送到另一台服务器有两种方式,分别是:

  1. WAL日志归档(base-file)
    写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,简言之就是通过cp命令实现远程备份,这样通常备库会落后主库一个WAL日志文件。
  2. 流复制(streaming replication)
    流复制是postgresql9.x之后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会马上传递到standby库,同第一种相比有更低的同步延迟,所以我们肯定也会选择流复制的方式。

在这里插入图片描述

postgresql wal 日志介绍

wal日志即write ahead log预写式日志,简称wal日志。wal日志可以说是PostgreSQL中十分重要的部分,相当于oracle中的redo日志。

当数据库中数据发生变更时:
change发生时:先要将变更后内容计入wal buffer中,再将变更后的数据写入data buffer;
commit发生时:wal buffer中数据刷新到磁盘;
checkpoint发生时:将所有data buffer刷新的磁盘。

如果没有wal日志,那么每次更新都会将数据刷到磁盘上,并且这个动作是随机i/o,性能可想而知。并且没有wal日志,关系型数据库中事务的ACID如何保证呢?因此wal日志重要性可想而知。其中心思想就是:先写入日志文件,再写入数据。

最简的主从配置完成后,可以观察主库和从库启动的进程。

[pg@localhost ~]$ ps -auxf|grep postgres|grep -v grep
pg       31569  0.0  0.4 396536 17048 pts/0    S    10:17   0:00 /usr/pgsql-10/bin/postgres -D /data/db2
pg       31570  0.0  0.0 251456  1952 ?        Ss   10:17   0:00  \_ postgres: logger process
pg       31571  0.0  0.0 396632  3416 ?        Ss   10:17   0:00  \_ postgres: startup process   recovering 000000010000000000000001
pg       31572  0.0  0.0 396536  3704 ?        Ss   10:17   0:00  \_ postgres: checkpointer process
pg       31573  0.0  0.0 396536  3212 ?        Ss   10:17   0:00  \_ postgres: writer process
pg       31574  0.0  0.0 251452  1988 ?        Ss   10:17   0:00  \_ postgres: stats collector process
pg        4314  0.0  0.1 403804  4236 ?        Ss   11:41   0:00  \_ postgres: wal receiver process   streaming 0/16BEDA0
pg        4304  0.0  0.4 396536 17040 pts/0    S    11:41   0:00 /usr/pgsql-10/bin/postgres -D /data/db1
pg        4305  0.0  0.0 251456  1956 ?        Ss   11:41   0:00  \_ postgres: logger process
pg        4307  0.0  0.0 396688  3688 ?        Ss   11:41   0:00  \_ postgres: checkpointer process
pg        4308  0.0  0.0 396536  3448 ?        Ss   11:41   0:00  \_ postgres: writer process
pg        4309  0.0  0.1 396536  6348 ?        Ss   11:41   0:00  \_ postgres: wal writer process
pg        4310  0.0  0.0 396944  3080 ?        Ss   11:41   0:00  \_ postgres: autovacuum launcher process
pg        4311  0.0  0.0 251588  2180 ?        Ss   11:41   0:00  \_ postgres: stats collector process
pg        4312  0.0  0.0 396828  2520 ?        Ss   11:41   0:00  \_ postgres: bgworker: logical replication launcher
pg        4315  0.0  0.0 397328  3568 ?        Ss   11:41   0:00  \_ postgres: wal sender process pg ::1(43162) streaming 0/16BEDA0

postgresql主从同步流程

在这里插入图片描述

主要分为以下几个流程:

  1. 备库启动walreceiver进程,walreceiver进程向主库发送连接请求。
  2. 主库收到连接请求后启动walsender进程,并与walreceiver进程建立tcp连接。
  3. 备库walreceiver进程发送最新的wal lsn给主库。
  4. 主库进行lsn对比,定期向备库发送心跳信息来确认备库可用性,并且将没有传递的wal日志进行发送,同时调用SyncRepWaitForLSN()函数来获取锁存器,并且等待备库响应,锁存器的释放时机和主备同步模式的选择有关。
  5. 备库调用操作系统write()函数将wal写入缓存,然后调用操作系统fsync()函数将wal刷新到磁盘,然后进行wal回放。同时备库向主库返回ack信息,ack信息中包含write_lsn、flush_lsn、replay_lsn,这些信息会发送给主库,用以告知主库当前wal日志在备库的应用位置及状态,相关位置信息可以通过pg_stat_replication视图查看。
  6. 如果启用了hot_standby_feedback参数,备库会定期向主库发送xmin信息,用以保证主库不会vacuum掉备库需要的元组信息

postgresql同步模式

在这里插入图片描述
Postgresql数据库提供了五种同步模式,同步模式主要由synchronous_commit参数控制。下面简单介绍一下五种同步模式的区别:

  • off:对于本机wal不用写到磁盘就可以提交,是异步模式,存在数据丢失风险。
  • local:不管有没有备库只需要保证本机的wal日志刷到磁盘就行。
  • remote_write:等待主库日志刷新到磁盘,同时日志传递到备库的操作系统缓存中,不需要刷盘就 能提交,不能避免操作系统崩溃。
  • on:如果没有备库,表示wal日志需要刷新到本地的磁盘中才能提交,如果存在同步备库时(synchronous_standby_name不为空),需要等待远程备库也刷新到磁盘主库才能提交。
  • remote_apply:pg高版本才出来的功能,备库刷盘并且回放成功,事务被标记为可见,用于做负载均衡,读写分离等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1373043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

审批流、工作流、业务流、BPM 几个概念澄清

背景 每次听各类供应商售前专家在做产品宣讲时,经常看到牛人在讲坛上吐沫横飞,大讲各种流,信息流、业务流、物流、商流、资金流、单据流等,终于在《透明数字化供应链》一书中,看到对各类流的解释,现整理如…

Word2007导出PDF的正确做法

客户让做个一程序,从Excel读出数据,经过统计、计算生成PDF文档。我的做法是中间安装模板生成Word文档,然后在导出为PDF。 程序完成后需要测试,客户的环境是Win10Office2007。我用虚拟机搭建了环境,发现Word2007竟然无…

智能商品管理系统相比传统商品管理在自动化程度上有哪些优势?

智能商品管理系统相比传统商品管理模式,在自动化程度上具有以下具体优势: 1、数据自动采集:智能商品管理系统通过传感器、物联网等技术,可以自动采集商品的销售数据、库存情况、市场趋势等信息,无需人工干预。这样可以…

【LangChain学习之旅】—(5) 提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案

【LangChain学习之旅】—(5) 提示工程(上):用少样本FewShotTemplate和ExampleSelector创建应景文案 提示的结构LangChain 提示模板的类型使用 PromptTemplate使用 ChatPromptTemplateFewShot 的思想起源使用 FewShotPr…

OpenHarmony硬件合成方案解析

本文档主要讲解在OpenHarmony中,硬件合成适配的方法及原理说明。 环境说明: OHOS版本:3.1-Release及以上 一、背景介绍 1.1 什么是合成 ​ 要理解什么是合成,合成做了什么?我们先通过分解设置界面来回答这个问题:…

element input组件自动失去焦点问题解决

最近在 Vue3 ElementPlus 中,使用 el-input 组件时,如果设置了 v-model,那么在每次改变内容后后,input 会自动失去焦点,这样会导致用户无法输入多个字符。 一、问题原因 如上图所示,配置项的 Name 和 Cod…

世邦通信SPON IP网络对讲广播系统rj_get_token.php 任意文件读取漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统rj_get_token.php存在任意文件读取漏洞,攻击者可通过该漏洞在服务器端读取任意敏…

在虚拟机中安装OpenEuler操作系统

目录 OpenEuler操作系统安装步骤(详细) 一、首先要做好安装前的准备工作: 二、进行虚拟机的创建: 三、OpenEuler 23.09操作系统的安装部署: OpenEuler操作系统安装步骤(详细) 一、首先要做好…

ppt怎么录屏录音并且导出?好用录屏软件推荐

ppt已经成为了日常工作与学习中必不可少的工具,而ppt屏幕录制功能,可以方便用户将他人的演讲或视频中的内容记录下来,以便进一步学习与研究。录制ppt演示并将其导出为视频文件,可以帮助我们进行分享,但是很多人不知道p…

uniapp多组数组 搜索高亮效果demo(整理)

<template><view class"mT100"><input type"text" v-model"keyword" input"filterList" placeholder"请输入关键词"><ul><li v-for"item in filteredList" :key"item.id"&g…

web缓存之nginx缓存

一、nginx缓存知识 网络缓存位于客户端和 "源服务器 "之间&#xff0c;保存着所有可见内容的副本。当客户端请求缓存中存储的内容时&#xff0c;它可以直接从缓存中检索内容&#xff0c;而无需与服务器通信。这样&#xff0c;网络缓存就 "接近 "了客户端&a…

干洗店小程序:洗衣、洗鞋、工厂系统、上门取送、拍照预约、下单门店管理,一站式解决方案。

干洗店小程序&#xff1a;洗衣、洗鞋、工厂系统、上门取送、拍照预约、下单门店管理&#xff0c;一站式解决方案。 一、核心功能亮点 1. 多种下单模式&#xff1a;支持上门取送、送货到店、寄存网点、智能衣柜&#xff0c;满足您不同需求。 2. 骑手接单&#xff1a;专业骑手快…

简单却强大:MySQL ZEROFILL让编号管理变得更轻松

点击上方蓝字关注我 在MySQL中&#xff0c;ZEROFILL是一种用于在数字字段上进行填充零的属性。该属性通常用于确保数字达到指定长度时&#xff0c;左侧用零进行填充。这在某些特定场景下非常有用&#xff0c;例如确保订单号或者其他标识符具有固定的长度。 1. 案例演示 1.1 语…

Python爬取哈尔滨旅游爆火视频数据并进行可视化分析

前言 哈尔滨作为中国北方的重要城市&#xff0c;独特的冰雪风情和丰富的文化底蕴而受到游客的青睐。随着抖音等短视频平台的兴起&#xff0c;越来越多关于哈尔滨旅游的视频在网络上出现文章旨在利用Python编程语言&#xff0c;从音视频网站上抓取哈尔滨旅游抖音相关视频数据&a…

K2P路由器刷OpenWrt官方最新版本固件OpenWrt 23.05.2方法 其他型号的智能路由器OpenWrt固件刷入方法也基本上适用

最近路由器在开机时总出问题,于是就那他来开刀,直接刷一个OpenWrt官方最新版本的固件, 刷其他第三方的固件总是觉得不安全, 而且很多第三方固件都带了些小工具,始终会有安全隐患, 而且占用内存空间太多,本来这个东西就没有多少内存,于是就干脆刷一个官方的原始固件(才6.3M, 相…

Qt5插件开发入门+示例

目的 1、为什么用插件 现在大家最讲模块化开发了,怎么算模块化,分成不同的类,分成不同的文件夹,高内聚,低耦合,这个当然算是。 从高层次讲,它们是在一起的,只是逻辑上的模块化,不是物理上的模块化,或者说不是彻底的模块化,彻底的模块化应该像一个辆自行车一样,车…

Sentinel限流熔断

官网&#xff1a;https://sentinelguard.io/zh-cn/docs/introduction.html github文档&#xff1a;https://github.com/alibaba/Sentinel/wiki Sentinel 是一款面向分布式服务架构的轻量级流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、 熔断降级 、系…

使用Vivado Design Suite平台板、将IP目录与平台板流一起使用

使用Vivado Design Suite平台板流 Vivado设计套件允许您使用AMD目标设计平台板&#xff08;TDP&#xff09;创建项目&#xff0c;或者已经添加到板库的用户指定板。当您选择特定板&#xff0c;Vivado设计工具显示有关板的信息&#xff0c;并启用其他设计器作为IP定制的一部分以…

Python爬虫---Scrapy项目的创建及运行

Scrapy是一个为了爬取网站数据&#xff0c;提取结构性数据而编写的应用框架。 可以应用在包括数据挖 掘&#xff0c;信息处理或存储历史数据等一系列的程序中。 1. 安装scrapy&#xff1a; pip install scrapy 注意&#xff1a;需要安装在python解释器相同的位置,例如&#xf…

RabbitMQ入门到实战——基础篇

初识RabbitMQ&#xff1a;高性能异步通讯组件 同步调用 异步调用 场景&#xff1a;1.对结果不关心时异步。订单状态-异步&#xff0c;查询-同步 2.影响性能。调用链超长&#xff0c;可改成异步 MQ技术对比 kafka日志收集 RabbitMQ整体架构 快速入门 交换机只负责路由消息&am…