博客
关于我
PgSQL · 特性分析 · PG主备流复制机制
阅读量:794 次
发布时间:2023-02-27

本文共 2041 字,大约阅读时间需要 6 分钟。

PostgreSQL 9.0 引入了主备流复制机制,通过流复制,备库从主库同步数据并应用WAL记录。流复制每次传输单位是WAL日志的record,而9.0之前的方法是主库写完一个WAL日志文件后传送给备库,导致主备延迟较大。9.0之后还引入了Hot Standby,备库在应用WAL记录的同时提供只读服务,提升了用户体验。

PostgreSQL主备总体结构

PG主备流复制的核心部分由walsenderwalreceiverstartup三个进程组成。walsender负责发送WAL日志记录,执行顺序如下:

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

walreceiver负责接收WAL日志记录,执行顺序如下:

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

startup进程负责应用日志,执行顺序如下:

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

WALSender和WALReceiver流复制过程

walsenderwalreceiver交互主要分为以下几个步骤:

  • walreceiver启动后通过recovery.conf文件中的primary_conninfo参数连接主库,主库通过replication=true启动walsender进程。
  • walreceiver执行identify_system命令,获取主库的systemidtimelinexlogpos等信息,执行TIMELINE_HISTORY命令拉取历史文件。
  • 执行wal_startstreaming开始流复制,通过walrcv_receive获取WAL日志,期间回应主库发来的心跳信息(接收位点、flush位点、apply位点),向主库发送反馈信息(最老的事务ID),避免vacuum删掉备库正在使用的记录。
  • 执行walrcv_endstreaming结束流复制,等待startup进程更新receiveStartreceiveStartTLI,一旦更新,进入步骤2。
  • WALSender和WALReceiver核心流程

    walsenderwalreceiver的交互流程如下:

    • walreceiver启动后通过recovery.conf文件中的primary_conninfo参数连接主库,主库通过replication=true启动walsender进程。
    • walreceiver执行identify_system命令获取主库信息,执行TIMELINE_HISTORY拉取历史文件。
    • 执行wal_startstreaming开始流复制,通过walrcv_receive获取WAL日志,期间回应主库发来的心跳信息,向主库发送反馈信息。
    • 执行walrcv_endstreaming结束流复制,等待startup进程更新receiveStartreceiveStartTLI,一旦更新,进入步骤2。

    Hot Standby模式和日志应用

    startup进程进入Hot Standby模式和应用日志的主要过程如下:

  • 读取pg_control文件,找到redo位点;读取recovery.conf文件,如果配置standby_mode=on则进入standby模式。
  • 如果是Hot Standby,初始化clog、subtrans、事务环境等,初始化redo资源管理器,如Heap、Heap2、Database、XLOG等。
  • 读取WAL记录,如果record不存在,调用XLogPageRead->WaitForWALToBecomeAvailable->RequestXLogStreaming唤醒walreceiverwalsender获取WAL记录。
  • 对读取的WAL记录进行redo,通过record->xl_rmid信息调用相应的redo资源管理器进行操作,如XLOG_HEAP_INSERT
  • 检查一致性,如果一致,Hot Standby模式可以接受用户只读查询;更新共享内存中XLogCtlData的apply位点和时间线;如果恢复到时间点、时间线或事务ID需要检查是否恢复到当前目标。
  • 返回步骤3,读取下一个WAL记录。
  • 总结

    通过以上流程,PostgreSQL实现了高效的主备流复制机制,减少了主备延迟,并通过Hot Standby模式提供了只读服务,显著提升了用户体验。

    转载地址:http://mmvfk.baihongyu.com/

    你可能感兴趣的文章
    PAT甲级——1006 Sign In and Sign Out (25分)
    查看>>
    PAT甲级——1007 Maximum Subsequence Sum (25分)
    查看>>
    PAT甲级——1009 Product of Polynomials (25分)(最后一个测试点段错误)
    查看>>
    Spring对jdbc的支持
    查看>>
    vagrant 的安装
    查看>>
    PayPal网站付款标准版(for PHP)
    查看>>
    Paystack Android SDK 集成与使用指南
    查看>>
    pbf格式详解,javascript加载导出pbf文件示例
    查看>>
    PBOC2.0与3.0的区别
    查看>>
    PbootCMS entrance.php SQL注入漏洞复现
    查看>>
    PbootCMS 前台RCE漏洞复现
    查看>>
    PBT
    查看>>
    PB级分析型数据库ClickHouse的应用场景和特性
    查看>>
    pc3-12800
    查看>>
    PCA---主成成分分析
    查看>>
    PCA和自动编码器:每个人都能理解的算法
    查看>>
    pca算法
    查看>>
    PCA降维demo
    查看>>
    SharePoint 2013 图文开发系列之定义站点模板
    查看>>
    PCB生产流程详解-ChatGPT4o作答
    查看>>