Контейнер для mamonsu. Активный агент мониторинга PostgreSQL для zabbix
Докер основан на образе debian https://hub.docker.com/_/debian
Контейнер работает под пользователем postgres c внутренними ключами uid=999 и gid=999
Контейнер рассчитан на работу в bootstrap режиме с кластером. В этом режиме создаётся специальная БД с именем mamonsu в которой находятся некоторые функции для работы части плагинов. Создаётся специальный пользователь с именем mamonsu и выполняется необходимая настройка его прав.
Внутрь контейнера дополнительно установлена утилита pg-probackup, для того, чтобы можно было использовать новые плагины по контролю за состоянием каталога бэкапов.
Стартовый файл с mamonsu запускается через программу dumb-init, чтобы иметь возможность транслировать корректно внешние сигналы процессу mamonsu.
Добавлена настройка параметра WORK_MEM для функции mamonsu_buffer_cache(). Это необходимо для того, чтобы исключить использование дисковых операций при запросах к буферному кэшу.
Функция mamonsu_count_wal_lag_lsn()
Исправлена ошибка XLOG - catch error: float() argument must be a string or a number, not 'NoneType'
SELECT application_name, flush_lag, replay_lag, write_lag, total_lag FROM public.mamonsu_count_wal_lag_lsn();
Выяснилось, что в поле total_lag появляется значение NULL в момент работ по созданию бэкапа.
Оказывается, в тот момент пока выполняется бэкап и сервер (мастер) находится в состоянии между:
select pg_start_backup() и select pg_stop_backup ()
в представлении pg_stat_replication поле replay_lsn есть NULL.
На данный момент мы просто вставили в код расчета поля заглушку на этот момент:
pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS total_lag -> coalesce(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn),0)
В контейнер включён плагин pg_stat_replication.py, который позволяет корректно контролировать лаг репликации на репликах (до 2-х реплик). Этот плагин работает на мастере. На репликах он никаких метрик не формирует. Для контроля лага репликации на серверах репликах используется модифицированная версия функции mamonsu_timestamp_get():
CREATE OR REPLACE FUNCTION public.mamonsu_timestamp_get() RETURNS double precision AS
$BODY$
select case when pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() then 0
else extract (epoch from now() - pg_last_xact_replay_timestamp())
end;
$BODY$
LANGUAGE sql VOLATILE SECURITY DEFINER;
Плагин pg_stat_replication.py опирается на код функции mamonsu_pg_stat_replication():
CREATE OR REPLACE FUNCTION public.mamonsu_pg_stat_replication()
RETURNS TABLE(write_lag double precision, flush_lag double precision, replay_lag double precision) AS
$BODY$
select coalesce(extract(epoch from write_lag),0) as write_lag,
coalesce(extract(epoch from flush_lag),0) as flush_lag,
coalesce(extract(epoch from replay_lag),0) as replay_lag
from pg_catalog.pg_stat_replication
order by client_hostname;
$BODY$
LANGUAGE sql VOLATILE SECURITY DEFINER;
pg_patrition.py
В контейнер включён плагин pg_patrition.py, который позволяет контролировать секционированные таблицы. На текущий момент он проверяет число строк в DEFAULT партициях и если в них обнаруживаются строки (обычная ситуация - это отсутствие там строк), то генерируется алерт.
Переменные по подключению к БД:
| Name | Default value | Description |
|---|---|---|
| MAMONSU_PASSWORD | None | Пароль пользователя для подключения к БД mamonsu для bootstrap режима. None - это специальное слово (не пароль), которое говорит об его отсутствии |
| PGHOST | 127.0.0.1 | Имя хоста для подключения |
| PGPASSWORD | Определяет пароль пользователя postgres. Требуется при настройке bootstrap режима | |
| PGPORT | 5432 | Номер порта для подключения к кластеру БД |
Переменные общего характера:
| Name | Default value | Description |
|---|---|---|
| TZ | Указывает на временную зону в которой работает контейнер. Например: "Europe/Moscow" или "Etc/UTC" |
Переменные влияющие на работу плагинов:
| Name | Default value | Description |
|---|---|---|
| CLIENT_HOSTNAME | секция [zabbix] Имя текущего сервера в том виде как это заведено в настройках zabbix в разделе Hosts | |
| ZABBIX_SERVER_IP | секция [zabbix] IP адрес или имя сервера zabbix | |
| ZABBIX_SERVER_PORT | 10051 | секция [zabbix] Порт по которому нужно подключаться к zabbix |
| MAMONSU_AGENTHOST | 127.0.0.1 | секция [agent] Определяет как подключаться к mamonsu для доступа к метрикам из командной строки |
| INTERVAL_PGBUFFERCACHE | 1200 | секция [pgbuffercache] Интервал в секундах для обновления плагина pgbuffercache |
| PGPROBACKUP_ENABLED | False | секция [pgprobackup] Должен ли работать плагин pgprobackup |
| MEMORYLEAKDIAGNOSTIC_ENABLED | True | секция [memoryleakdiagnostic] Должен ли работать плагин memoryleakdiagnostic |
| MEMORYLEAKDIAGNOSTIC_THRESHOLD | 4GB | секция [memoryleakdiagnostic] Порог срабатывания алерта плагина memoryleakdiagnostic |
На сейчас пока есть возможность изменить только эти настройки.
Контейнер ожидает следующие примапленные каталоги:
| Name | Description |
|---|---|
| /etc/mamonsu | настройки mamonsu. Если каталог пуст, то в нём создадутся всё необходимы файлы настройки. Это позволит легко в них внести правки |
| /var/log/mamonsu | лог работы mamonsu |
| /mnt/pgbak | каталог для бэкапов кластера |
version: '3.5'
services:
mamonsu:
build:
context: ./docker-mamonsu
dockerfile: Dockerfile
volumes:
- "/mnt/pgbak2/:/mnt/pgbak/"
- "/var/log/mamonsu1:/var/log/mamonsu"
- "/etc/mamonsu1/:/etc/mamonsu/"
environment:
# TZ: "Etc/UTC"
TZ: "Europe/Moscow"
PGPASSWORD: qweasdzxc
# PGHOST: 127.0.0.1
PGHOST: postgres
PGPORT: 5432
MAMONSU_PASSWORD: 1234512345
ZABBIX_SERVER_IP: zbxprxy.server.ru
ZABBIX_SERVER_PORT: 10051
CLIENT_HOSTNAME: my_host.server.ru
MAMONSU_AGENTHOST: 127.0.0.1
INTERVAL_PGBUFFERCACHE: 1200
PGPROBACKUP_ENABLED: "False"
restart: always
ports:
- "10051:10051"
- "10052:10052"
Такие управляющие файлы рекомендуется запускать командами:
#!/bin/bash
clear
rm -rf /var/log/mamonsu/*
docker-compose -f "mamonsu-service.yml" up --build "$@"
Рекомендуется запускать этот докер, как докер-спутник для контейнера с postgres:
version: '3.5'
services:
postgres:
# image: grufos/postgres:13.3
build:
context: ./docker-postgres
dockerfile: Dockerfile
shm_size: '2gb'
command: |
-c shared_preload_libraries='plugin_debugger,pg_stat_statements,auto_explain,pg_buffercache,pg_cron,shared_ispell,pg_prewarm'
-c shared_ispell.max_size=70MB
volumes:
- "/var/lib/pgsql/13_1/data:/var/lib/postgresql/data"
- "/var/log/postgresql1:/var/log/postgresql"
- "/mnt/pgbak2/:/mnt/pgbak/"
ports:
- "5433:5432"
environment:
# POSTGRES_INITDB_ARGS: "--locale=ru_RU.UTF8 --data-checksums"
POSTGRES_PASSWORD: qweasdzxc
POSTGRES_HOST_AUTH_METHOD: trust
DEPLOY_PASSWORD: qweasdzxc
# TZ: "Etc/UTC"
TZ: "Europe/Moscow"
EMAILTO: "DBA-PostgreSQL@my_name.ru"
EMAIL_SERVER: "mail.name.ru"
EMAIL_HOSTNAME: "noreplay@my_host.ru"
BACKUP_THREADS: "4"
BACKUP_MODE: "delta"
mamonsu:
build:
context: ./docker-mamonsu
dockerfile: Dockerfile
volumes:
- "/mnt/pgbak2/:/mnt/pgbak/"
- "/var/log/mamonsu1:/var/log/mamonsu"
- "/etc/mamonsu1/:/etc/mamonsu/"
environment:
# TZ: "Etc/UTC"
TZ: "Europe/Moscow"
PGPASSWORD: qweasdzxc
# PGHOST: 127.0.0.1
PGHOST: postgres
PGPORT: 5432
MAMONSU_PASSWORD: 1234512345
ZABBIX_SERVER_IP: zbxprxy.server.ru
ZABBIX_SERVER_PORT: 10051
CLIENT_HOSTNAME: my_host.server.ru
MAMONSU_AGENTHOST: 127.0.0.1
INTERVAL_PGBUFFERCACHE: 1200
PGPROBACKUP_ENABLED: "False"
restart: always
depends_on:
- postgres
ports:
- "10051:10051"
- "10052:10052"
Content type
Image
Digest
sha256:ad667a474…
Size
63.8 MB
Last updated
over 2 years ago
docker pull grufos/mamonsu