Инструменты пользователя

Инструменты сайта


postgres:replikacija

Быстрая настройка

Сначала установите параметры конфигурации в postgresql.conf:

wal_level = logical

Другие необходимые параметры по умолчанию имеют значения, подходящие для базовой настройки.

В файл pg_hba.conf необходимо внести изменения, чтобы разрешить репликацию (конкретные значения будут зависеть от фактической конфигурации сети и имени пользователя, с которым вы будете подключаться):

host     all     all     all     md5

Затем в базе данных публикации выполните:

CREATE PUBLICATION mypub FOR TABLE "category_trees", "brands", "card_products", "category_vendor", 
"characteristics", "comments", "countries", "filters", "filter_types", "grades", "images", "positions", "prices", 
"purposes", "sales", "search_requests", "shippings", "stocks_jsons", "suppliers"; 

И в базе данных подписчика:

CREATE SUBSCRIPTION mysub CONNECTION 'dbname=parser_wb host=10.5.0.5 user=parser_wb port=5432 password=parser_wb' PUBLICATION mypub;

Показанная выше команда запустит процесс репликации, который вначале синхронизирует исходное содержимого таблиц users и departments, а затем начнёт перенос инкрементальных изменений в этих таблицах.

Посмотреть опубликованные таблицы

SELECT pr.* ,pc.relname, pp.pubname  FROM pg_publication_rel pr
INNER JOIN pg_class pc ON pc.oid = pr.prrelid
INNER JOIN pg_publication pp ON pp.oid = pr.prpubid

Посмотреть подписанные таблицы

SELECT psr.*, pc.relname, ps.subname, ps.subenabled,ps.subconninfo FROM pg_subscription_rel psr
INNER JOIN pg_class pc ON pc.oid = psr.srrelid
INNER JOIN pg_subscription ps ON ps.oid = psr.srsubid

Использование логической репликации

Изменение публикации, чтобы публиковались только удаления и изменения:

ALTER PUBLICATION mypub SET (publish = 'update, delete');

Добавление таблиц в публикацию:

ALTER PUBLICATION mypub ADD TABLE users, departments;

На мастере заполняем таблицу и создаем публикацию:

INSERT INTO test VALUES ('k1', 'v1'), ('k2', 'v2');
CREATE PUBLICATION mypub FOR ALL TABLES;

Здесь в публикацию были добавлены все сущесвтующие таблицы, но также можно указать и список конкретных таблиц:

CREATE PUBLICATION mypub FOR TABLE table1, table2;

Кроме того, можно указать, какие именно изменения следует публиковать:

CREATE PUBLICATION mypub
FOR ALL TABLES WITH (publish = 'insert,update');

Изменение списка таблиц в публикации происходит так:

ALTER PUBLICATION mypub ADD  TABLE t1, t2;
ALTER PUBLICATION mypub SET  TABLE t3, t4;
 ALTER PUBLICATION mypub DROP TABLE t5, t6;

На реплике создаем подписку и проверяем содержимое таблицы:

– можно указывать и несколько публикаций через запятую

CREATE SUBSCRIPTION allsub
CONNECTION 'host=10.128.0.16 user=eax dbname=eax'
PUBLICATION mypub;
 
SELECT * FROM test;

Если все было сделано правильно, на реплике вы увидите все те же данные, что и на мастере. Кроме того, любые изменения таблицы на мастере будут приводить к соответствующим изменениям на реплике. При желании можно проверить работу логической репликации под нагрузкой, например, так:

INSERT INTO test SELECT 'kk' %%|%%| i, 'vv' %%|%%| i
FROM generate_series(1, 10000) AS i;

При создании новых таблиц реплика не будет автоматически их тянуть, даже если публикация была создана как FOR ALL TABLES. Как уже было отмечено, DDL не реплицируется. Для решения проблемы нужно создать на реплике таблицы с такой же схемой, что и на мастере (с поправкой на порядок полей и прочее, см выше), а затем сказать:

ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;

Подписку можно временно включать и выключать:

ALTER SUBSCRIPTION mysub ENABLE;
ALTER SUBSCRIPTION mysub DISABLE;

… а также менять мастера:

ALTER SUBSCRIPTION mysub CONNECTION 'host=...';

Наконец, рассмотрим удаление публикации и подписки:

– на реплике

DROP SUBSCRIPTION mysub;


