PostgreSQL逻辑解码插件集合【翻译、学习、实践】

举报
大象数据库 发表于 2020/06/15 15:35:15 2020/06/15
【摘要】 社区官方:https://wiki.postgresql.org/wiki/Logical_Decoding_Plugins逻辑解码提供了将通过SQL进行的修改流式传输到外部使用者的能力。为了能够使用逻辑解码,您需要在postgresql中安装一个插件,以将WAL内部表示形式转换为客户端可以使用的格式。目前看,主要分为5类。JSON格式插件wal2jsonhttps://github.com...

社区官方:https://wiki.postgresql.org/wiki/Logical_Decoding_Plugins

逻辑解码提供了将通过SQL进行的修改流式传输到外部使用者的能力。

为了能够使用逻辑解码,您需要在postgresql中安装一个插件,以将WAL内部表示形式转换为客户端可以使用的格式。

目前看,主要分为5类。


1.JSON格式插件

    wal2json

    https://github.com/eulerto/wal2json

    JSON输出插件,用于变更集提取

    "change": [
	{
		"kind": "insert",
		"schema": "public",
		"table": "table_with_pk",
		"columnnames": ["a", "b", "c"],
		"columntypes": ["int4", "varchar", "timestamp"],
		"columnvalues": [1, "Backup and Restore", "2015-08-27 16:46:35.818038"]
	}]

    解码json

    https://github.com/leptonix/decoding-json

    该插件从WAL接收更改并将其解码为JSON。

{"type":"transaction.begin","xid":"2010561","committed":"2015-04-22 19:23:35.714443+00"}
{"type":"table","name":"abc","change":"INSERT","data":{"a":6,"b":7,"c":42}}
{"type":"table","name":"abc","change":"UPDATE","key":{"a":6,"b":7},"data":{"a":6,"b":7,"c":13}}

    coder_json

    https://github.com/ildus/decoder_json

    使用libjansson进行json生成,而不使用本机postgresql代码

    jsoncdc

    https://github.com/instructure/jsoncdc

    使用rust编写

    wal2mongo

    将变更集转换为MongoDB直接使用的格式

    https://github.com/HighgoSoftware/wal2mongo

插入数据
> db.books.insertOne( { id:123, title:"HG-PGSQL1.1", author:"Highgo" } )
{
	"acknowledged" : true,
	"insertedId" : ObjectId("5e5ea92be9684c562aae5b7a")
}

查看结果:
> db.books.find();
{ "_id" : ObjectId("5e5ea8f3bb2265ca8fa4b7ae"), "id" : 123, "title" : "HG-PGSQL1.1", "author" : "Highgo" }
>


2.Protobuf格式插件

        解码器

        https://github.com/xstevens/decoderbufs

        coderbufs是PostgreSQL逻辑解码器输出插件,用于将数据作为协议缓冲区传递。

        postgres-decoderbufs

        https://github.com/debezium/postgres-decoderbufs

        xstevens / decoderbufs的叉子,用作debezium连接器

        pg_pb3_ld

        https://github.com/johto/pg_pb3_ld

        工作正在进行中

3.Avro格式插件

    Bottled Water

    https://github.com/confluentinc/bottledwater-pg

    流入Kafka. 不再维护,暂时不学习了.

4.SQL格式插件

    coder_raw

    https://github.com/michaelpq/pg_plugins/tree/master/decoder_raw

    此用于逻辑复制的输出插件根据其发现的逻辑更改生成原始查询。这些查询可以被任何远程源使用。

SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');    
data    
---------------------------------------------------    
INSERT INTO public.aa (b, a) VALUES ('aa', 1);    
INSERT INTO public.aa (b, a) VALUES ('bb', 2);    
UPDATE public.aa SET b = 'cc', a = 1 WHERE a = 1;    
UPDATE public.aa SET b = 'cc', a = 3 WHERE a = 1;    
UPDATE public.aa SET b = 'dd', a = 4 WHERE a = 2;    
DELETE FROM public.aa WHERE a = 4;    
(6 rows)    
SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');    
data    
---------------------------------------------------    
BEGIN;    
COMMIT;


5.其它

    test_decoding 社区自带的插件,名字带了test,让人困惑

    contrib / test_decoding是逻辑解码输出插件的示例代码。它把自己描述为“没有做任何特别有用的事情,但是可以作为开发自己的解码器的起点”。

    人们已经编写了代码来解析此插件的输出,但这并不是一个好主意:

    osm-logical

    https://github.com/zerebubuth/osm-ologic

    用于openstreetmaps的玩具代码。看起来是基于test_decoding的。

    pglogical

    https://www.2ndquadrant.com/en/resources/pgologic/

    pgologic是一个逻辑复制系统,实现为postgresql扩展

    transicator

    https://github.com/apigee-labs/transicator

    收发器从单个逻辑解码连接读取并通过REST API将更改复制到许多(数千个)间歇性连接的客户端中

    

总结:插件支持的范围非常广,可以用来和异构数据和应用共同构建优秀的解决方案。为PG生态点赞!!!

【版权声明】本文为华为云社区用户翻译文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容, 举报邮箱:cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。