Sign inSign up

grufos/mamonsu

By grufos

Updated over 2 years ago

Докер-контейнер для mamonsu

Image
0

1.0K

grufos/mamonsu repository overview

docker-mamonsu

Контейнер для 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 партициях и если в них обнаруживаются строки (обычная ситуация - это отсутствие там строк), то генерируется алерт.

Переменные окружения контейнера

Переменные по подключению к БД:

NameDefault valueDescription
MAMONSU_PASSWORDNoneПароль пользователя для подключения к БД mamonsu для bootstrap режима. None - это специальное слово (не пароль), которое говорит об его отсутствии
PGHOST127.0.0.1Имя хоста для подключения
PGPASSWORDОпределяет пароль пользователя postgres. Требуется при настройке bootstrap режима
PGPORT5432Номер порта для подключения к кластеру БД

Переменные общего характера:

NameDefault valueDescription
TZУказывает на временную зону в которой работает контейнер. Например: "Europe/Moscow" или "Etc/UTC"

Переменные влияющие на работу плагинов:

NameDefault valueDescription
CLIENT_HOSTNAMEсекция [zabbix] Имя текущего сервера в том виде как это заведено в настройках zabbix в разделе Hosts
ZABBIX_SERVER_IPсекция [zabbix] IP адрес или имя сервера zabbix
ZABBIX_SERVER_PORT10051секция [zabbix] Порт по которому нужно подключаться к zabbix
MAMONSU_AGENTHOST127.0.0.1секция [agent] Определяет как подключаться к mamonsu для доступа к метрикам из командной строки
INTERVAL_PGBUFFERCACHE1200секция [pgbuffercache] Интервал в секундах для обновления плагина pgbuffercache
PGPROBACKUP_ENABLEDFalseсекция [pgprobackup] Должен ли работать плагин pgprobackup
MEMORYLEAKDIAGNOSTIC_ENABLEDTrueсекция [memoryleakdiagnostic] Должен ли работать плагин memoryleakdiagnostic
MEMORYLEAKDIAGNOSTIC_THRESHOLD4GBсекция [memoryleakdiagnostic] Порог срабатывания алерта плагина memoryleakdiagnostic

На сейчас пока есть возможность изменить только эти настройки.

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

NameDescription
/etc/mamonsuнастройки mamonsu. Если каталог пуст, то в нём создадутся всё необходимы файлы настройки. Это позволит легко в них внести правки
/var/log/mamonsuлог работы mamonsu
/mnt/pgbakкаталог для бэкапов кластера

Пример docker-compose файла

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"

Tag summary

Content type

Image

Digest

sha256:ad667a474

Size

63.8 MB

Last updated

over 2 years ago

docker pull grufos/mamonsu