Files
Ubuntu_docs/PostgreSQL/PostgreSQL_replication_synchronous.md
2025-05-15 09:04:57 +05:00

4.7 KiB
Raw Permalink Blame History

Настройка PostgreSQL в синхронном режиме репликации

Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики.


1. Подготовка серверов

Допустим, у нас есть:

  • Основной сервер (Primary): 192.168.1.1
  • Реплика (Standby): 192.168.1.2

Убедитесь, что PostgreSQL установлен на обоих серверах.


2. Настройка основного сервера (Primary)

2.1 Разрешаем подключение реплики

Редактируем postgresql.conf:

sudo nano /etc/postgresql/15/main/postgresql.conf

Добавляем/изменяем параметры:

wal_level = replica
synchronous_commit = on
synchronous_standby_names = 'replica1'
max_wal_senders = 3
wal_keep_size = 256MB
hot_standby = on

Редактируем pg_hba.conf, добавляя доступ для реплики:

sudo nano /etc/postgresql/15/main/pg_hba.conf

Добавляем строку:

host replication replicator 192.168.1.2/32 md5

2.2 Создаем пользователя для репликации

CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';

2.3 Перезапускаем PostgreSQL

sudo systemctl restart postgresql

3. Настройка реплики (Standby)

3.1 Останавливаем PostgreSQL на реплике

sudo systemctl stop postgresql

3.2 Копируем данные с основного сервера

На реплике выполняем:

sudo -u postgres pg_basebackup -h 192.168.1.1 -U replicator -D /var/lib/postgresql/15/main -Fp -Xs -R -P

3.3 Указываем application_name вручную

Файл postgresql.auto.conf, создаваемый pg_basebackup, не добавляет application_name, поэтому задаем его вручную:

sudo su postgres -c "psql -c \"ALTER SYSTEM SET primary_conninfo TO 'host=192.168.1.1 user=replicator password=your_password application_name=replica1';\""

Затем перезапускаем PostgreSQL на реплике:

sudo systemctl restart postgresql

3.4 Проверяем primary_conninfo

cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo

Ожидаемый результат:

primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'

Если строка отсутствует, редактируем файл вручную:

sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf

Добавляем строку:

primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1'

Сохраняем и перезапускаем PostgreSQL:

sudo systemctl restart postgresql

4. Обновляем настройки Primary для работы с репликой

На основном сервере (Primary) выполняем:

sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\""

Перезапускаем PostgreSQL на Primary:

sudo systemctl restart postgresql

5. Проверка работы синхронной репликации

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

На основном сервере (Primary) выполняем:

SELECT application_name, sync_state FROM pg_stat_replication;

Ожидаемый результат:

 application_name | sync_state  
-----------------+------------
 replica1        | sync

Если sync_state = 'sync', значит синхронная репликация работает.


6. Итоговая проверка

Задали primary_conninfo вручную на реплике
Перезапустили PostgreSQL на реплике
Обновили synchronous_standby_names на основном сервере
Перезапустили PostgreSQL на основном сервере
Проверили pg_stat_replication на Primary

Готово! 🎉