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

138 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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