Pull to refresh

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

Вот собственно и все. Спасибо за внимание.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.