postgresql 流复制原理

这篇具有很好参考价值的文章主要介绍了postgresql 流复制原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

通过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 流复制原理,# 【TDSQL-PG笔记】主从复制原理,postgresql,数据库

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主从同步流程

postgresql 流复制原理,# 【TDSQL-PG笔记】主从复制原理,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 流复制原理,# 【TDSQL-PG笔记】主从复制原理,postgresql,数据库
Postgresql数据库提供了五种同步模式,同步模式主要由synchronous_commit参数控制。下面简单介绍一下五种同步模式的区别:文章来源地址https://www.toymoban.com/news/detail-811343.html

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

到了这里,关于postgresql 流复制原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【PostgreSQL】连接pg数据库Schema切换

    由于PostgreSQL数据库模式(schema)存在多个,原先的表单是默认采用public但是查询表和字段时候有查询所有未进行过滤,导致数据库连接失败、查表字段也为空(空即查询服务端异常错误) 数据库连接配置 添加参数补充 ?currentSchema=dwd 譬如: username=root;password=XXXX;url=jdbc:postg

    2024年02月11日
    浏览(53)
  • 使用pg_prewarm缓存PostgreSQL数据库表

    pg_prewarm 直接利用系统缓存的代码,对操作系统发出异步prefetch请求,在应用中,尤其在OLAP的情况下,对于大表的分析等等是非常耗费查询的时间的,而即使我们使用select table的方式,这张表也并不可能将所有的数据都装载到内存中,而pg_prewarm的功能就是完成一个张表全部进入

    2024年02月14日
    浏览(46)
  • PG-DBA培训04:PostgreSQL数据类型与数据库设计规范

    一、风哥PG-DBA培训04:PostgreSQL数据类型与数据库设计规范 本课程由风哥发布的基于PostgreSQL数据库的系列课程,本课程属于PostgreSQL数据库SQL开发与应用实战阶段之PostgreSQL数据类型与数据库设计规范,学完本课程可以掌握PostgreSQL SQL语句基础讲解,PostgreSQL SQL语言基础知识,安

    2024年02月11日
    浏览(59)
  • PostgreSQL逻辑备份pg_dump使用及其原理解析

    1、循环调用getopt_long解析命令行参数,将参数保存到static DumpOptions dopt;中 2、判断参数是否相容,不相容则退出: 3、调用CreateArchive打开输出文件,输出流为fout。该函数使用4个文件封装了4种不同dump文件格式,增加新文件可以增加新的导出文件类型各自封装,独立易于维护。

    2024年02月13日
    浏览(49)
  • MySQL数据库——主从复制

    在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似

    2024年02月11日
    浏览(99)
  • docker版postgresql数据库主从配置

    参考:postgresql16配置主从 注意项 :当前操作主路径: ~/dockerEnv 【示例路径】 创建 sql 文件,文件路径 dockerEnv/dbInit/a_create_user.sql 注意: 如果在同一个宿主机操作,注意多个 yml 文件的端口映射,不要冲突! 挂载宿主机 sql 文件夹到容器的 docker-entrypoint-initdb.d 路径下,容器启

    2024年04月14日
    浏览(66)
  • mysql 数据库主从复制搭建

    MySQL 主从复制主要用于实现高可用性和备份。在主从复制中,一个 MySQL 实例(称为主节点)将其数据更改复制到至少一个其他 MySQL 实例(称为从节点)上。主要借助于数据库二进制日志binlog进行数据的复制。 主从数据库对应的操作系统、数据库版本要一致。 1、主库配置 设

    2024年02月20日
    浏览(56)
  • mysql主从复制及原理

    主要基于MySQL二进制日志 主要包括三个线程(2个I/O线程,1个SQL线程) 1、MySQL将数据变化记录到二进制日志中; 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中; 3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库 在主服务器(master)上启用

    2024年02月14日
    浏览(31)
  • 图解-Redis主从复制原理

    大家好,我是「云舒编程」,今天我们来Redis主从复制原理。 文章首发于微信公众号: 云舒编程 关注公众号获取: 1、大厂项目分享 2、各种技术原理分享 3、部门内推 主从复制是指用户可以搭建多个服务器,其中几个服务器当做主服务器,提供写功能。其余的服务器当做从

    2024年01月25日
    浏览(39)
  • MySQL数据库 主从复制与读写分离

    读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。 但是数据库

    2024年02月10日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包