– на мастере

DROP PUBLICATION mypub;

Казалось бы, что это все. Однако на практике репликацию нужно еще и как-то мониторить. Давайте выясним, как это делается.

Методы для мониторинга

pg_publication

SELECT * FROM pg_publication;

Каталог pg_publication содержит все публикации, созданные в базе данных. Подробнее о публикациях можно узнать в Разделе 30.1.

Столбцы pg_publication

ИмяТипСсылкиОписание
oidoid Идентификатор строки (скрытый атрибут; должен выбираться явно)
pubnamename Имя публикации
pubowneroidpg_authid.oidВладелец публикации
puballtablesbool Если true, эта публикация автоматически включает все таблицы в базе данных, в том числе и те, что будут созданы в будущем.
pubinsertbool Если true, операции INSERT реплицируются для таблиц в репликации.
pubupdatebool Если true, операции UPDATE реплицируются для таблиц в публикации.
pubdeletebool Если true, операции DELETE реплицируются для таблиц в публикации.


pg_publication_rel

Каталог pg_publication_rel содержит сопоставления отношений и публикаций в базе данных (это сопоставления вида многие-ко-многим). Более понятное пользователю представление этой информации можно также получить в Разделе 49.78.

Столбцы pg_publication_rel

ИмяТипСсылкиОписание
prpubidoidpg_publication.oidСсылка на публикацию
prrelidoidpg_class.oidСсылка на отношение


pg_subscription_rel

Каталог pg_subscription_rel содержит состояние каждого реплицируемого отношения в каждой подписке (это связь вида многие-ко-многим).

Этот каталог содержит только таблицы, известные в подписке после выполнения CREATE SUBSCRIPTION или ALTER SUBSCRIPTION … REFRESH PUBLICATION.

Столбцы pg_subscription_rel

ИмяТипСсылкиОписание
srsubidoidpg_subscription.oidСсылка на подписку
srrelidoidpg_class.oidСсылка на отношение
srsubstatechar Код состояния: i = инициализация, d = копирование данных, s = синхронизация выполнена, r = готовность (обычная репликация)
srsublsnpg_lsn LSN изменения состояния на удалённой стороне, который используются для координации синхронизации в состояниях s или r; в других случаях — null


Динамические статистические представления

Имя представленияОписание
pg_stat_activity Одна строка для каждого серверного процесса c информацией по текущей активности процесса, такой как состояние и текущий запрос. За подробностями обратитесь к pg_stat_activity.
pg_stat_replicationПо одной строке для каждого процесса-передатчика WAL со статистикой по репликации на ведомом сервере, к которому подключён этот процесс. За подробностями обратитесь к pg_stat_replication.
pg_stat_wal_receiverТолько одна строка со статистикой приёмника WAL, полученной с сервера, на котором работает приёмник. За подробностями обратитесь к pg_stat_wal_receiver.
pg_stat_subscriptionКак минимум одна строка для подписки, сообщающая о рабочих процессах подписки. За подробностями обратитесь к pg_stat_subscription.
pg_stat_sslОдна строка для каждого подключения (обычного и реплицирующего), в которой показывается информация об использовании SSL для данного подключения. За подробностями обратитесь к pg_stat_ssl.
pg_stat_progress_vacuumПо одной строке с текущим состоянием для каждого обслуживающего процесса (включая рабочие процессы автоочистки), в котором работает VACUUM. См. Подраздел 27.4.1.

Столбцы ''pg_class''

