数仓知识12:PostgreSQL预写日志(WAL)和逻辑解码方案

目录

PostgreSQL预写日志(WAL)

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版本输出格式
wal2json9.4+json
decoderbufs9.6+protobuf
pgoutput     10.0+pg log
test_decoding9.4+text
decoder_raw9.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解码消费此插件的输出内容。

此代码依赖于以下库,并需要它们进行编译:

解析器: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)社区文档:

写作不易,如果读完以后觉得有帮助,欢迎点赞和收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值