# Настройка PostgreSQL в синхронном режиме репликации Синхронная репликация в PostgreSQL гарантирует, что данные записываются на реплику перед подтверждением транзакции на основном сервере (Primary). Это повышает надежность, но может замедлить запись из-за необходимости ожидания отклика реплики. --- ## **1. Подготовка серверов** Допустим, у нас есть: - **Основной сервер (Primary):** `192.168.1.1` - **Реплика (Standby):** `192.168.1.2` Убедитесь, что PostgreSQL установлен на обоих серверах. --- ## **2. Настройка основного сервера (Primary)** ### **2.1 Разрешаем подключение реплики** Редактируем `postgresql.conf`: ```sh sudo nano /etc/postgresql/15/main/postgresql.conf ``` Добавляем/изменяем параметры: ```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`, добавляя доступ для реплики: ```sh sudo nano /etc/postgresql/15/main/pg_hba.conf ``` Добавляем строку: ```conf host replication replicator 192.168.1.2/32 md5 ``` ### **2.2 Создаем пользователя для репликации** ```sql CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password'; ``` ### **2.3 Перезапускаем PostgreSQL** ```sh sudo systemctl restart postgresql ``` --- ## **3. Настройка реплики (Standby)** ### **3.1 Останавливаем PostgreSQL на реплике** ```sh sudo systemctl stop postgresql ``` ### **3.2 Копируем данные с основного сервера** На реплике выполняем: ```sh 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`, поэтому задаем его вручную: ```sh 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 на реплике: ```sh sudo systemctl restart postgresql ``` ### **3.4 Проверяем `primary_conninfo`** ```sh cat /var/lib/postgresql/15/main/postgresql.auto.conf | grep primary_conninfo ``` Ожидаемый результат: ```ini primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1' ``` Если строка отсутствует, редактируем файл вручную: ```sh sudo nano /var/lib/postgresql/15/main/postgresql.auto.conf ``` Добавляем строку: ```ini primary_conninfo = 'host=192.168.1.1 user=replicator password=your_password application_name=replica1' ``` Сохраняем и перезапускаем PostgreSQL: ```sh sudo systemctl restart postgresql ``` --- ## **4. Обновляем настройки Primary для работы с репликой** На основном сервере (Primary) выполняем: ```sh sudo su postgres -c "psql -c \"ALTER SYSTEM SET synchronous_standby_names TO 'replica1';\"" ``` Перезапускаем PostgreSQL на Primary: ```sh sudo systemctl restart postgresql ``` --- ## **5. Проверка работы синхронной репликации** ### **5.1 Проверяем статус репликации** На **основном сервере (Primary)** выполняем: ```sql 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** Готово! 🎉