Дружественное напоминание
Репликация
В PostgreSQL, на базе которого построен СУБД Pangolin, уже достаточно давно имеются средства, необходимые (но не достаточные) для построения кластеров. Главное такое средство — репликация, суть которой заключается в передаче тем или иным способом изменений в данных с одного узла кластера на другие. Современный способ репликации в PostgreSQL основан на использовании специальной версии сетевого протокола PostgreSQL, называемого протоколом репликации.
Протокол репликации PostgreSQL в целом похож на обычный протокол, предназначенный для выполнения команд SQL. Однако протокол репликации передает не команды SQL, а специальные команды репликации.
В современных версиях PostgreSQL применяется два вида репликации – физическая и логическая.
Физическая репликация
При физической репликации имеется две роли узлов кластера:
- мастер, который может выполнять как читающие, так и пишущие запросы клиентов;
- реплика.
В зависимости от настройки параметра hot_standby, реплика либо может выполнять читающие запросы, либо нет:
postgres=# \dconfig hot_standby
List of configuration parameters
Parameter | Value
-------------+-------
hot_standby | on
(1 row)
В данном случае — реплика будет отвечать на читающие запросы.
Физическая репликация проста и надежна, она строится на передаче по протоколу репликации (или иным способом) изменений, записываемых в журнал предзаписи WAL. На мастере производятся изменения данных, сведения о которых передаются по протоколу репликации на реплику. В свою очередь, реплика получает записи WAL и применяет их. Простота и эффективность сценария физической репликации связана с тем, что записи WAL никак не надо интерпретировать на реплике. Реплика их получает и применяет без какой-либо дополнительной обработки.
Будет ли работать физическая репликация, зависит от значения параметра wal_level:
postgres=# \dconfig wal_level
List of configuration parameters
Parameter | Value
-----------+---------
wal_level | replica
(1 row)
В современных версиях PostgreSQL значение по умолчанию для параметра wal_level — replica.
Для передачи WAL на мастере запускается специальный процесс walsender:
postgres=# SELECT pid, backend_type FROM pg_stat_activity WHERE backend_type ~ 'send';
pid | backend_type
--------+--------------
200730 | walsender
(1 строка)
А на стороне реплики — процессы приема WAL walreceiver и их применения startup:
postgres=# \c - - srv2
SSL-соединение (протокол: TLSv1.3, шифр: TLS_AES_256_GCM_SHA384, сжатие: выкл.)
Сейчас вы подключены к базе данных "postgres" как пользователь "postgres" (сервер "srv2": адрес "<IP-Address2>", порт "5433").
postgres=# SELECT pid, backend_type FROM pg_stat_activity WHERE backend_type ~ 'rece|star';
pid | backend_type
--------+--------------
111923 | startup
111931 | walreceiver
(2 строки)
Так как в СУБД Pangolin журнал предзаписи WAL единый для всех баз данных экземпляра, то реплицировать отдельную базу или таблицу невозможно.
Логическая репликация
В случаях, когда необходимо выполнить репликацию отдельных таблиц, применяют логическую репликацию. Логическая репликация требует установки параметра wal_level = logical.
Для логической репликации применяется тот же протокол, что и для физической. Но при логической репликации передаются совсем другая информация — о выполненных командах:
INSERTUPDATEDELETETRUNCATE
В логической репликации нет понятий мастер и реплика. Вместо этого есть публикации и подписки. Причем на одном и том же сервере одновременно могут быть и репликации и подписки. Начиная с 16-й версии PostgreSQL можно выполнять двунаправленную логическую репликацию.
На стороне публикации при выполнении команд DML изменения накапливаются, фильтруются и декодируются так, что их можно передать с помощью протокола репликации. На стороне подписки этот поток принимается, и принятые команды выполняются.
Физическая репликация удобна своей простотой и эффективностью, логическая значительно гибче.