+
This commit is contained in:
137
PostgreSQL_replication_synchronous.md
Normal file
137
PostgreSQL_replication_synchronous.md
Normal file
@ -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**
|
||||||
|
|
||||||
|
Готово! 🎉
|
||||||
|
|
||||||
Reference in New Issue
Block a user