PostgreSQL逻辑解码插件集合【翻译、学习、实践】
社区官方: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生态点赞!!!
- 点赞
- 收藏
- 关注作者
评论(0)