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.启动过程
- 启动主从服务器;
- 从库节点启动startup进程;
- 从库节点启动walreceiver进程;
- walreceiver进程向主库节点发送连接请求,如果主库尚未启动,walreceiver会定期重发该请求;
- 当主节点收到连接请求时,将启动walsender进程,并建立walsender和walreceiver之间的TCP连接;
- walreceiver发送从库节点最新的LSN;
- 如果从库最新的LSN小于主库最新LSN,即落后。walsender会将前一个LSN到后一个LSN之间的wal数据发送到walreceiver;
- 流复制开始工作。
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数据发送的灵活性,主要用于逻辑复制。
流复制过程
流复制包括两个方面:日志传输和数据