# 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-сервера, описанные ранее.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kb.pvhostvm.ru/hostvm-vdi/hostvm-vdi-installation-guide/high-availability/db-replication/postgresql.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
