береженого кольт бережет
береженого кольт бережет

Потоковая репликация PostgreSQL

Потоковая репликация (Streaming Replication) — это репликация, при которой от основного сервера PostgreSQL на реплики передается WAL (Write Ahead Log). И каждая реплика затем по этому журналу изменяет свои данные. Для настройки такой репликации все серверы должны быть одной версии, работать на одной ОС и архитектуре.

Шаги настройки:

Настройка master-сервера
Настройка доп. сервера (slave)
Тестирование репликации
Все действия в инструкции выполняются на PostgreSQL 14 и Ubuntu 20.04, но в целом инструкция актуальная для предыдущих (и возможно будущих) версий. Есть некоторые отличия версия PostgreSQL до 12 версии, о них смотрите в документации.

В нашем примере у нас будут два сервера:

Основной (master) с адресом 192.168.233.140
Дополнительный (slave) с адресом 192.168.233.141


Поехали!

Настройка master-сервера
Первым делом открываем «postgresql.conf» и изменяем в нем параметры.

# Определяет как много информации записывать в WAL. 
# Со значением replica в журнал записываются данные для поддержки архивирования WAL и репликации.
# В т.ч. для запросов только на чтение.
# wal_level = hot_standby - для версий до 9.6
# https://www.postgresql.org/docs/9.6/runtime-config-wal.html
wal_level = replica

# Число одновременных подключений для резервных серверов. Жалательно установить на 1 подключение
# больше, чем фактическое количество резервных серверов, т.к. в случае неожиданного отключения
# старое соединение будет некоторое время использоваться.
# https://www.postgresql.org/docs/9.4/runtime-config-replication.html
max_wal_senders = 10

# Задает минимальный размер в мегабайтах сегментов файлов журнала, хранящихся в каталоге pg_wal, на случай,
# если резервному серверу потребуется извлечь их для потоковой репликации.
# В ранних версиях параметр назывался wal_keep_segments и указывал количество файлов, а не их размер.
# https://www.postgresql.org/docs/13/runtime-config-replication.html
wal_keep_size = 1024

Создадим пользователя replication, чтобы через него дополнительный сервер мог подключаться к основному.

sudo -u postgres psql
CREATE ROLE replication WITH REPLICATION PASSWORD '<superpassrowd>' LOGIN;

В файле pg_hba.conf разрешаем подключение этому пользователю.

# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    replication     replication     192.168.233.0/24         md5


И перезапускаем PostgreSQL.

systemctl restart postgresql

Настройка доп. сервера (slave)

Останавливаем PostgreSQL.

systemctl stop postgresql

Очищаем всё, что внутри data_directory, т.к. мы скопируем эти файлы с основного сервера.

rm -Rf /var/lib/pgsql/data/*

Копируем текущее состояние с основного сервера на дополнительный.

# В предыдущих версиях параметр wal-method=stream назывался xlog-method=stream,
# поэтому смотрите документацию для вашей версии PostgreSQL.
su postgres -c "pg_basebackup -h 192.168.233.140 -D /var/lib/pgsql/data -P -U replication --wal-method=stream"

Далее вносим изменения в файл postgresql.conf.

# Создает возможность выполнять запросы в момент восстановления транзакций.
# https://www.postgresql.org/docs/9.0/hot-standby.html
hot_standby = on

# Строка подключения к основному серверу
# https://www.postgresql.org/docs/12/runtime-config-replication.html
primary_conninfo = 'user=replication password=<superpassrowd> host=192.168.233.140 port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'

Чтобы репликация заработала, также в каталоге с данными (обычно где файл конфигурации сервера) нужно создать файл standby.signal.

touch standby.signal
chown postgres:postgres standby.signal

Теперь все готово для запуска службы!

systemctl start postgresql

Тестирование репликации

Создадим на основном сервере базу AmazingReplication, а в ней таблицу «TestReplication».

CREATE TABLE "TestReplication" ("SomveValue" varchar(100));
INSERT INTO "TestReplication" VALUES ('test 1');
INSERT INTO "TestReplication" VALUES ('test 2');
INSERT INTO "TestReplication" VALUES ('test 3');

Практически сразу на дополнительном сервере появится эта база данных и можно выполнить запрос.

select
    *
from "TestReplication"

В результате мы должны получить три записи, которые мы добавили выше. Если так — то дело сделано. А если нет, то Вам путь в логи сервера PostgreSQL для поиска проблем.

Вместо заключения

PostgreSQL имеет множество механизмов репликации данных, которые позволяют организовать горизонтальное масштабирование, повысить уровень отказоустойчивости и так далее. Мы рассмотрели простую настройку потоковой репликации, которая чем-то похожа на механизм групп высокой доступности AlwaysOn в SQL Server. Различний, конечно, очень много. Как и нюансов работы, но принцип тот же — передача записей лога транзакций на реплики.

Другая информация по PostgreSQL может быть найдена в этом репозитории.

Полезные материалы