4.8 KiB
Настройка 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
Готово! 🎉