PostgreSQL 逻辑复制解密
在数字化时代的今天,我们都认同数据会创造价值。为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值。而在这纵横交错的数据网络中,逻辑复制扮演着及其重要的角色。
让我们将视角从复杂的网络拉回其中的一个端点,从 PostgreSQL 出发,对其逻辑复制的原理进行解密。
1 概念与原理
逻辑复制,是基于复制标识复制数据及其变化的一种方法。区别于物理复制对页面操作的描述,逻辑复制是对事务及数据元组的一种描述。
图 - WAL 数据流示例
如图所示,物理复制的数据流是对 tablespace/database/filenode 文件的块进行操作,而逻辑复制的内容是对元组进行描述。
接下来我们来看逻辑复制中的几个概念:
复制槽
复制槽是记录复制状态的一组信息。由于 WAL(预写式日志)文件在数据真正落盘后会删除,复制槽会防止过早清理逻辑复制解析所需的 WAL 日志。在逻辑复制中,每个插槽从单个数据库流式传输一系列更改,创建复制槽需要指定其使用的输出插件,同时创建复制槽时会提供一个快照。
输出插件
输出插件负责将 WAL 日志解码为可读的格式,常用的插件用 test_decoding (多