diff --git a/PostgreSQL_replication_synchronous.md b/PostgreSQL_replication_synchronous.md new file mode 100644 index 0000000..7d0e3c0 --- /dev/null +++ b/PostgreSQL_replication_synchronous.md @@ -0,0 +1,137 @@ +# Настройка 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** + +Готово! 🎉 +