我尝试使用 pglogical 设置一个简单的主 > 从复制。pglogical文档提到需要一个主键来复制更新和删除。由于我一个都不需要,所以我在提供者处设置了一个复制集,如下所示:
SELECT pglogical.create_replication_set(
set_name := 'all_remote_tables',
replicate_insert := true,
replicate_update := false,
replicate_delete := false,
replicate_truncate := false);
然后我添加了我的表:
SELECT pglogical.replication_set_add_table(
set_name := 'all_remote_tables',
relation := 'measurements',
synchronize_data := true);
我的订阅者设置如下:
SELECT pglogical.create_subscription(
subscription_name := 'testsubscription1',
provider_dsn := 'host=$host port=$port dbname=$dbname user=$user password=$pw',
replication_sets := array['all_remote_tables'],
synchronize_structure := true,
synchronize_data := true,
forward_origins := '{}');
有了这个设置和这样的表格布局:
CREATE TABLE "measurements"(
time TIMESTAMP WITH TIME ZONE NOT NULL,
value NUMERIC,
sensor_id TEXT);
只有结构被复制。
只要我添加一个主键:
CREATE TABLE "measurements"(
id SERIAL PRIMARY KEY,
time TIMESTAMP WITH TIME ZONE NOT NULL,
value NUMERIC,
sensor_id TEXT);
一切都按预期工作。
由于我想存储高频时间序列(使用timescaledb)并且永远不需要更新/删除单行,我在这里看不到主键的好处。因此,我想知道如果没有设计主键,pglogical 是否无法正常工作,或者我是否做了一些错误配置。
预建的复制集“default_insert_only”在没有任何主键的情况下工作,但我想使用我自己的复制集。
有点题外话:您甚至会建议将 pglogical 用于简单的多个主服务器 > 特定表的一个从服务器复制(=聚合)?由于postgres 10逻辑复制无论如何都是核心的一部分。