PostgreSQL中的物理复制和逻辑复制

数据库关系型数据库技术服务知识库
前言

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 如果您有其他问题,欢迎您联系火山引擎技术支持服务

37
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论