angular8 获取文件流_基于PG12.2实现主从异步流复制及主从切换教程(上)

概述

今天主要分享一下PG主从异步流复制搭建相关的一些理论内容,仅供参考。


一、PostgreSQL通过WAL日志构建高可靠性原理

PostgrepSQL在数据目录的子目录pg_xlog子目录中维护了一个WAL日志文件,可以把WAL日志备份到另外一台备份服务器,通过重做WAL日志的方式在备服务器上恢复数据(类似Oracle的redo日志)。

WAL日志复制到另外一台备份服务器可以有两种方式:

1、 WAL日志文件复制

此种方式是写完一个WAL日志后,才把WAL日志文件拷贝到备份数据库中。这样通常备份会落后主库一个WAL日志文件,当主数据库发生故障时,主数据库的WAL文件并没有填充完毕未传输(默认16MB)、或者时延等原因导致WAL文件没有传输完毕,会导致被数据库可能存在一定的数据丢失。此种方式是postgreSQL9.0前版本主要提供的WAL日志复制机制。

采用此方式的WAL复制,需要:

  • 主数据库的wal_level配置为archive或以上。
  • PostgreSQL 9.1之后提供了一个很方便的工具pg_basebackup,使用完成一次基础备份到备数据库。
  • 后续产生WAL文件,可以通过archive_command参数调度命令传输至备机。

2、流复制(Streaming Replication)

2.1、概念

流复制是PostgreSQL 9.0之后才提供的新的传递WAL日志的方法。通过流复制,备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record。它的好处是只要主库一产生日志,就会马上传递到备库,同WAL日志文件相比有更低同步延迟。

同时PostgreSQL9.0之后提供了Hot Standby能力,备库在应用WAL record的同时也能够提供只读服务。

PostgreSQL物理流复制按照同步方式分为两类:

1)异步流复制

2)同步流复制

2.2、主备总体架构

PostgreSQL的流复制最多支持1主8备、支持级联复制(主->备1,备1->备2)。

PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组成。

a99707c928b897480cea3706fe25794f.png

walsender进程是用来发送WAL日志记录的,执行顺序如下:

 PostgresMain()->exec_replication_command()->StartReplication()->WalSndLoop()->XLogSendPhysical()

walreceiver进程是用来接收WAL日志记录的,执行顺序如下:

 sigusr1_handler()->StartWalReceiver()->AuxiliaryProcessMain()->WalReceiverMain()->walrcv_receive()

startup进程是用来apply日志的,执行顺序如下:

 PostmasterMain()->StartupDataBase()->AuxiliaryProcessMain()->StartupProcessMain()->StartupXLOG()

2.3、walsender和walreceiver进程流复制过程

walsender和walreceiver交互主要分为以下几个步骤:

1)walreceiver启动后通过recovery.conf文件中的primary_conninfo参数信息连向主库,主库通过连接参数replication=true启动walsender进程。

2)walreceiver执行identify_system命令,获取主库systemid/timeline/xlogpos等信息,执行TIMELINE_HISTORY命令拉取history文件。

3)执行wal_startstreaming开始启动流复制,通过walrcv_receive获取WAL日志,期间也会回应主库发过来的心跳信息(接收位点、flush位点、apply位点),向主库发送feedback信息(最老的事务id),避免vacuum删掉备库正在使用的记录。

4)执行walrcv_endstreaming结束流复制,等待startup进程更新receiveStart和receiveStartTLI,一旦更新,重新进入2/3/4步骤。

9088ae3d8f7a445a537559537afc81f7.png

2.4、PG流复制方式

WAL流复制支持同步、异步方式:

  • 异步流复制模式中,主库提交的事务不会等待备库接收WAL日志流并返回确认信息,因此异步流复制模式下主库与备库的数据版本上会存在一定的处理延迟,延迟的时间主要受主库压力、备库主机性能、网络带宽等影响,当正常情况下,主备的延迟通常在毫秒级的范围内,当主库宕机,这个延迟就主要受到故障发现与切换时间的影响而拉长,不过虽然如此,这些数据延迟的问题,可以从架构或相关自动化运维手段不断优化设置。
  • 同步流复制模式中,要求主库把WAL日志写入磁盘,同时等待WAL日志记录复制到备库、并且WAL日志记录在任何一个备库写入磁盘后,才能向应用返回Commit结果。一旦所有备库故障,在主库的应用操作则会被挂起,所以此方式建议起码是1主2备。

二、进程通信详细过程

1、walsender和walreceiver的流复制过程

888c359146b430eb8acfbf801db4fe7a.png

2、walreceiver和startup进程

e1bd4c3601516d41294c42410c60cd87.png

篇幅有限,这篇主要介绍理论方面的内容,后面再分享一下部署方面的内容,有兴趣的朋友可以关注下!

bc3b0c2b35f13b5ffc52225999fe2600.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值