# Приложение. Тестовое окружение

Индекс LLMS: [llms.txt](/ru/llms.txt)

---

<span id="mon-appendix-a" class="pdf-anchor"></span><span id="pdf-page-236" class="pdf-anchor"></span>

В этом приложении содержится руководство по запуску и использованию тестового окружения. Это окружение необязательно для понимания книги, но может быть полезно в процессе прочтения. В окружении можно воспроизвести все приводимые в книге примеры и поставить любые эксперименты, связанные с мониторингом.

<span id="mon-section-star-162" class="pdf-anchor"></span>

## Общая информация {#mon-p236-h267}

Окружение представляет собой установку на основе docker-контейнеров. В состав установки входят:

- Кластер потоковой репликации PostgreSQL из двух узлов. Кластер необходим для демонстрации средств и способов мониторинга репликации.

- Экспортер метрик pgSCV. Это агент мониторинга, собирающий статистику с узлов PostgreSQL и предоставляющий ее в формате Prometheus. Агент мониторинга является экспериментальным продуктом и не рекомендуется для производственного применения.

- Система мониторинга на основе Victoriametrics и Vmagent. Система мониторинга собирает метрики с агента pgSCV и хранит их в течение двух дней.

- Приложения на основе утилиты pgbench, создающие рабочую нагрузку. В установке запущено несколько экземпляров pgbench, задача которых — создавать постоянную динамическую нагрузку на кластер PostgreSQL.

- Система визуализации Grafana. Используется как фронтенд для системы мониторинга и позволяет создавать самые разные графики с богатой настраиваемостью.

<span id="mon-section-star-163" class="pdf-anchor"></span>

## Зависимости {#mon-p236-h571}

Убедитесь, что в системе, где будет запускаться тестовое окружение, установлены следующие инструменты:

- Docker-compose версии ⩾ 1.29.2;

- Docker Engine версии ⩾ 20.10.12;

- GNU Make версии ⩾ 4.2.1.

<span id="pdf-page-237" class="pdf-anchor"></span>

Работа тестового окружения с более старыми версиями не гарантируется.

