Merge branch 'master' of https://git.dirt.kz/igor/Ubuntu_docs
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