Перейти к основному содержимому

Дружественное напоминание

Репликация​

В 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.

Для логической репликации применяется тот же протокол, что и для физической. Но при логической репликации передаются совсем другая информация — о выполненных командах:

  • INSERT
  • UPDATE
  • DELETE
  • TRUNCATE

В логической репликации нет понятий мастер и реплика. Вместо этого есть публикации и подписки. Причем на одном и том же сервере одновременно могут быть и репликации и подписки. Начиная с 16-й версии PostgreSQL можно выполнять двунаправленную логическую репликацию.

На стороне публикации при выполнении команд DML изменения накапливаются, фильтруются и декодируются так, что их можно передать с помощью протокола репликации. На стороне подписки этот поток принимается, и принятые команды выполняются.

Физическая репликация удобна своей простотой и эффективностью, логическая значительно гибче.