admin管理员组

文章数量:1568433

PG学习笔记(1)—— 主从复制:流复制

闲云野鹤,乡夫俗子,不过一隅静土。

背景

PostgreSQL 9.1之前,主从复制传输以WAL日志文件为单位,主库写完WAL日志后再传输给从库,导致主从延迟较大。基于这种情况,PostgreSQL 9.1引入主从流复制,以WAL日志的record为传输单位,从库及时同步主库数据,并且应用每个WAL record,因此能做到同步复制。另外实现了Hot Standby,从库在应用WAL record的同事能够提供制度服务。

架构

PG主从流复制的核心有三个进程构成:

  • walsender:用于主库发送WAL日志记录到从库;
  • walreceiver:用于从库接收主库的WAL日志记录;
  • startup:用于从库apply日志。

流复制的启动

1.启动过程

  1. 启动主从服务器;
  2. 从库节点启动startup进程;
  3. 从库节点启动walreceiver进程;
  4. walreceiver进程向主库节点发送连接请求,如果主库尚未启动,walreceiver会定期重发该请求;
  5. 当主节点收到连接请求时,将启动walsender进程,并建立walsender和walreceiver之间的TCP连接;
  6. walreceiver发送从库节点最新的LSN;
  7. 如果从库最新的LSN小于主库最新LSN,即落后。walsender会将前一个LSN到后一个LSN之间的wal数据发送到walreceiver;
  8. 流复制开始工作。

2.walsender状态

通过pg_stat_replication试图可以查看所有运行的walsender状态

walsender进程可能的状态如下

  • start-up
  • catch-up
  • streaming
  • backup

3。从库节点长期停机启动

  • PostgreSQL 9.4之前,如果从库节点请求的WAL段在主库节点已经被覆盖,那么备份节点将无法追上主节点。暂时没有解决方案,需要把wal_keep_segments参数调大;
  • PostgreSQL 9.4之后,使用复制槽(replication)来预防——通过暂停walreceiver进程,将含有未发送wal段的pg_xlog保存在复制槽中。复制槽可以提供wal数据发送的灵活性,主要用于逻辑复制。

流复制过程

流复制包括两个方面:日志传输和数据

本文标签: 主从学习笔记pg