PostgreSQL | Physical replication
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;
- Покажет все активные серверы реплики.