Установку docker-compose можно выполнить по официальной инструкции, находящейся по адресу [docs.docker.com/compose/install/](<https://docs.docker.com/compose/install/>). Docker Engine также устанавливается по официальной инструкции: [docs.docker.com/engine/install/#server](<https://docs.docker.com/engine/install/#server>). Пакет GNU Make может быть установлен пакетным менеджером из официального репозитория пакетов для вашей операционной системы.

Когда все зависимости установлены, можно перейти к запуску окружения.

<span id="mon-section-star-164" class="pdf-anchor"></span>

## Запуск окружения {#mon-p237-h231}

Работа с базовыми командами доступна через Makefile, но пользователь может выполнять и другие команды, напрямую вызывая утилиты docker и docker-compose.

Выполните следующие команды, чтобы перейти в каталог тестового окружения и затем посмотреть справку по доступным целям make:

```text {label="shell" .source-commands hl_lines="1 2 3"}
$ git clone https://github.com/lesovsky/postgresql-monitoring-book.git
$ cd postgresql-monitoring-book/playground
$ make help
Makefile available targets:
* help         Display this help screen
* up           Start playground environment
* ps           Show current status of playground services
* down         Stop playground environment (without cleanup)
* destroy      Stop playground environment and clean up related resources
* %/logs       Show service logs; % - service name, e.g. primary or standby
* %/logs/tail  Tail service logs; % - service name, e.g. primary or standby
* %/shell      Start shell session; % - service name, e.g. primary or standby
* %/psql       Start psql session; % - service name, e.g. primary or standby
* %/pgcenter   Start pgcenter session; % - service name, e.g. primary or standby
```

Цели make предоставляют короткий способ запуска и остановки тестового окружения и подключения к службам в контейнерах. Это будет необходимо для дальнейшей работы. При выполнении целей в самой первой строке будет выводиться команда, которую можно выполнить без использования Makefile.

Запустите тестовое приложение:

```text {label="shell" .source-commands hl_lines="1"}
$ make up
```

При первом запуске выполняются сборка контейнеров, инициализация служб и загрузка данных в тестовую базу (~300 МБ). Процедура может занять некоторое время, оно зависит от производительности устройства.

<span id="pdf-page-238" class="pdf-anchor"></span><span id="mon-section-star-165" class="pdf-anchor"></span>

## Общая проверка работоспособности {#mon-p238-h76}

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

```text {label="shell" .source-commands hl_lines="1"}
$ make ps
docker-compose ps
NAME                         COMMAND                   SERVICE          STATUS     PORTS
playground-app1-1            "docker-entrypoint.s…"   app1             running    5432/tcp
playground-app2-1            "docker-entrypoint.s…"   app2             running    5432/tcp
playground-app3-1            "docker-entrypoint.s…"   app3             running    5432/tcp
playground-app4-1            "docker-entrypoint.s…"   app4             running    5432/tcp
playground-grafana-1         "/run.sh"                 grafana          running    0.0.0.0:3000->3000/tcp
playground-pgscv-1           "pgscv"                   pgscv            running    0.0.0.0:9890->9890/tcp
playground-primary-1         "docker-entrypoint.s…"   primary          running    5432/tcp
playground-standby-1         "/docker-entrypoint.…"   standby          running    5432/tcp
playground-victoriametrics-1 "/victoria-metrics-p…"   victoriametrics  running    8428/tcp
playground-vmagent-1         "/vmagent-prod -prom…"   vmagent          running    8429/tcp
```

Все контейнеры должны быть в состоянии `running` (поле `STATUS`). Обе службы БД должны показывать готовность принимать клиентские подключения. Репликация между узлами также должна работать. Проверить журнал сообщений основного узла можно так:

```text {label="shell" .source-commands hl_lines="1"}
$ make primary/logs
...
primary_1 | 2022-03-03 08:57:44 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
primary_1 | 2022-03-03 08:57:44 UTC [1] LOG: listening on IPv6 address "::", port 5432
primary_1 | 2022-03-03 08:57:44 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
primary_1 | 2022-03-03 08:57:44 UTC [63] LOG: database system was shut down at 2022-03-03 08:57:44 UTC
primary_1 | 2022-03-03 08:57:44 UTC [1] LOG: database system is ready to accept connections
```

Аналогичный способ для резервного узла:

```text {label="shell" .source-commands hl_lines="1"}
$ make standby/logs
...
standby_1 | 2022-03-03 08:57:50 UTC [24] LOG: consistent recovery state reached at 0/11000100
standby_1 | 2022-03-03 08:57:50 UTC [1] LOG: database system is ready to accept read-only connections
standby_1 | 2022-03-03 08:57:50 UTC [28] LOG: started streaming WAL from primary at 0/12000000 on timeline 1
```

Теперь в качестве проверки работоспособности начнем сеанс с основным узлом кластера:

```text {label="shell" .source-commands hl_lines="1"}
$ make primary/psql
psql (15.0)
Type "help" for help.
```

```text {label="text"}
postgres=#
```

<span id="pdf-page-239" class="pdf-anchor"></span>

В открывшемся сеансе мы можем отправлять SQL-запросы к серверу:

```text {label="psql" .source-commands hl_lines="1 3"}
postgres=# SELECT * FROM pg_stat_activity;
...
postgres=# SELECT * FROM pg_stat_replication;
...
```

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

В книге все запросы выполняются на основном узле, если это специально не оговорено.

<span id="mon-section-star-166" class="pdf-anchor"></span>

## Grafana {#mon-p239-h284}

Фронтенд Grafana доступен по адресу [127.0.0.1:3000](<http://127.0.0.1:3000>). Логин и пароль для входа не требуются. Для построения графиков можно использовать режим Explore или создать отдельный набор панелей и добавлять панели с графиками в него.

<span id="mon-section-star-167" class="pdf-anchor"></span>

## Остановка и удаление {#mon-p239-h404}

Для остановки тестового окружения выполните следующую команду:

```text {label="shell" .source-commands hl_lines="1"}
$ make down
```

Если тестовое окружение больше не нужно, можно остановить его и удалить все связанные с ним компоненты:

```text {label="shell" .source-commands hl_lines="1"}
$ make destroy
```