ИмяТипСсылкиОписание
oidoid Идентификатор строки (скрытый атрибут; должен выбираться явно)
relnamename Имя таблицы, индекса, представления и т. п.
relnamespaceoidpg_namespace.oidOID пространства имён, содержащего это отношение
reltypeoidpg_type.oidOID типа данных, соответствующего типу строки этой таблицы, если таковой есть (ноль для индексов, так как они не имеют записи в pg_type)
reloftypeoidpg_type.oidДля типизированных таблиц, OID нижележащего составного типа, или ноль для всех других отношений
relowneroidpg_authid.oidВладелец отношения
relamoidpg_am.oidЕсли это индекс, применяемый метод доступа (B-дерево, хеш и т. д.)
relfilenodeoid Имя файла на диске с этим отношением; ноль означает, что это «отображённое» представление, имя файла для которого определяется состоянием на нижнем уровне
reltablespaceoidpg_tablespace.oidТабличное пространство, в котором хранится это отношение. Если ноль, подразумевается пространство базы данных по умолчанию. (Не имеет значения, если с отношением не связан файл на диске.)
relpagesint4 Размер представления этой таблицы на диске (в страницах размера BLCKSZ). Это лишь примерная оценка, используемая планировщиком. Она обновляется командами VACUUM, ANALYZE и несколькими командами DDL, например, CREATE INDEX.
reltuplesfloat4 Число строк в таблице. Это лишь примерная оценка, используемая планировщиком. Она обновляется командами VACUUM, ANALYZE и несколькими командами DDL, например, CREATE INDEX.
relallvisibleint4 Число страниц, помеченных как «полностью видимые» в карте видимости таблицы. Это лишь примерная оценка, используемая планировщиком. Она обновляется командами VACUUM, ANALYZE и несколькими командами DDL, например, CREATE INDEX.
reltoastrelidoidpg_class.oidOID таблицы TOAST, связанной с данной таблицей, или 0, если таковой нет. В таблицу TOAST, как во вторичную, «выносятся» большие атрибуты.
relhasindexbool True, если это таблица и она имеет (или недавно имела) индексы
relissharedbool True, если эта таблица разделяется всеми базами данных в кластере. Разделяемыми являются только некоторые системные каталоги (как например, pg_database).
relpersistencechar p = постоянная таблица (permanent), u = нежурналируемая таблица (unlogged), t = временная таблица (temporary)
relkindchar r = обычная таблица (Relation), i = индекс (Index), S = последовательность (Sequence), t = таблица TOAST, v = представление (View), m = материализованное представление (Materialized view), c = составной тип (Composite type), f = сторонняя таблица (Foreign table), p = секционированная таблица (Partitioned table)
relnattsint2 Число пользовательских столбцов в отношении (системные столбцы не считаются). Столько же соответствующих строк должно быть в pg_attribute. См. также pg_attribute.attnum.
relchecksint2 Число ограничений CHECK в таблице; см. каталог pg_constraint
relhasoidsbool True, если для каждой строки отношения генерируется OID
relhaspkeybool True, если в таблице имеется (или имелся) первичный ключ
relhasrulesbool True, если для таблицы определены (или были определены) правила; см. каталог pg_rewrite
relhastriggersbool True, если для таблицы определены (или были определены) триггеры; см. каталог pg_trigger
relhassubclassbool True, если у таблицы есть (или были) потомки в иерархии наследования
relrowsecuritybool True, если для таблицы включена защита на уровне строк; см. каталог pg_policy
relforcerowsecuritybool True, если защита на уровне строк (когда она включена) также применяется к владельцу таблицы; см. каталог pg_policy
relispopulatedbool True, если отношение наполнено данными (это истинно для всех отношений, кроме некоторых материализованных представлений)
relreplidentchar Столбцы, формирующие «идентификатор реплики» для строк: d = по умолчанию (первичный ключ, если есть), n = никакие (nothing), f = все столбцы, i = индекс со свойством indisreplident (если ранее использованный индекс удалён, действует так же, как n)
relispartitionbool True, если таблица является секцией
relfrozenxidxid Идентификаторы транзакций, предшествующие данному, в этой таблице заменены постоянным («замороженным») идентификатором транзакции. Это нужно для определения, когда требуется очищать таблицу для предотвращения зацикливания идентификаторов или для сокращения объёма pg_xact. Если это отношение — не таблица, значение равно нулю (InvalidTransactionId).
relminmxidxid Идентификаторы мультитранзакций, предшествующие данному, в этой таблице заменены другим идентификатором транзакции. Это нужно для определения, когда требуется очищать таблицу для предотвращения зацикливания идентификаторов мультитранзакций или для сокращения объёма pg_multixact. Если это отношение — не таблица, значение равно нулю (InvalidMultiXactId).
relaclaclitem[] Права доступа; за подробностями обратитесь к описанию GRANT и REVOKE
reloptionstext[] Специальные параметры для методов доступа, в виде строк «ключ=значение»
relpartboundpg_node_tree Если таблица является секцией (см. relispartition), внутреннее представление границ секции
postgres/replikacija.txt · Последние изменения: 2023/01/12 12:18 (внешнее изменение)