PostgreSQL 在 9.0 之前并未支持流式复制,备库总是落后主库一个 WAL log,在 9.0 之后 PostgreSQL 提供了流式复制,备库不断从主库同步相应的数据,并应用每个 WAL record。 在 PostgreSQL 9.4 开始,PostgreSQL 提供了逻辑流复制功能,至此,PostgreSQL 拥有了更加完备的数据同步方式,解决了物理流复制无法覆盖的一些场景。 本章内容将介绍物理复制与逻辑复制的一些差别。
参数配置差异
我们知道在 PostgreSQL 中如果想要实施流复制,有一个非常重要的参数为 wal_level [1],这个参数确定了需要多少信息记录到 WAL 日志中。wal_level 有三个取值,区别如下:
- minimal:不能通过基础备份和 WAL 日志恢复数据库
- replica:该级别支持 WAL 归档和复制。
- logical:在 replica 级别的基础上添加了支持逻辑解码所需的信息
如果需要配置物理复制,需要使用 replica 级别,如果需要配置逻辑流复制,需要使用 logical 级别即可。
数据写入差异
在物理复制中,备库可以分担主库上的读压力,但是不可写入。而且逻辑复制中,备库可读可写。
apply WAL 日志差异
在物理复制中,不论是已经提交的事务还是回滚的事务,在备库上都需要全量进行应用。而在逻辑复制中,订阅端仅仅需要应用订阅表所产生的 WAL 日志解析后的数据即可。同时逻辑复制可以非常灵活的订阅不同的操作类型,如 insert,update,delete。
全量和部分差异
基于上一点我们得知,在逻辑复制中仅仅需要复制已经订阅的表,不需要全库进行订阅。因此,物理复制在现有版本中只能做到全部复制,而逻辑复制可以做到表级别的细粒度复制。
事务提交差异
在物理复制中,物理复制不需要等待事务提交即可在备库进行重放,因此主备复制延迟更小。而在逻辑复制中,只有已经提交的事务才会在订阅端进行 apply,我们可能观察到在逻辑复制中延迟相对较大。
版本差异
物理复制不支持跨大版本进行部署,而逻辑复制则没有此限制。
[1] https://www.postgresql.org/docs/12/runtime-config-wal.html [2] https://www.postgresql.org/docs/12/warm-standby.html 如果您有其他问题,欢迎您联系火山引擎技术支持服务