跳转到主要内容

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对象)

使用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文档,客户端负责聚合接收到的部分。

许可证

版权所有(c)2013-2017,Euler Taveira de Oliveira
版权所有(c)2017,Gambit Research Ltd。
保留所有权利。

在满足以下条件的情况下,允许重新分发和使用源代码和二进制代码,无论是否修改

  • 源代码重新分发必须保留上述版权声明、本条件列表和以下免责声明。

  • 二进制形式的重新分发必须在上面的版权声明、本条件列表和以下免责声明中复制,并在提供的文档或其它材料中。

  • 未经Gambit Research Ltd.的明确事先书面许可,不得使用Gambit Research Ltd.的名称或其贡献者的名称来认可或推广源自本软件的产品。

本软件由版权所有者和贡献者“按原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的暗示保证。在任何情况下,版权所有者或贡献者不对任何直接、间接、偶然、特殊、示范性或后果性的损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,即使已被告知此类损害的可能性,即使是在使用本软件的情况下。

项目详情


由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面