Настройка репликации#

See also

Оригинальная статья: https://www.dmosk.ru/miniinstruktions.php?mini=postgresql-replication

Создаём пользователя в PostgreSQL на Master#

Входим в систему под пользователем postgres:

su - postgres

Создаём нового пользователя для репликации:

createuser --replication -P repluser

Система запросит пароль — его нужно придумать и ввести дважды. В данном примере мы создаём пользователя repluser.

Выходим из оболочки пользователя postgres:

exit

Настраиваем Master#

Смотрим расположение конфигурационного файла postgresql.conf командой:

su - postgres -c "psql -c 'SHOW config_file;'"

Открываем конфигурационный файл postgresql.conf (тот, имя которого получили в выводе предыдущей команды):

vim /mnt/storage/pgsql/data/postgresql.conf

Редактируем следующие параметры:

listen_addresses = '*'
wal_level = replica
max_wal_senders = 2
max_replication_slots = 2
hot_standby = on
hot_standby_feedback = on

где:

*

IP-адрес сервера, на котором он будем слушать запросы Postgres, можно перечислить явно через запятую;

wal_level

указывает, сколько информации записывается в WAL (журнал операций, который используется для репликации);

max_wal_senders

количество планируемых слейвов;

max_replication_slots

максимальное число слотов репликации

Warning

Данный параметр не нужен для postgresql 9.2: с ним сервер не запустится!

hot_standby

определяет, можно или нет подключаться к postgresql для выполнения запросов в процессе восстановления;

hot_standby_feedback

определяет, будет или нет сервер slave сообщать мастеру о запросах, которые он выполняет.

Открываем конфигурационный файл pg_hba.conf — он находится в том же каталоге, что и файл postgresql.conf:

vim /mnt/storage/pgsql/data/pg_hba.conf

Добавляем следующие строки:

host replication repluser 127.0.0.1/32 md5
host replication repluser 192.168.1.1/32 md5
host replication repluser 192.168.1.2/32 md5

Данной настройкой мы разрешаем подключение к базе данных replication пользователю repluser с локального сервера (127.0.0.1 и 192.168.1.1) и сервера 192.168.1.2.

Hint

Лучше использовать не md5, а scram-sha-256.

Перезапускаем службу postgresql:

systemctl restart postgresql

Important

Обратите внимание, что название сервиса в системах Linux может различаться.

Настраиваем Slave#

Смотрим расположение папки данных postgresql:

su - postgres -c "psql -c 'SHOW data_directory;'"

Получаем: /mnt/storage/pgsql/data.

Также смотрим путь до конфигурационного файла postgresql.conf (нам это понадобится ниже):

su - postgres -c "psql -c 'SHOW config_file;'"

Останавливаем сервис postgresql:

systemctl stop postgresql

На всякий случай, создаём архив базы:

tar -czvf /tmp/data_pgsql.tar.gz \
  /mnt/storage/pgsql/data

Удаляем содержимое каталога с данными:

rm -rf /mnt/storage/pgsql/data/*

И реплицируем данные с master сервера.

а) Если у нас postgresql 9:

su -u postgres -с "pg_basebackup \
  -h 192.168.1.1 \
  -U repluser \
  -D /mnt/storage/pgsql/data \
  --xlog-method=stream 
  --write-recovery-conf"

где:

192.168.1.1

IP-адрес мастера;

/mnt/storage/pgsql/data

путь до каталога с данными.

б) Если у нас postgresql 10 и выше:

su - postgres -c "pg_basebackup 
  --host=192.168.1.1 \
  --username=repluser \
  --pgdata=/mnt/storage/pgsql/data \
  --wal-method=stream 
  --write-recovery-conf"

где:

192.168.1.1

IP-адрес мастера;

/mnt/storage/pgsql/data

путь до каталога с данными.

После ввода команды система запросит пароль для созданной ранее учётной записи repluser — вводим его. Начнётся процесс клонирования данных.

Открываем конфигурационный файл postgresql.conf на слейве, если явно указывали адреса, меняем:

vim /mnt/storage/pgsql/data/postgresql.conf

И редактируем следующие параметры:

listen_addresses = '*'

Снова запускаем сервис postgresql:

systemctl start postgresql