Потоковая репликация
Для потоковой репликации необходимо настроить доступ к "архивам" мастера подчиненным-серверам. Они необходимы при запуске подчиненного сервера из 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;