Задачка довольно типовая, но мы немного усложним условия и сделаем репликацию двух инстансов Postgresql завернутых в Docker.
Операции на мастер-хосте
Первым делом создаем пользователя от имени которого будет осуществляться репликация.
# su postgres
$ psql
postgres=# CREATE ROLE replica_user WITH REPLICATION LOGIN PASSWORD ‘P@SSWORD’;
postgres=# \q
/ $ exit
# exit
В файле pg_hb.conf разрешаем подключения этому пользователю с хоста где будет распологаться реплика.
В конфигурационный файл вносим правки.
wal_log_hints = on
Так-как мы используем контейнер, по reload и аналогично restart для службы сервера postgresql производится немного иначе.
# su postgres
$ pg_ctl reload
Операции на slave-хосте
Останавливаем контейнер с postgresql, запускаем в интерактивном режиме, удаляем существующую базу и командой pg_basebackup копируем базу с мастер-узла, после чего запускаем контейнер. Обратите внимание, что вместо команды docker-compose я буду использовать алиас dc.
# 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
Проверяем статус репликации
/ $ 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.
Добавляем тома монтирования в контейнер.
– /mnt/nfs/wal:/wal
В конфигурацию мастер ноды добавляем параметры.
archive_command = ‘test ! -f /mnt/nfs/wal/%f && cp %p /mnt/nfs/wal/%f’
В конфигурацию slave ноде докидываем параметры на восстановление и очистку старых архивов.
archive_cleanup_command = ‘pg_archivecleanup /mnt/nfs/wal/ %r’