2023-07-26 18:55:24 +03:00
---
title: Настройка физической репликации Postgres Pro
description: Потоковая репликация и репликация с архивом
date: 2022-11-25T16:51:00+05:00
tags: [linux, postgres, nfs]
---
2023-12-26 01:34:28 +03:00
2023-07-26 18:55:24 +03:00
## Установка Postgres Pro
2023-10-13 00:23:27 +03:00
Процесс установки описан в [этом посте ](/posts/postgres-pro-astra-se ).
2023-07-26 18:55:24 +03:00
## Потоковая репликация
Про различия в реализациях репликаций можно почитать вот [здесь ](//edu.postgrespro.ru/dba3/dba3_04_replica_physical.pdf ).
### Конфигурация master
#### Создание пользователя для репликации
2023-12-26 01:34:28 +03:00
```bash
su - postgres
2023-07-26 18:55:24 +03:00
psql -c "CREATE ROLE repuser WITH REPLICATION LOGIN ENCRYPTED PASSWORD '< password > ';"
```
#### Разрешение подключения для slave
2023-12-26 01:34:28 +03:00
2023-09-30 14:18:44 +03:00
Дописываем в конец файла `/var/lib/pgpro/std-*/data/pg_hba.conf` :
2023-07-26 18:55:24 +03:00
2023-10-08 23:18:25 +03:00
```config
2023-09-30 14:18:44 +03:00
host replication repuser < slave-ip > /32 md5
2023-07-26 18:55:24 +03:00
```
#### Реконфигурация
2023-12-26 01:34:28 +03:00
В файл `/var/lib/pgpro/std-*/data/postgresql.conf` необходимо добавить следующие строки:
2023-09-30 14:18:44 +03:00
2023-10-08 23:18:25 +03:00
```config
2023-07-26 18:55:24 +03:00
listen_addresses = 'localhost, < master-ip > '
wal_level = hot_standby
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 8
hot_standby = on
```
#### Перезапуск Postgres Pro
2023-09-24 18:58:33 +03:00
```shell
2023-09-30 14:18:44 +03:00
systemctl restart postgres*
2023-07-26 18:55:24 +03:00
```
### Настройка slave
#### Выгрузка файлов с master
2023-09-24 18:58:33 +03:00
```shell
2023-09-30 14:18:44 +03:00
rm -rf /var/lib/pgpro/std-*/data/*
pg_basebackup -P -R -X stream -c fast -h < master-ip > -U postgres -D /var/lib/pgpro/std-*/data
2023-07-26 18:55:24 +03:00
```
## Репликация с архивом
2023-12-26 01:34:28 +03:00
2023-07-26 18:55:24 +03:00
Настройка репликации с архивом выролняется с некоторыми отличиями от потоковой репликации:
### Развёртывание NFS
2023-12-26 01:34:28 +03:00
2023-10-13 00:23:27 +03:00
WAL-архивы будут складываться на NFS. Как сконфигурировать NFS написано [здесь ](/posts/linux-nfs ).
2023-07-26 18:55:24 +03:00
Необходимо смонтировать NFS на master и slave в одинаковые директории.
### Дополнение к реконфигурации
2023-12-26 01:34:28 +03:00
2023-09-30 14:18:44 +03:00
В файл `/var/lib/pgpro/std-*/data/postgresql.conf` необходимо добавить следующие строки:
2023-10-08 23:18:25 +03:00
```config
2023-07-26 18:55:24 +03:00
archive_command = 'test ! -f /nfs/%f & & cp %p /nfs/%f'
archive_cleanup_command = 'pg_archivecleanup -d /nfs %r 2>>cleanup.log'
```
## Синхронный и асинхронный режим репликации
2023-12-26 01:34:28 +03:00
2023-07-26 18:55:24 +03:00
При синхронной репликации, изменения применятся на основном сервере только после того, как они запишутся в WAL хотя бы одной реплики, а при асинхронной - сразу.
По умолчанию репликация работает в асинхронном режиме.
2023-09-30 14:18:44 +03:00
Для того, чтобы она работала в синхронном режиме, необходимо изменить две строки в конфигурационном файле Postgres Pro `/var/lib/pgpro/std-*/data/postgresql.conf` :
2023-10-08 23:18:25 +03:00
```config
2023-07-26 18:55:24 +03:00
synchronous_commit = on
synchronous_standby_names = 'pgsql_0_node_0'
```