Настройка и виды репликаций Postgresql.
Write-Ahead Log (WAL)
Когда данные в базе меняются, они сначала записываются в WAL, после записи в WAL система делает системный вызов fsync
и данные записываются на диск, а не висят в кеше. Поэтому, если произойдёт выключение сервера или другой сбой, то при следующем включении СУБД во время старта прочитает данные из WAL и применит изменения к базе данных.
Потоковая репликация (Streaming Replication)
Суть в том, что записи из WAL передаются от мастер-сервера(master
) репликам(slave
). Запись и изменение данных происходит только в master
, но с реплик можно читать (hot standby). Если с реплики чтнение запрещено, то она называется warm standby или log shipping. Во многих приложениях очень много запросов на чтение (80% - 90%), поэтому репликация позволяет масштабировать базу данных горизонтально.
При потоковой репликации применение изменений происходит без понимания “смысла изменений”, поэтому важна двоичная совместимость между серверами. (одинаковые платформы и одинаковые мажорные версии
postgresql
)
Потоковая репликация бывает двух видов:
- синхронная
- асинхронная
При асинхронной репликации запись данных происходить сначала на master
, а потом, в фоне, отправляется на slave
. Минус в том, что будут потеряны данные, если на master
произойдёт сбой, а они ещё не доехали до slave
.
При использовании синхронной репликации данные сначала записываются в WAL любой реплики (если их несколько), а после чего транзакция выполняется на master
. Из-за такого подхода запросы на запись выполняются медленее из-за сетевых задержек. Рекомендуется использовать более одной реплики при таком подходе. К плюсам можно отнести то, что потерять данные становится сложнее.
Каскадная репликация - это когда у реплики есть свои реплики, с которыми она синхронизирует WAL.
master
~>slave
~>slave
Существует логическая репликация, которая доступна с 10й версии postgresql
.
При логической репликации на одном сервере создается публикация, другие серверы могут на нее подписаться. У сервера нет выделенной роли: один и тот же сервер может как публиковать изменения, так и подписываться на другие (или даже свои) подписки. Подписчику передается информация об изменениях строк в таблицах в платформонезависимом виде; двоичная совместимость не требуется. Для работы логической репликации в журнале публикующего сервера необходима дополнительная информация (параметр wal_level = logical). Логическая репликация позволяет транслировать не все изменения, а только касающиеся определенных таблиц.
Потоковая репликация на практике. Логическая репликация.
Установим postgresql
на обе виртуалки (debian 10):
master
- 192.168.122.181
slave
- 192.168.122.102
Создадиим файл с конфигурацией репозитория:
|
|
Импортируем ключ:
|
|
Обновим пакеты и установим postgresql
:
|
|
То же самое нужно повторить для второй виртуальной машины.
Создадим пользователя:
|
|
Настройка master
:
Посмотрим, где находятся конфиги postgresq
:
|
|
Редактируем следующие строки в файле /etc/postgresql/13/main/postgresql.conf
:
|
|
listen_addresses
- ip-адреса, на которых сервер будет слушать запросыpostgresql
wal_level
- указывает, сколько информации записывается в WALmax_wal_senders
- количество планируемых слейвовmax_replication_slots
- максимальное число слотов репликации (?)hot_standby
- значениеon
указывает, что есть возможность подключаться кpostgresql
для выполнения запросов в процессе восстановленияhot_standby_feedback
- значениеon
указывает, что сервер slave будет сообщать мастеру о запросах, которые он выполняет
Аутентификация клиентов управляется конфигурационным файлом /etc/postgresql/13/main/pg_hba.conf
. Добавим следующие строки в конец файла, это позвонит подключаться по паролю пользователю rep
:
|
|
Перезапускаем postresql
:
|
|
Настройка slave
:
Найдём конфиги:
|
|
Посмотрим, где лежит база данных:
|
|
Остановим сервис postgresql
:
|
|
Переместим папку со старой базой в сторону и создадим новую папку под базу с master
:
|
|
|
|
Реплицируем данные с master
:
|
|
Теперь редактируем конфиг файл /etc/postgresql/13/main/postgresql.conf
на slave
:
|
|
Запускаем:
|
|
Проверка репликации:
Статус репликации на master
:
|
|
Статус репликации на slave
:
|
|
Если создать базу на master
, она появится на slave
:
На master
:
|
|
На slave
:
|
|
Всё отлично. При создании базы на master
она появляется на slave
.
При удалении на master
- удаляется со slave
.