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