Репликация Postgresql 11.2 в режиме Master-> Slave

Задачка довольно типовая, но мы немного усложним условия и сделаем репликацию двух инстансов Postgresql завернутых в Docker.

Операции на мастер-хосте

Первым делом создаем пользователя от имени которого будет осуществляться репликация.

# docker exec -it postgresql /bin/bash
# su postgres
$ psql
postgres=# CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD ‘P@SSWORD’;
postgres=# \q
/ $ exit
# exit

В файле pg_hb.conf разрешаем подключения этому пользователю с хоста где будет распологаться реплика.

host  replication   replica_user  10.77.111.108/32   md5

В конфигурационный файл вносим правки.

wal_level = logical
wal_log_hints = on

Так-как мы используем контейнер, по reload и аналогично restart для службы сервера postgresql производится немного иначе.

# docker exec -it postgresql /bin/bash
# su postgres
$ pg_ctl reload

Операции на slave-хосте

Останавливаем контейнер с postgresql, запускаем в интерактивном режиме, удаляем существующую базу и командой pg_basebackup копируем базу с мастер-узла, после чего запускаем контейнер. Обратите внимание, что вместо команды docker-compose я буду использовать алиас dc.

# dc stop postgresql
# dc run postgresql /bin/bash
# rm -rf /var/lib/postgresql/data/*
# pg_basebackup -h 10.51.0.100 -U replica_user -X stream -C -S replica_1 -v -R -W -D /var/lib/postgresql/data/
# exit
# dc start postgresql

Проверяем статус репликации

bash-4.4# su postgres
/ $ psql
psql (11.2)
Type “help” for help.postgres=# SELECT client_addr, state FROM pg_stat_replication;
client_addr  |   state
—————+———–
10.77.111.108 | streaming
(1 row)

Опционально создаем общее хранилище WAL-файлов

Создаем общее файловое NFS-хранилище по инструкции “Настройка NFS клиент-сервер в CentOS” и смонтировано оно будет в каталог /mnt/nfs где создадим подкаталог /mnt/nfs/wal.

Добавляем тома монтирования в контейнер.

volumes:
– /mnt/nfs/wal:/wal

В конфигурацию мастер ноды добавляем параметры.

archive_mode = on
archive_command = ‘test ! -f /mnt/nfs/wal/%f && cp %p /mnt/nfs/wal/%f’

В конфигурацию slave ноде докидываем параметры на восстановление и очистку старых архивов.

restore_command = ‘cp /mnt/nfs/wal/%f %p’
archive_cleanup_command = ‘pg_archivecleanup  /mnt/nfs/wal/ %r’

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *