> For the complete documentation index, see [llms.txt](https://kb.pvhostvm.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kb.pvhostvm.ru/hostvm-vdi/hostvm-vdi-installation-guide/high-availability/db-replication/postgresql.md).

# PostgreSQL

Данное руководство описывает процесс создания отказоустойчивой конфигурации из двух экземпляров БД PostgreSQL с репликацией master - slave. Его можно использовать как для развертывания новой установки, так и для подключения второго сервера к уже имеющейся.\
Данная инструкция подходит как для репликации встроенной БД в appliance брокера, так и внешней БД, подключенной к нему.

### Действия перед настройкой <a href="#preparation" id="preparation"></a>

Подключитесь к консоли брокера VDI и остановите сервисы

```
systemctl stop vdi.service vdiweb.service
```

Подключитесь к БД и создайте резервную копию, указав:

* имя базы (по умолчанию udsdb)
* имя файла резервной копии (в примере - udsdb.bak)

```
# su - postgres
$ pg_dump udsdb > /tmp/udsdb.bak
$ exit
```

### Настройка Master-сервера <a href="#master-server" id="master-server"></a>

1. Подключитесь к master-серверу и откройте файл /etc/postgresql/13/main/pg\_hba.conf:

```
nano /etc/postgresql/13/main/pg_hba.conf
```

2. Добавьте следующую строку:

```
host    replication    postgres    REPLICA_IP/32    md5
```

3. Откройте файл /etc/postgresql/13/main/postgresql.conf:

```
nano /etc/postgresql/13/main/postgresql.conf
```

4. Найдите указанные ниже параметры, раскомментируйте их и измените следующим образом:

```
listen_addresses = 'localhost, MASTER_IP'
wal_level = hot_standby
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 8
hot_standby = on
```

5. Перезагрузите сервис:

```
service postgresql restart
```

### Настройка Replica-сервера <a href="#replica-server" id="replica-server"></a>

1. Подключитесь к replica-серверу и остановите сервис postgresql:

```
systemctl stop postgresql
```

2. Откройте файл /etc/postgresql/13/main/pg\_hba.conf:

```
nano /etc/postgresql/13/main/pg_hba.conf
```

3. Добавьте следующую строку:

```
host    replication    postgres    MASTER_IP/32    md5
```

4. Откройте файл /etc/postgresql/13/main/postgresql.conf:

```
nano /etc/postgresql/13/main/postgresql.conf
```

5. Найдите указанные ниже параметры, раскомментируйте их и измените следующим образом:

```
listen_addresses = 'localhost, REPLICA_IP'
wal_level = hot_standby
archive_mode = on
archive_command = 'cd .'
max_wal_senders = 8
hot_standby = on
```

6. Следующие операции выполняются от имени пользователя postgres:

```
su - postgres
```

7. Перейдите в каталог с базой данных:

```
cd /var/lib/postgresql/13/
```

8. Удалите каталог и снова создайте с корректными правами:

```
rm -rf main
mkdir main
chmod go-rwx main
```

9. Выгрузите БД с master-сервера:

```
pg_basebackup -P -R -X stream -c fast -h MASTER_IP -U postgres -D ./main
```

10. Вернитесь к root-пользователю и запустите сервис postgresql:

```
exit
systemctl start postgresql
```

### **Восстановление работы в случае сбоя** <a href="#crash-recovery" id="crash-recovery"></a>

Если был утрачен доступ к одному из серверов баз данных (либо из-за падения хоста виртуализации, на котором он размещен, либо из-за сбоя операционной системы), вы должны выполнить ряд действий.

В зависимости от того, какой сервер откажет (Master или Slave), задачи, которые необходимо выполнить, как для непрерывности работы службы HOSTVM VDI, так и для того, чтобы располагать действующей репликой, будут следующими:

#### **Master (основной узел)** <a href="#master" id="master"></a>

Если основной сервер базы данных (Master) откажет или будет потерян, доступ к окружению VDI будет утрачен. Вам придется вручную подключить иной HOSTVM VDI сервер к вторичной базе данных (Slave), в которой содержится вся информация VDI окружения до момента падения основного сервера.

Подключить новую базу данных можно, отредактировав файл конфигурации на машинах VDI-серверов (данное действие должно быть выполнено на всех VDI-серверах) и указав параметры новой базы данных. Файл конфигурации расположен по следующему пути машины VDI-сервера:

```
/var/server/server/settings.py
```

Когда IP адрес или имя хоста новой базы данных будут изменены, необходимо перезапустить сервер. Данное действие должно быть выполнено на всех машинах VDI-серверов.\
\
Также необходимо перевести Slave в режим записи, для этого выполните на Replica-сервере команду:

```
/usr/lib/postgresql/13/bin/pg_ctl promote -D 
/var/lib/postgresql/13/main
```

После выполнения данных действий доступ к VDI окружению будет восстановлен.

После этого необходимо перенастроить систему другой машины для репликации базы данных. Есть несколько вариантов выполнения данной настройки, включая следующие:

* Настройка текущей машины базы данных как Master и создание новой машины с репликой, которую нужно сконфигурировать и выполнить инструкцию по настройке Replica-сервера.
* Непосредственно создать бэкап машины с текущей базой данных (предварительно необходимо остановить все машины VDI-сервера). Необходимо создать новую машину выполняющую роль Мастера базы данных, восстановить на ней бэкап и заново выполнить конфигурацию репликации.

#### <mark style="color:red;">**ПРИМЕЧАНИЕ:**</mark>

Для того чтобы предотвратить потерю данных, перед выполнением восстановления рекомендуется создать резервную копию базы данных. При создании резервной копии необходимо, чтобы все машины VDI-сервера были выключены.

#### **Slave (вторичный узел)** <a href="#slave" id="slave"></a>

В случае отказа или утраты доступа к вторичному серверу базы данных (Slave), доступ к VDI окружению потерян не будет, но необходимо выполнить действия по настройке Replica-сервера, описанные ранее.
