PostgreSQL | Physical replication

4 Created on 14 April 2025 at 13:08
  It     Linux     Postgresql  

WAL (Write-Ahead Logging) — механизм ведения журнала изменений, на основе которого работает репликация.

  • Во избежание нарушений целостности в структуре баз данных, PostgreSQL сначала записывает эти изменения в файлы журнала WAL и только потом в базу.

Виды

В PostgreSQL существует два основных вида репликации: физическая и логическая.

Физическая

При физической репликации на сервер реплики передается поток WAL записей.

Преимущества: * Простота настройки: это побайтовая копия всей базы данных. * Минимальная нагрузка на ресурсы: идет поток WAL-записей (журналов транзакций), а не обработка каждого запроса. * Транзакционная целостность: копия всегда идентична мастеру.

Такие преимущества более требовательны к системе и урезают функционал реплики:

  • Мастер и реплика должны иметь одинаковые: версии PostgreSQL, архитектуру процессора и операционную систему.
  • Репликация всего кластера: нельзя реплицировать выборочно таблицы.
  • Реплика полностью зеркалит мастер: любые изменения берутся только с мастера.

Физическая репликация применяется для реализации отказоустойчивости или горизонтального масштабирования:

  • Мастер база используется только для записи, а операции чтения происходят с реплик.
  • Так как реплики полностью зеркалят мастер сервер базы данных, можно сделать быстрый откат, в случае аварии на мастер базе.

Логическая

Логическая репликация используется механизм публикаций и подписок.

  • Мастер (поставщик) публикует изменения (INSERT/UPDATE/DELETE).
  • Реплика (подписчик) получает и применяет их у себя, по таблицам.

Преимущества:

  • Выборочная репликация: можно реплицировать только нужные таблицы.
  • Разные системы: мастер и реплика могут быть на разных ОС или даже архитектурах.
  • Двусторонняя репликация: можно настроить репликацию в обе стороны.
  • Пишущая реплика: можно выполнять запись на подписчике в нереплицируемые таблицы.

Логическая репликация более сложна в настройке и потребляет больше ресурсов машины.

Физическая репликация

Настройка Master

Сначала нужно настроить master сервер СУБД, чтобы он мог работать с репликациями.

Нужно раскомментировать и добавить нужные значения в основной файл конфигурации /etc/postgresql/<version>/main/postgresql.conf:

wal_level = replica
max_wal_senders = 10
wal_keep_size = 64
hot_standby = on

  • Эти параметры нужны, чтобы PostgreSQL начал хранить WAL-файлы, нужные для репликации.

Не стоит забывать настроить listen_addresses, если обращения в базу будут идти извне.

Также стоит указать сеть и или конкретные адреса хостов, кто может коннектиться к базе в pg_hba.conf.

  • По умолчанию, PostgreSQL настраивает взаимодействие только на loopback интерфейсе.

Далее в pg_hba.conf нужно разрешить подключения от реплик.

  • Допустим реплики имеют адреса: 192.168.0.101 и 192.168.0.102.

host    replication     replicator     192.168.0.101/32     md5
host    replication     replicator     192.168.0.102/32     md5

  • replicator — это имя репликационного пользователя, которого нужно создать следующим шагом.
  • md5 — аутентификация будет производиться через пароль.

Далее нужно создать пользователя для репликации.

su postgres psql

CREATE ROLE replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'pass';

Минимальная настройка master сервера завершена и можно перезапустить сервис:

sudo systemctl restart postgresql

Настройка Replica

Как известно, /var/lib/postgresql/<version>/main/ это pg_data, директория которая содержит основные данные кластера баз данных PostgreSQL.

Нужно остановить СУБД и удалить все данные pg_data у реплики, так как она должна полностью соответствовать мастеру:

sudo rm -rf /var/lib/postgresql/<version>/main

Затем нужно скопировать все данные из мастер сервера в эту pg_data директорию реплики:

sudo PGPASSWORD=pass pg_basebackup -h 192.168.0.100 -D /var/lib/postgresql/<version>/main -U replicator -Fp -Xs -P

  • -h — адрес мастер сервера.
  • -D — назначение, куда будут скопированы файлы.
  • -U — имя пользователя, у которого есть права делать резервное копирование, чтобы войти в мастер.
  • -Fp — формат вывода plain — обычные файлы базы данных, а не tar-архивы.
  • -Xs — параметр определяет, что делать с WAL (журналами транзакций) во время бэкапа: s означает, что они будут стримиться (stream) во время копирования — нужно для корректной работы репликации.
  • -P — показывает индикатор прогресса в консоли во время копирования. Удобно видеть, что происходит.
  • Важно! После копирования нужно удостовериться, что директория pg_data принадлежит postgres, а не суперпользователю.

sudo touch /var/lib/postgresql/<version>/main/standby.signal — создать файл standby, чтобы текущий сервер понимал, что он реплика.

Затем в файле /etc/postgresql/<version>/main/postgresql.conf на реплике нужно добавить данные мастер сервера:

primary_conninfo = 'host=192.168.0.100 port=5432 user=replicator password=pass'

Не стоит забывать настроить listen_addresses, если обращения в базу будут идти извне.

Также стоит указать сеть и или конкретные адреса хостов, кто может коннектиться к базе в pg_hba.conf.

  • По умолчанию, PostgreSQL настраивает взаимодействие только на loopback интерфейсе.

Минимальная настройка завершена, теперь можно запустить СУБД:

sudo systemctl start postgresql

Проверка репликаций

Нужно войти на мастер сервер СУБД и запросить:

SELECT * FROM pg_stat_replication;

  • Покажет все активные серверы реплики.