Как стать автором
Обновить

Zabbix Мониторинг динамических бэкапов

Всем привет!

Думаю, многие сталкивались с проблемой, когда в одну папку делается много копий бэкапов. При этом имя бэкапа не постоянное, в котором например, есть дата и время или порядковый номер.

Встает вопрос как мониторить актуальное состояние?

Предлагаю свое решение по реализации данной задачи с использованием Zabbix и небольшого скрипта на Python.

Опишу полный цикл своих бэкапов.

1. MSSQL ежедневно делает бэкап базы с перезаписью в одно и тоже место с одним и тем же именем:

D:\backup\mssql\my_data_base.bak

Данный файл мониторится просто.

в Zabbix создаем Элемент данных

vfs.file.time[D:\backup\mssql\my_data_base.bak,modify]

И на основе него создается тригер который проверяет не прошли ли сутки(86400сек.) с момента последнего бэкапа.

{host:vfs.file.time[D:\backup\mssql\my_data_base.bak,modify].now()}-{host:vfs.file.time[D:\backup\mssql\my_data_base.bak,modify].last()}>86400

2. Далее Cobian сжимает и переносит данный бэкап в несколько мест. В хранилище на том же сервере, плюс кладет в сетевое хранилище, где циклично обновляет 14 копий.

Например:

E:\backup\cobian\my_data_base
\\NAS\backup\cobian\my_data_base

В которых лежат файлы:

my_data_base 2018-12-12 05;30;55.7z
my_data_base 2018-12-11 05;30;54.7z
my_data_base 2018-12-10 05;30;55.7z
my_data_base 2018-12-09 05;30;56.7z

Соответственно имена файлов в каждой из директорий получаются однотипные, но динамические.

Казалось бы можно мониторить дату изменения директории с помощью того же элемента данных что и выше. Но не все так просто. У меня это не заработало. точнее заработало, но не правильно и плохо, дата изменения папки не обновлялась пока в нее не войдешь в ручную, хотя файл бэкапа был с правильной датой. Возможно были где то глюки винды. К тому же это совсем не захотело работать с сетевым путем (\\NAS\backup\ )

По этому собственно и родился данный скрипт:

import os, datetime, sys
def check_backup(path):
old = round(datetime.datetime.now().timestamp() - os.path.getmtime(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime)))
size = os.path.getsize(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime))
err = "1"
if size > 2097152:
if old < 86400:
err = "0"
print(err)
check_backup(sys.argv[1])

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

В данной примере бэкап должен быть больше 2MB и он не должен быть старше суток.
Если все ок скрипт передаст в заббикс 0 если что то не так то вернется 1.

В качестве аргумента скрипту передать можно как локальный путь так и сетевой. все прекрасно работает. Главное что бы был доступ.

Как это выглядит в заббиксе.

В первую очередь создаем юзер параметр.

Идем в zabbix_agent.conf и добавляем строку:

UserParameter=check_backup[*], "C:\Program Files (x86)\Python37-32\python.exe" C:\bin\scripts\find.py $1

Собственно здесь указывается путь к компилятору Python, далее путь до скрипта и параметр который будет взят из ключа check_backup[*]

В заббиксе Создаем элемент данных



на основании данного элемента создаем тригер который проверяет что именно передал нам скрипт. если это не 0 значит это проблема.

{host:check_backup[E:\backup\cobian\my_data_base\].last()}<>0

UPD: Добавил в качестве параметров уникальный размер для каждого бэкапа

import os, datetime, sys

def check_backup(path,ves):
    ves = int(ves)
    old = round(datetime.datetime.now().timestamp() - os.path.getmtime(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime)))
    size = os.path.getsize(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime))
    err = "1"
    if size > ves:
        if old < 86400:
            err = "0"

    print(err)
 
check_backup(sys.argv[1],sys.argv[2])


В конфиге заббикса соответственно вызывается вот так

UserParameter=check_backup[*],"C:\Program Files (x86)\Python37-32\python.exe" C:\bin\scripts\find.py $1 $2

в элементах данных соответственно через запятую указывается размер в байтах.

{host:check_backup[E:\backup\cobian\my_data_base\,2097152].last()}<>0

Вот собственно и все. Спасибо за внимание.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.