同步流复制是是从9.1版本实现的,可以是一主多从的模式,在postgresql里主节点叫master,备节点叫standby。
主备是基于日志传送的技术实现同步,主节点持续发送wal数据,备节点重放接受到的wal数据。
主要介绍以下几个方面:
- 流复制如何启动的
- 主备之间如何传送数据
- 主节点如何管理多个备节点
- 主节点如何发现失败的备节点
开始流复制
在流复制中,三个进程协同工作,walsender在主节点发送wal数据到备节点,然后,备节点启动一个walreceiver和一个startup进程接受和重放数据,walsender和walreceiver通过一个TCP通讯协议建立连接。
这一章节,我们将探索流复制的start-up顺序,明白这些进程是如何启动,以及如何建立连接。
下图显示了流复制的启动及连接步骤:
1.启动主节点和备节点
2.备节点启动startup进程
3.备节点启动walreceiver进程
4.walreceiver发送一个连接请求到主节点,如果主节点没有运行,walreceiver会周期性的发送请求
5.当主节点接受到一个连接的请求,就会启动一个walsender进程建立连接
6.walreceiver发送备节点最后的LSN,这个阶段在IT领域叫握手机制
7.如果备机点的LSN小于主节点的LSN,walsender发送wal数据,即从节点的LSN到主节点LSN的wal数据,wal数据由存储在主节点的pg_xlog(10版本以后叫pg_wal)目录下的wal segment提供,这个阶段就是备节点追赶主节点的阶段
8.流复制开始工作
每一个walsender进程在和walreceiver建立连接工作都会有一个合适的状态,以下是可能的状态:
start-up:见上图5~6
catch-up:上图7
streaming:上图8
backup:因为备份发送整个数据库集群的文件,比如pg_basebackup工具
通过 pg_stat_replication视图可以查看:
testdb=# SELECT application_name,state FROM pg_stat_replication;
application_name | state
------------------+-----------
standby1 | streaming
standby2 | streaming
pg_basebackup | backup
(3