目录
PostgreSQL逻辑解码(Logical Decoding)
PostgreSQL预写日志(WAL)
从PostgreSQL 9.4.26版本开始,PostgreSQL 开始支持预写日志记录(Write-Ahead Logging)。WAL的核心概念:在写入对数据文件(表和索引所在的位置)的更改时,将描述更改的日志记录刷新到永久存储。和Oracle的REDO Log是类似的逻辑。
有两种记录日志的逻辑:
- 同步提交:服务器等待事务的WAL记录刷新到永久存储,然后向客户端返回成功指示,可确保所有写入到数据库里的数据,都有其对应的日志记录。。
- 异步提交:一旦事务在逻辑上完成,服务器就会在它生成的WAL记录实际进入磁盘之前立即返回成功。
同步提交可以保证客户端保留已提交的事务,即使在之后立即发生服务器崩溃也可以恢复。
异步提交的优点是事务可以更快地完成,但是有数据丢失的风险。如果数据库在异步提交和写入事务的WAL记录之间的风险时段内崩溃,则在该事务期间所做的更改将丢失。
注:恢复数据记录时,重播WAL是按照提交顺序重放的,因此不会引入不一致。
官方介绍:PostgreSQL:文档:9.4:可靠性和预写日志
PostgreSQL逻辑解码(Logical Decoding)
PostgreSQL在9.4版本中加入了逻辑解码。逻辑解码是将数据库表的所有持久更改提取为一致的、易于理解的格式的过程,该格式可以在不详细了解数据库内部状态的情况下进行解释。在PostgreSQL中,逻辑解码是通过将预写日志(WAL)的内容(描述存储级别的更改)解码为特定于应用程序的形式(如元组流或SQL语句)来实现的。
逻辑解码的过程:
当 Postgres 表中的某一行发生更改时,该更改将记录在 WAL 中。如果启用了逻辑解码,则该更改的记录将传递到输出插件。输出插件将该记录从WAL格式更改为插件的格式(例如JSON对象)。然后,重新格式化的更改通过复制槽退出 PostgreSQL。最后,还有消费者。消费者是您选择的连接到Postgres并接收逻辑解码输出的任何应用程序。
注:从上面的过程可以看出,逻辑解码只能输出有关 Postgres 中的 DML(数据操作)事件的信息,不支持DDL变更,且任何不是 INSERT、UPDATE 或 DELETE 的命令都不支持(PostgreSQL: Documentation: 14: SQL Commands)。
官方介绍:PostgreSQL: Documentation: 14: 49.2.逻辑解码概念
逻辑解码方案研究分析
解码器 | pg版本 | 输出格式 |
---|---|---|
wal2json | 9.4+ | json |
decoderbufs | 9.6+ | protobuf |
pgoutput | 10.0+ | pg log |
test_decoding | 9.4+ | text |
decoder_raw | 9.4+ | SQL |
解析器:wal2json
开源地址:wal2json/README.md at master · eulerto/wal2json · GitHub
wal2json 是基于JSON的,目前由wal2json社区维护,Debezium解码消费此插件的输出内容。
其他信息:
Debezimu于2021-09-01停止支持wal2json,建议用户使用内置的pgoutput或decoderbufs。
信息来源:Discontinuing wal2json support (google.com)、[DBZ-3953]弃用 wal2json 支持 - (redhat.com)
解析器:decoderbufs
开源地址:GitHub - debezium/postgres-decoderbufs
decoderbufs 是基于Protobuf的,目前由Debezimu社区维护,Debezium解码消费此插件的输出内容。
此代码依赖于以下库,并需要它们进行编译:
- PostgreSQL 9.6+
- Protobuf-c 1.2+ - 用于数据序列化
- PostGIS 2.1+ - 用于 Postgres 几何类型支持
解析器:pgoutput
pgoutput在PostgreSQL 10及以上版本中是标准的Logical Decoding 输出插件。由PostgreSQL社区官方维护,这个插件是内置安装的,所以不需要额外安装PostgreSQL。
Debezium解码消费此插件的输出内容。
解析器:test_decoding
这是PostgreSQL自带的"用于测试"的逻辑解码插件,一般不建议用于生产环境,可能存在未知的问题。
*网上相关的介绍比较少。
解析器:decoder_raw
开源地址:pg_plugins/decoder_raw at main · michaelpq/pg_plugins · GitHub
这个逻辑复制的输出插件会根据它发现的逻辑变化生成原始查询。这些查询可以被任何远程源使用。
*网上相关的介绍比较少。
参考文献:
1)官方文档:
2)社区文档:
- PostgreSQL 变更事件捕获 (CDC) - 开发者头条 (toutiao.io)
- 实时数据引擎系列(六): 从 PostgreSQL 实时数据集成看增量数据缓存层的必要性 - 知乎 (zhihu.com)
- 使用Debezium、Postgres和Kafka进行数据实时采集(CDC)_码匠君的博客-CSDN博客_debezium postgres
写作不易,如果读完以后觉得有帮助,欢迎点赞和收藏!