Новые каталоги

This commit is contained in:
Igor I
2025-05-15 09:04:57 +05:00
parent aa0179f6c0
commit 7380add41d
14 changed files with 1728 additions and 1673 deletions

View 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**
Готово! 🎉