一文读懂流复制(postgresql流复制详解)
流复制是postgresql的一种数据复制方式,用于两个postgresql数据库节点之间的数据备份或者数据同步。
postgresql使用wal日志保存数据操作记录,再通过操作wal日志对数据操作后将数据写入磁盘。
postgresql采用tcp协议来传输wal日志,对wal日志的传输控制及确认采用自定义协议。
流复制从流程上来讲,是一个postgresql数据库节点将本地wal日志数据通过网络发送到另外一个数据库节点的过程。
postgresql采用多进程模式设计,每个功能都通过创建一个进程来实现。在流复制中,对于发送端来说是walsender进程,对于接收端来说是walreceiver进程。
要理解流复制,需要弄清楚如下几个概念:
- wal日志
- 数据发送机制(walsender)
- 数据接收机制(walreceiver)
- 数据确认机制(自定义协议)
- tcp配置参数(心跳等)
- 数据恢复机制(如何将wal日志变成数据)
- 进度跟踪机制(状态、进度等)
wal日志
PostgreSQL在执行数据修改操作时,修改的数据在写入磁盘之前首先要将修改的内容写入wal日志文件,这样就不必时时的将共享缓存中的数据文件刷新到磁盘中,当数据库发生崩溃我们可以从wal日志获取共享缓存中未写入到磁盘的数据。这样做的目的是以顺序写入的wal代替随机的数据写入,以获取更高的执行效率。
目前的高性能磁盘,顺序写速度可以达到600MB/s, 超过了一般网卡的传输速度。但是磁盘随机写的速度只有大概100KB/s,和顺序写的性能相差6000倍。