Необходим ли первичный ключ для репликации вставок с использованием pglogical?
Я попытался настроить простую реплику master > slave с помощью 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 является частью ядра в любом случае.
1 ответ
Для этого вам не нужен настраиваемый набор репликации, для этого существует предварительно установленный default_insert_only. Проверьте главу "2.4 Наборы репликации" в pglogical docs.