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

Создано: 04.02.2015 21:11

Для потоковой репликации необходимо настроить доступ к "архивам" мастера подчиненным-серверам. Они необходимы при запуске подчиненного сервера из offline-состояния. Репликация же будет работать на основе стандартного протокола PostgreSQL через порт базы данных инстанса, но для репликации необходимо будет сделать соответствующие разрешения для подчиненных в hba и создать пользователя из под которого будет работать репликация.

Если все делать правильно то отключать мастер нет необходимости!

Каталог файлов архивов

Каталог создаем на всех серверах для упрощения с одним и тем же названием. Во многих примерах его с мастера подключают по NFS или держат для архивов отдельный хост. Это может быть выгодным, но я решил создавать копии архивов на всех хостах что повысит независимость хостов кластера в случае сбоев. На мастере в этот каталог PostgreSQL будет копировать архивы и rsync демон будет обеспечивать доступ к этому каталогу со слейвов. Слейвы будут в этот каталог копировать архивы загруженные с мастера.

mkdir /archives
chown postgres:postgres /archives

Настройка мастера

Rsyncd для доступа слейвов к архивам (только со слейвов)
/etc/rsyncd.conf

max connections = 5
use chroot = yes
read only = yes

[postgres]
        path = /archives
        comment = PostgreSQL rep
        hosts allow = 172.17.5.6
        uid = postgres
        gid = postgres

Не забываем включить демон в /etc/default/rsync и запустить его

Настройка PostgreSQL

Натсройки идентичны на всех серверах. Ниже только параметры имеющие отношение к репликации

wal_level                 = hot_standby
hot_standby               = on
max_wal_senders           = 5
wal_keep_segments         = 32
archive_mode              = on
archive_command           = 'cp %p /archives/%f'
synchronous_standby_names = 'cluster-test1'

synchronous_standby_names только для синхронной репликации (не советую, если не понимаете что именно она вам нужна)

Пользователь на мастере для репликации

CREATE USER replication WITH REPLICATION  PASSWORD 'replication';

Копирование данных на подчиненных

Архивы запустят базу только при условии что в ней уже есть данные (копия) с мастера. Потому для начала их нужно с мастера скопировать. Есть куча способов но мне понравился pg_basebackup

/etc/init.d/postgresql stop
rm -rf /var/lib/postgresql/9.3/main
su - postgres -c 'pg_basebackup -R -D /var/lib/postgresql/9.3/main -X stream  --host=v4.n148.cslab --port=5432 -U replication -W'

pg_basebackup сам настроит файл настройки подчиненного сервера /var/lib/postgresql/9.3/main/recovery.conf, но его желательно подправить. Желательно что бы он был вида

standby_mode = 'on'
primary_conninfo = 'user=replication password=replication host=v4.n148.cslab port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
restore_command = 'rsync -z rsync://v4.n148.cslab:/postgres/%f %p'
trigger_file = '/tmp/trig_f_newcluster'

Где v4.n148.cslab это мой мастер, а trigger_file содержит имя файла при наличии которого подчиненный станет ВРЕМЕННЫМ мастером и не будет возвращать ошибки при операциях записи.

При настройке синхронной репликации файл recovery.conf должен содержать имя приложения application_name в директиве primary_conninfo

Можно запускать слейв

/etc/init.d/postgresql start

Проверяем репликацию

SELECT application_name,client_addr,sync_state from pg_stat_replication;

postgresql replication