replisome - 精致地复制某物
项目描述
该项目目前处于预生产阶段。我们正在对其进行开发。
replisome 是 PostgreSQL 逻辑解码的输出插件。使用该插件,客户端可以接收描述数据库内部数据操作(记录的插入、更新、删除)的更改流(例如,所有或指定子集的表),并可以选择限制接收的列和行。更改以 JSON 格式接收。
replisome 并不试图成为完整的复制解决方案:请查看 pglogical 了解这一点。您可以使用它的功能:
以可读的方式从数据库接收数据,而不是用于复制(例如,用于记录、将消息传递到不同的系统等)
将数据库中的数据更新集成到具有任意不同模式的接收数据库中。
replisome 不需要在发送更改的数据库中持久配置,除了创建一个逻辑复制槽。配置,即要发送哪些记录,完全由连接的客户端选择。更改配置就像停止副本并使用不同的参数重新启动它一样简单(数据流将从先前中断的地方恢复)。
replisome 在 PostgreSQL 许可证下发布。
需求
PostgreSQL 9.4+
构建和安装
此功能将被打包为一个扩展,具有版本号,将在PGXN上发布……但目前它仅在github上可用
$ git clone https://github.com/dvarrazzo/wal2json.git -b replisome replisome
基于Unix的操作系统
扩展应在PostgreSQL安装中编译和安装,之后它将在该安装运行的数据库集群中可用。
为了构建扩展,您需要一个C编译器、PostgreSQL服务器开发包,也许还需要谷歌友好地告诉您的一些其他东西。
$ git clone https://github.com/dvarrazzo/wal2json.git -b replisome replisome $ cd replisome $ export PATH= $ make PG_CONFIG=/path/to/bin/pg_config $ sudo make PG_CONFIG=/path/to/bin/pg_config install
Windows
在一个没有墙的世界里,你不需要窗户。但如果你碰巧需要,试试看,然后发送一些补丁回来。
配置
您需要将至少两个参数设置到postgresql.conf
wal_level = logical max_replication_slots = 1
更改这些参数后,需要重启。
示例
有几种方法可以从replisome插件获取更改(JSON对象)
使用SQL函数,例如pg_logical_slot_get_changes()
从命令行使用pg_recvlogical。
使用pg_recvlogical的示例
除了上述配置外,还需要配置一个复制连接以使用pg_recvlogical。
首先,在pg_hba.conf中添加一个条目
local replication myuser trust host replication myuser 10.1.2.3/32 trust
此外,将max_wal_senders设置到postgresql.conf
max_wal_senders = 1
如果更改max_wal_senders,则需要重启。
现在您可以尝试replisome了。在一个终端中创建一个复制槽并启动一个副本
$ pg_recvlogical -d postgres --slot test_slot --create-slot -P replisome $ pg_recvlogical -d postgres --slot test_slot --start -o pretty-print=1 -f -
在另一个终端连接到数据库并输入一些命令
=# create table test ( id serial primary key, data text, ts timestamptz default now()); CREATE TABLE =# insert into test default values; INSERT 0 1 =# insert into test (data) values ('hello'); INSERT 0 1 =# begin; BEGIN *=# update test set data = 'world' where id = 2; UPDATE 1 *=# delete from test where id = 1; DELETE 1 *=# commit; COMMIT
流连接应显示所执行的操作描述
{ "change": [ { "op": "I", "schema": "public", "table": "test", "colnames": ["id", "data", "ts"], "coltypes": ["int4", "text", "timestamptz"], "values": [1, null, "2017-05-13 13:15:28.052318+01"] } ] } { "change": [ { "op": "I", "schema": "public", "table": "test", "values": [2, "hello", "2017-05-13 13:15:35.140594+01"] } ] } { "change": [ { "op": "U", "schema": "public", "table": "test", "values": [2, "world", "2017-05-13 13:15:35.140594+01"], "keynames": ["id"], "keytypes": ["int4"], "oldkey": [2] } ,{ "op": "D", "schema": "public", "table": "test", "oldkey": [1] } ] }
选项
插件输出内容和格式由传递给START_REPLICATION命令的几个选项配置(例如,使用pg_recvlogical的-o选项,psycopg的start_replication()方法等)。
- pretty-print [bool] (默认: false)
在输出中添加空格以提高可读性。
- include [json]
选择要查看的表及其内容。该命令可以与exclude一起使用多次:每个表都将根据顺序指定的所有命令进行匹配,以确定是否包含或排除。最后一个匹配的命令将生效(例如,您可能排除一个整个模式,然后只包含一个特定的表)。
该参数是一个JSON对象,可能包含以下键
table: 匹配具有此名称的表,位于任何模式中
tables: 匹配名称与正则表达式匹配的所有表,位于任何模式中
schema: 匹配模式中的所有表
schemas: 匹配名称与正则表达式匹配的所有模式中的所有表
这些键将确定一个表是否与配置对象匹配。至少必须指定一个模式或表。还可以指定以下选项,并将影响任何由对象确定的包含的表
columns: 只输出指定的列(作为JSON数组)
skip_columns: 不输出指定的列
where: 只输出与指定为SQL表达式的条件匹配的行,该表达式匹配表列,类似于CHECK子句。
示例(作为pg_recvlogical选项)
-o ' {"tables": "^test.*", "skip_columns": ["ts", "wat"], "where": "id % 2 = 0"}'
- exlcude [json]
选择要排除的表。格式与include相同,但只能指定表/模式,不能指定行或列。
- include-xids [bool] (默认:false)
如果设置为true,则包含每笔交易的ID
{ "xid": 5360, "change": [ { ...
- include-lsn [bool] (默认:false)
包含交易的日志序列号
{ "nextlsn": "0/3784C40", "change": [ { ...
- include-timestamp [bool] (默认:false)
包含交易的提交时间
{ "timestamp": "2017-05-13 03:19:29.828474+01", "change": [ { ...
- include-schemas [bool] (默认:true)
包含表的模式名称。
- include-types [bool] (默认:true)
包含表列的类型。
- include-empty-xacts [bool] (默认:false)
如果设置为true,则发送不包含数据更改的交易的详细信息(例如,仅执行DDL语句的交易。仅发送交易的元数据(例如时间、txid)。
- write-in-chunks [bool] (默认:false)
如果设置为true,数据可能以多个块的形式发送,而不是发送整个交易的单一消息。请注意,单个块可能不是一个有效的JSON文档,客户端负责聚合接收到的部分。
许可证
在满足以下条件的情况下,允许重新分发和使用源代码和二进制代码,无论是否修改
源代码重新分发必须保留上述版权声明、本条件列表和以下免责声明。
二进制形式的重新分发必须在上面的版权声明、本条件列表和以下免责声明中复制,并在提供的文档或其它材料中。
未经Gambit Research Ltd.的明确事先书面许可,不得使用Gambit Research Ltd.的名称或其贡献者的名称来认可或推广源自本软件的产品。
本软件由版权所有者和贡献者“按原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的暗示保证。在任何情况下,版权所有者或贡献者不对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,即使已被告知此类损害的可能性,即使是在使用本软件的情况下。