Zabbix, мониторинг портов последней мили и оптимизация работы с БД с использованием partitioning

    Работая у крупнейшего провайдера РФ столкнулся с ситуацией, что происходит обращение абонента о проблемах в недалеком прошлом, т.е. вчера все было плохо, а сейчас заработало. Что делать в этом случае? Есть варианты использовать системы мониторинга, которые будут собирать ключевые параметры всех абонентских линий и хранить их некоторое время, и оператор ТП легко сможет получить доступ к этим данным для решения подобных ситуаций. Также, имея эти данные, можно давать автоматическую экспертную оценку по каждой абонентской линии, и при желании, на xDSL, автоматически подбирать наиболее подходящий профиль. Используя эти же данные, можно выявлять дефектные линии или линии с неудовлетворительными параметрами и устранять возможные проблемы абонентов еще до их обращения в ТП.
    С первого взгляда задача не сложная, но когда количество оборудование легко перешагивает тысячи узлов доступа, а количество абонентских портов может исчисляться десятками тысяч появляются некоторые особенности настройки и запуска подобной системы, с максимальной автоматизацией всего.
    Если интересно, добро пожаловать под кат


    В наличии был только один сервер HP с двумя процессорам и 4 ядрами на борту, памяти было 10G, Raid5 132G 15000 SAS.
    Основное количество абонентских портов это порты ADSL на различных DSLAM, как большой емкости — до 576 портов на «корзину» так и малопортовых — от 16 до 64 портов, в зависимости от конфигурации.

    Определим как будем мониторить и строить триггеры


    Что можно получить с dslam'a? Практически все, вопрос только как это сделать. Для меня самый верный способ это опрос по snmp. Вся беда была в том что MIB файлы к большинству железок не доступны простым смертным из-за выкрутасов производителей с заключением кучи договоров и прочих непонятных мне препятствий (к чести huawei mib'ы они все же прислали без различных договоров, а вот по другому поставщику их так и не удается получить). Если ваша ситуация схожа с моей то берем в руки snmpwalk и анализируем все что выдает железка, а выдаст она очень много, мегабайты текста. Анализ полученных oid очень трудоемкий процесс. Хорошо если есть готовые шаблоны для zabbix или есть mib (тогда шаблоны из них можно сделать быстро и легко прочитав это топик «подключаем любую железку имеющую MIB» habrahabr.ru/blogs/sysadm/85156)
    После того как получили шаблоны нужно определить, что же будем собирать, с какой периодичностью и сколько времени хранить. Все эти параметры в итоге задаются в рабочем шаблоне который и будем привязывать к железкам.

    Мой набор вышел не сильно большим, к примеру для dslam'a большой емкости параметры собираемые с первого порта


    1.01ifAtucFfrADSL 1.01ifAtucFrADSL количество ретрайнов
    1.01ifAtucLossADSL количество потерь сигнала
    1.01ifDownSnrADSL 1.01ifUpSnrADSL шумы
    1.01ifDownSpeedADSL 1.01ifUpSpeedADSL реальная скорость на абонентской линии
    и не активные, но включаемые при необходимости расширенного анализа состояния порта
    1.01ifOperPhysicalStatADSL физическое состояние порта
    1.01ifOperStatADSL состояние порта


    И дополнительный шаблон с элементами которые можно включить.

    1.01ifDownAttenuationADSL 1.01ifUpAttenuationADSL затухание в линии
    1.01ifDownOutputPowerADSL 1.01ifUpOutputPowerADSL мощность сигнала
    1.01ifDownSpeedMaxADSL 1.01ifUpSpeedMaxADSL максимально возможная достижимая скорость
    1.01ifProfSpeedADSL профиль на порту


    Если использовать описанные выше данные то можно написать триггер который будет брать текущий профиль, максимальную скорость и текущую скорость и исходя их этих данных, если скорость заданная профилем ниже реальной и максимально достижимой, предлагать или самостоятельно менять профиль на другой с более низкой скоростью, и наоборот если скорость максимальная выше реальной и выше установленной в профиле, то предлагать сменить или менять профиль на другой с более высокой скоростью.

    Замечу что подобные триггеры у меня не прижились из-за банального забивания всех на рекомендации по смене профилей на портах, а на автоматику отдавать я это побоялся.

    Есть еще один вариант очень полезных триггеров, это триггеры на величину шума, на затухание, на изменение во времени (дельта функция) количества ошибок и реконенктов и прочих радостей, которые могут очень доставлять абонентам доставать абонентов. И опять же эти триггеры не прижились по той же причине. Тяжело на душе, когда у тебя пару сотен портов считаются неудовлетворительными. ;)

    Для узлов по технологии FTTx собираемые параметры несколько отличаются, сейчас собиралась только дельта функция количества ошибок на абонентском порту, если их больше определенного значения за период времени выводим порт в список требующих внимания.
    Вот пример собранных данных с одного порта

    Данные можно представить в виде графика по времени


    Так же были у меня интересные китайские коммутаторы Edge-core от коих я избавился в пользу Huawei, так с ними я делал такой шаблон, который опрашивал результаты измерения абонентских кабелей рефлектометром и анализируя полученные результаты выдавал список портов с неисправными UTP. Эти измерения можно было провести послав на железки по snmp команду либо скриптом из забикса, либо кроном. Этот шаблон я так и не доделал из-за замены всех ежей на хуявеи.

    Общая картина и подход к мониторингу думаю ясны, если есть более конкретные вопросы, по каким то не сильно освещенным моментам, то задавайте, постараюсь ответить.

    Приступим к настройке БД под Zabbix


    На данный момент последняя стабильная ветка 1.8.5 скачать её можно с официального сайта www.zabbix.com/download.php
    Инструкцию как его установить и сделать первоначальную настройку приводить не буду, так как она есть на сайте www.zabbix.com/documentation/start

    У меня все стоит на Ubuntu server 10.04 64 bit. В качестве БД первоначально было Postgresql 8.4 далее 9.0 сейчас переехал на MySQL 5.5, поставленную на сервер согласно официальному руководству и небольшого допиливания напильником. Причина переезда поддержка partitioning table dev.mysql.com/doc/refman/5.5/en/partitioning.html" (ну и не смог я заставить работать постгрес так же быстро как мускул сколько не бился, похоже не умею я его готовить, ЗЫ partition table есть в постгрессе, но реализован он несколько иначе чем в мускуле).

    Конфигурация MySQL не сложная и хорошо описана на форуме вот пример топика по которому я настраивал MySQL www.zabbix.com/forum/showthread.php?t=12407

    Отмечу ключевую обязательную опцию
    innodb_file_per_table

    Движок по умолчанию надо выставить innodb, кодировку utf-8.
    Если будет очень любопытно выложу конфигу.

    Zabbix сохраняет в БД множество значений основные большие таблицы это hystory* и trend*
    Первоначально в таблицах истории у меня было до 500 миллионов записей и весила эта таблица порядка 40 гигов с индексным файлом, что вызывало некоторые проблемы с производительностью.
    Данные собранные с абонентских портов в среднем хранятся около 3 дней. Старые данные при этом удаляются housekeeper'ом оставляя после этого фрагментированые таблицы. Насколько это плохо думаю не нужно объяснять.
    Что же делать в этом случае? Ответ есть — использовать partition table с разделением по времени. Для этого я воспользовался опытом из блога Бразильского товарища zabbixzone.com/zabbix/partitioning-tables
    Он предлагает разделить таблицы на 2 типа: большие — с делением по дням, и не очень большие — с делением по месяцам.
    Вот эти таблицы с делением по дням:
    • history
    • history_log
    • history_str
    • history_text
    • history_uint

    и с делением по месяцам:
    • acknowledges
    • alerts
    • auditlog
    • events
    • service_alarms
    • trends
    • trends_unit


    У меня уже была настроенная система мониторинга и чтобы добавить то, что предлагал товарищ, нужно было сделать следующие действия (они почти те же, что и в выше обозначенном блоге).

    Сначала делаем дамп каждой таблицы которую собираемся менять
    mysqldump --no-create-info --lock-tables zabbix history_str > 09.06.2011_history_str.sql

    Очищаем выше обозначенные таблицы от данных.
    Слегка меняем структуры таблиц

    ALTER TABLE `acknowledges` DROP PRIMARY KEY, ADD KEY `acknowledgedid` (`acknowledgeid`);
    ALTER TABLE `alerts` DROP PRIMARY KEY, ADD KEY `alertid` (`alertid`);
    ALTER TABLE `auditlog` DROP PRIMARY KEY, ADD KEY `auditid` (`auditid`);
    ALTER TABLE `events` DROP PRIMARY KEY, ADD KEY `eventid` (`eventid`);
    ALTER TABLE `service_alarms` DROP PRIMARY KEY, ADD KEY `servicealarmid` (`servicealarmid`);
    ALTER TABLE `history_log` DROP PRIMARY KEY, ADD PRIMARY KEY (`itemid`,`id`,`clock`);
    ALTER TABLE `history_log` DROP KEY `history_log_2`;
    ALTER TABLE `history_text` DROP PRIMARY KEY, ADD PRIMARY KEY (`itemid`,`id`,`clock`);
    ALTER TABLE `history_text` DROP KEY `history_text_2`;


    * This source code was highlighted with Source Code Highlighter.


    Создаем partition table с делением по месяцам до 2013 года

    ALTER TABLE `acknowledges` PARTITION BY RANGE( clock ) (
    PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),
    PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),
    PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),
    PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),
    PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),
    PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),
    PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),
    PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),
    PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),
    PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),
    PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),
    PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),
    PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),
    PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),
    PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),
    PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),
    PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),
    PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),
    PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),
    PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))
    );

    ALTER TABLE `alerts` PARTITION BY RANGE( clock ) (
    PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),
    PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),
    PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),
    PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),
    PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),
    PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),
    PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),
    PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),
    PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),
    PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),
    PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),
    PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),
    PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),
    PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),
    PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),
    PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),
    PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),
    PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),
    PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),
    PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))
    );

    ALTER TABLE `auditlog` PARTITION BY RANGE( clock ) (
    PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),
    PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),
    PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),
    PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),
    PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),
    PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),
    PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),
    PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),
    PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),
    PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),
    PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),
    PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),
    PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),
    PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),
    PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),
    PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),
    PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),
    PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),
    PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),
    PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))
    );

    ALTER TABLE `events` PARTITION BY RANGE( clock ) (
    PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),
    PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),
    PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),
    PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),
    PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),
    PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),
    PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),
    PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),
    PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),
    PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),
    PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),
    PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),
    PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),
    PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),
    PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),
    PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),
    PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),
    PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),
    PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),
    PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))
    );

    ALTER TABLE `service_alarms` PARTITION BY RANGE( clock ) (
    PARTITION p201105 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-01 00:00:00")),
    PARTITION p201106 VALUES LESS THAN (UNIX_TIMESTAMP("2011-07-01 00:00:00")),
    PARTITION p201107 VALUES LESS THAN (UNIX_TIMESTAMP("2011-08-01 00:00:00")),
    PARTITION p201108 VALUES LESS THAN (UNIX_TIMESTAMP("2011-09-01 00:00:00")),
    PARTITION p201109 VALUES LESS THAN (UNIX_TIMESTAMP("2011-10-01 00:00:00")),
    PARTITION p201110 VALUES LESS THAN (UNIX_TIMESTAMP("2011-11-01 00:00:00")),
    PARTITION p201111 VALUES LESS THAN (UNIX_TIMESTAMP("2011-12-01 00:00:00")),
    PARTITION p201112 VALUES LESS THAN (UNIX_TIMESTAMP("2012-01-01 00:00:00")),
    PARTITION p201201 VALUES LESS THAN (UNIX_TIMESTAMP("2012-02-01 00:00:00")),
    PARTITION p201202 VALUES LESS THAN (UNIX_TIMESTAMP("2012-03-01 00:00:00")),
    PARTITION p201203 VALUES LESS THAN (UNIX_TIMESTAMP("2012-04-01 00:00:00")),
    PARTITION p201204 VALUES LESS THAN (UNIX_TIMESTAMP("2012-05-01 00:00:00")),
    PARTITION p201205 VALUES LESS THAN (UNIX_TIMESTAMP("2012-06-01 00:00:00")),
    PARTITION p201206 VALUES LESS THAN (UNIX_TIMESTAMP("2012-07-01 00:00:00")),
    PARTITION p201207 VALUES LESS THAN (UNIX_TIMESTAMP("2012-08-01 00:00:00")),
    PARTITION p201208 VALUES LESS THAN (UNIX_TIMESTAMP("2012-09-01 00:00:00")),
    PARTITION p201209 VALUES LESS THAN (UNIX_TIMESTAMP("2012-10-01 00:00:00")),
    PARTITION p201210 VALUES LESS THAN (UNIX_TIMESTAMP("2012-11-01 00:00:00")),
    PARTITION p201211 VALUES LESS THAN (UNIX_TIMESTAMP("2012-12-01 00:00:00")),
    PARTITION p201212 VALUES LESS THAN (UNIX_TIMESTAMP("2013-01-01 00:00:00"))
    );


    * This source code was highlighted with Source Code Highlighter.


    Создаем partition table с делением по дням

    ALTER TABLE `history_uint` PARTITION BY RANGE( clock ) (
    PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),
    PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),
    PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),
    PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),
    PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),
    PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),
    PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),
    PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),
    PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))
    );

    ALTER TABLE `history_log` PARTITION BY RANGE( clock ) (
    PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),
    PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),
    PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),
    PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),
    PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),
    PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),
    PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),
    PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),
    PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))
    );

    ALTER TABLE `history_text` PARTITION BY RANGE( clock ) (
    PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),
    PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),
    PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),
    PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),
    PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),
    PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),
    PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),
    PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),
    PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))
    );

    ALTER TABLE `history` PARTITION BY RANGE( clock ) (
    PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),
    PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),
    PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),
    PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),
    PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),
    PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),
    PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),
    PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),
    PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))
    );

    ALTER TABLE `history_str` PARTITION BY RANGE( clock ) (
    PARTITION p20110603 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-03 00:00:00")),
    PARTITION p20110604 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-04 00:00:00")),
    PARTITION p20110605 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-05 00:00:00")),
    PARTITION p20110606 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-06 00:00:00")),
    PARTITION p20110607 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-07 00:00:00")),
    PARTITION p20110608 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-08 00:00:00")),
    PARTITION p20110609 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-09 00:00:00")),
    PARTITION p20110610 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-10 00:00:00")),
    PARTITION p20110611 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-11 00:00:00"))
    );


    * This source code was highlighted with Source Code Highlighter.


    Восстанавливаем данные каждой таблицы так (подставив для каждой таблицы свое имя файла дампа)
    mysql zabbix < 09.06.2011_history_str.sql

    В конечном результате данные будут храниться очень удобно — каждый день/месяц в отдельном файле, отдельной части таблицы

    ls -l /var/lib/mysql/zabbix/ |grep history_u
    -rw-rw---- 1 mysql mysql 8628 2011-06-08 14:00 history_uint.frm
    -rw-rw---- 1 mysql mysql 140 2011-06-08 14:00 history_uint.par
    -rw-rw---- 1 mysql mysql 457179136 2011-06-07 11:34 history_uint#P#p20110605.ibd
    -rw-rw---- 1 mysql mysql 557842432 2011-06-07 11:34 history_uint#P#p20110606.ibd
    -rw-rw---- 1 mysql mysql 620756992 2011-06-07 11:34 history_uint#P#p20110607.ibd
    -rw-rw---- 1 mysql mysql 629145600 2011-06-08 00:03 history_uint#P#p20110608.ibd
    -rw-rw---- 1 mysql mysql 666894336 2011-06-09 00:08 history_uint#P#p20110609.ibd
    -rw-rw---- 1 mysql mysql 423624704 2011-06-09 14:55 history_uint#P#p20110610.ibd
    -rw-rw---- 1 mysql mysql 114688 2011-06-07 11:09 history_uint#P#p20110611.ibd
    -rw-rw---- 1 mysql mysql 114688 2011-06-07 11:44 history_uint#P#p20110612.ibd
    -rw-rw---- 1 mysql mysql 114688 2011-06-07 11:44 history_uint#P#p20110613.ibd
    -rw-rw---- 1 mysql mysql 114688 2011-06-07 11:44 history_uint#P#p20110614.ibd
    -rw-rw---- 1 mysql mysql 114688 2011-06-08 14:00 history_uint#P#p20110615.ibd
    -rw-rw---- 1 mysql mysql 8688 2011-05-27 21:30 history_uint_sync.frm
    -rw-rw---- 1 mysql mysql 131072 2011-05-27 21:30 history_uint_sync.ibd


    Очистка старых данных производится простой командой (вместо `history_uint` подставьте нужную вам таблицу)
    ALTER TABLE `history_uint` DROP PARTITION p20110604;
    Добавление новой части таблицы
    ALTER TABLE `history_uint` ADD PARTITION (PARTITION p20110628 VALUES LESS THAN (UNIX_TIMESTAMP("2011-06-29 00:00:00")));

    Руками чистить таблицы и добавлять новые как то не интересно, опять же в блоге предлагают процедуру для таблиц разбитых по дням код взят тут pastebin.com/ijyKkxLh дабы сохранить его для потомков выложу его здесь без изменений.

    /**************************************************************
     MySQL Auto Partitioning Procedure for Zabbix 1.8
     zabbixzone.com/zabbix/partitioning-tables

     Author: Ricardo Santos (rsantos at gmail.com)
     Version: 20110518
    **************************************************************/
    DELIMITER //
    DROP PROCEDURE IF EXISTS `zabbix`.`create_zabbix_partitions` //
    CREATE PROCEDURE `zabbix`.`create_zabbix_partitions` ()
    BEGIN
      CALL zabbix.create_next_partitions("zabbix","history");
      CALL zabbix.create_next_partitions("zabbix","history_log");
      CALL zabbix.create_next_partitions("zabbix","history_str");
      CALL zabbix.create_next_partitions("zabbix","history_text");
      CALL zabbix.create_next_partitions("zabbix","history_uint");
      CALL zabbix.drop_old_partitions("zabbix","history");
      CALL zabbix.drop_old_partitions("zabbix","history_log");
      CALL zabbix.drop_old_partitions("zabbix","history_str");
      CALL zabbix.drop_old_partitions("zabbix","history_text");
      CALL zabbix.drop_old_partitions("zabbix","history_uint");
    END //
    DROP PROCEDURE IF EXISTS `zabbix`.`create_next_partitions` //
    CREATE PROCEDURE `zabbix`.`create_next_partitions` (SCHEMANAME varchar(64), TABLENAME varchar(64))
    BEGIN
      DECLARE NEXTCLOCK timestamp;
      DECLARE PARTITIONNAME varchar(16);
      DECLARE CLOCK int;
      SET @totaldays = 7;
      SET @i = 1;
      createloop: LOOP
        SET NEXTCLOCK = DATE_ADD(NOW(),INTERVAL @i DAY);
        SET PARTITIONNAME = DATE_FORMAT( NEXTCLOCK, 'p%Y%m%d' );
        SET CLOCK = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD( NEXTCLOCK ,INTERVAL 1 DAY),'%Y-%m-%d 00:00:00'));
        CALL zabbix.create_partition( SCHEMANAME, TABLENAME, PARTITIONNAME, CLOCK );
        SET @i=@i+1;
        IF @i > @totaldays THEN
          LEAVE createloop;
        END IF;
      END LOOP;
    END //
    DROP PROCEDURE IF EXISTS `zabbix`.`drop_old_partitions` //
    CREATE PROCEDURE `zabbix`.`drop_old_partitions` (SCHEMANAME varchar(64), TABLENAME varchar(64))
    BEGIN
      DECLARE OLDCLOCK timestamp;
      DECLARE PARTITIONNAME varchar(16);
      DECLARE CLOCK int;
      SET @mindays = 3;
      SET @maxdays = @mindays+4;
      SET @i = @maxdays;
      droploop: LOOP
        SET OLDCLOCK = DATE_SUB(NOW(),INTERVAL @i DAY);
        SET PARTITIONNAME = DATE_FORMAT( OLDCLOCK, 'p%Y%m%d' );
        CALL zabbix.drop_partition( SCHEMANAME, TABLENAME, PARTITIONNAME );
        SET @i=@i-1;
        IF @i <= @mindays THEN
          LEAVE droploop;
        END IF;
      END LOOP;
    END //
    DROP PROCEDURE IF EXISTS `zabbix`.`create_partition` //
    CREATE PROCEDURE `zabbix`.`create_partition` (SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
    BEGIN
      DECLARE RETROWS int;
      SELECT COUNT(1) INTO RETROWS
        FROM `information_schema`.`partitions`
        WHERE `table_schema` = SCHEMANAME AND `table_name` = TABLENAME AND `partition_name` = PARTITIONNAME;
      
      IF RETROWS = 0 THEN
        SELECT CONCAT( "create_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;
           SET @sql = CONCAT( 'ALTER TABLE `', SCHEMANAME, '`.`', TABLENAME, '`',
            ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );
        PREPARE STMT FROM @sql;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
      END IF;
    END //
    DROP PROCEDURE IF EXISTS `zabbix`.`drop_partition` //
    CREATE PROCEDURE `zabbix`.`drop_partition` (SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64))
    BEGIN
      DECLARE RETROWS int;
      SELECT COUNT(1) INTO RETROWS
        FROM `information_schema`.`partitions`
        WHERE `table_schema` = SCHEMANAME AND `table_name` = TABLENAME AND `partition_name` = PARTITIONNAME;
      
      IF RETROWS = 1 THEN
        SELECT CONCAT( "drop_partition(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ")" ) AS msg;
           SET @sql = CONCAT( 'ALTER TABLE `', SCHEMANAME, '`.`', TABLENAME, '`',
            ' DROP PARTITION ', PARTITIONNAME, ';' );
        PREPARE STMT FROM @sql;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
      END IF;
    END //
    DELIMITER ;


    * This source code was highlighted with Source Code Highlighter.


    Теперь остается добавить выполение этого кода по крону раз в 3 дня
    строчка в конфиге крона будет выглядить приблизительно так
    0 6 */3 * * Логинка_от_кого_выполняем mysql -B -h localhost -u zabbix -pПАРОЛЬКА zabbix -e "CALL create_zabbix_partitions();"

    С настройкой БД закончили.

    Настроим автопривязку шаблонов от количества плат на оборудовании


    Мои железки достаточно крупные и масштабируются путем добавления плат с абонентскими портами. Чтобы не опрашивать лишний раз не существующие порты в железке, все шаблоны я разбил на платы. Добавил правило обнаружения которое раз в сутки стучится на определенный оид. Ответ от этого оида позволяет узнать установлена плата в слот или нет. Сканирование идет по всему диапазону ипов железок.

    Добавил два действия которые либо привязывают шаблон этой карты к узлу, либо отвязывают шаблон от неё, выполняя это в зависимости от значения полученного при обнаружении.



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

    Что же мы получили?


    Загрузка проца и прочие разные графики ниже.
    На графике размера БД можно заметить два падения, первое падение — первый запуск процедуры, второе падение через сутки — ручная проверка выполнения процедуры.



    Краткие качественные характеристики


    Как видно ресурсы позволяют поднять нагрузку без особого ущерба производительности. Раньше баловался и доводил количество items до 300 000 и количество получаемых значений в секунду до 200. Сейчас же все лишнее и не нужное из мониторинга убрано.

    Мелкий бонус


    Пример части карты сети FTTB


    Контроль за линками одного корпоративного клиента


    Продолжение будет если тема будет интересна ))

    ЗЫ Извиняюсь за несколько сумбурное изложение материала.
    UPD: Исправил часть орфографических и грамматических ошибок.
    UPD2: Исправил еще много орфографических и грамматических ошибок, подправил потерявшиеся ссылки.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 46

      0
      Zabbix, мне в последнее время очень интересен. И интересно как сделать, например, вот такое:
      image
        +1
        Есть в нем возможность строить карты сети. Естественно вручную. Так вот… подложку можно менять на любую интересующую картинку, а дальше добавлять в нужных местах сетевые устройства и триггеры.
          +1
          И соединять их
            0
            Я думаю автора интересовало отображение скорости передачи между 2мя точками, а не фон.
            0
            Скрин как раз из заббикса.
              +4
              Вам интересно чтобы на линке отображался тарфик?
              Вставьте в название линка или узла сети
              DL/UL: {ИМЯ_УЗЛА:ifHCOutOctets.XGigabitEthernet0-1-1.last(0)} / {ИМЯ_УЗЛА:ifHCInOctets.XGigabitEthernet0-1-1.last(0)}
              т… е. узел сети- его элемент — тип последнего значения в данном случае последнее занчение можно среднее можно минимум можно максимум, более подробно есть в документации.
                0
                Делаете подложку, загружаете ее. Грузите сервера и добавляете необходимые метки для отображения. Никакой магии.
                –1
                Прошу прощения, а почему заббикс? Не логичнее ли при большом количестве одинаковых железок nagios+centreon? У меня на работе именно так и сделано. Один раз аккуратно созданый профиль для коммутатора/дслама/unix сервера и в результате получаем добавление новой железки в три комманды, возможность быстро и без косяков менять параметры опроса групп, репликацию на несколько нод.
                Я не то чтобы против заббикса, просто хотел бы понят, почему Вы его выбрали.
                  +2
                  Это холиварная тема, но отвечу — просто опишу плюсы: железки не добавляю руками, все делается автоматом. Шаблоны подцепляются автоматом. Железки по группам распределяются автоматом. Все делается на основе правил которые меняются на лету без перезагрузки. Для изменения любого параметра на всех железках сразу достаточно поменять шаблон. Если нужно поменять этот параметр только на железке меняем на железке шаблон при этом не трогается. Глубина хранения истории, трендов, интервал опроса и прочее меняется на лету без остановок и потерь накопленной информации. Вся информация хранится в БД. Есть удобный API. Высокая производительность на больших количествах итемов. Легкая масштабируемость системы.
                  Уверен, что то же есть и Nagios, но формат вывода и доступ к сохраненной информации мне более удобен в этой системе. ЗЫ Nagios у нас тоже есть и успешно мониторит состояние сети но не порты конечных абонентов, да я и честно не представляю как удобно реализовать в нем мониторинг хотябы десятка тысяч абонентских портов.
                    0
                    Я конечно извиняюсь за настойчивость, но все то же самое умеет и нагиос. Производительность — полторы тысячи аксесс коммутаторов по 24 порта — опрашивается на DL 380 с 1 зионом. В чистом виде нагиос убог. Но если взять centreon или Munin и nagvis(а можно не париться и поставить сразу FAN).

                    Умеет ли заббикс несколько нод — вот это вопрос.
                      +1
                      Умеет, это называется распределенный мониторинг. Количество железа не показатель а вот количество новых значений в секунду с опрашиваемых устройств это более интересная цифра. У меня порядка 80 новых значений в секунду получается.
                        +1
                        заббикс умеет так называемые прокси, это практически тоже самое что и много нод.

                        А если и заббикс и нагиос умеют одно и тоже, то каждый выбирает на свое усмотрение. Яндекс кстати выбрал заббикс, тоже с мусклом.
                          0
                          Умеет. Причем умеет как присылать данные так и просто события. Zabbix да жрет больше ресурсов но и умеет на порядок больше. Особенно когда надо сделать что-то необычное. В случае nagios вам придется писать плагин, в случае zabbix только сунуть данные и написать выражение для триггера.
                            +4
                            А я выскажусь.
                            Мунин — смех сквозь слезы а не мониторинг. Как там посмотреть какой нибудь чарт «за неделю назад между 14 и 15 часами?». По умолчанию по десятке метрик на чарт — вызывают головокружение и тошноту вместо ясной картины. А как там системы реакций, оповещений?

                            Вы бы еще ( простите за выражение) MMonit вспомнили.

                            Нагиос — мамонт мониторинга. Мониторить пограничные состояния вроде «порт открыт или закрыт» — да еще при помощи connect — улюлюкая гоняться с дубиной по пещерам. Разве что начинать городить фестиваль плагинов с nrpe и хоть какой то историей событий… а не по алертам на почте смотреть.
                          +1
                          download.yandex.ru/company/experience/rit2008/highload_lapan.pdf
                          Вот почему. Думаю яндексу вы вполне поверите ага? :)
                            0
                            Коротко и ясно.
                            0
                            Ну и да я забыл сказать, профили там есть. Так что никаких проблем. В целом zabbix актуален при большом количестве оборудования с snmp.
                            +2
                            Первая оптимизация не использовать RAID5 под БД.
                              0
                              Первая оптимизация — использовать отдельный сервер под БД и вот тогда можно настроить и заточить его на максимальную производительность. ;)
                                –1
                                В чем смысл тогда всех танцев вокруг БД, если raid5 является bottleneck.
                                  0
                                  Он им не является. Не для такого количества данных.
                                  Если поднять количество итемов на порядок тогда может так и будет и то не факт
                                  0
                                  Незачем. Сам по себе zabbix и его веб-интерфейс дикой нагрузки на сервер не дают.
                                    +1
                                    На самом деле дают, если у вас достаточное колличество скринов и чартов, за длинный промежуток времени.
                                    Но это легко исправляется настройкой кешей заббикс сервера.
                                      0
                                      Вообще это нагрузка на СУБД а не нагрузка самого софта ;)
                                  0
                                  Ну RAID10 будет быстрее, но будет меньше места. Опять же при наличии контроллера с RAM это уже не стреляет.
                                  +3
                                  Заббикс чертовских хорош по сравнению с конкурентами в первую очередь благодаря веб-интерфейсу.

                                  Но вообще мониторинг это одна из самых сложных вещей что могут достаться админу.
                                    +1
                                    ну и не смог я заставить работать постгрес так же быстро как мускул сколько не бился, похоже не умею я его готовить

                                    Явно не умеете готовить :) Я долго использовал zabbix с mysql и мирился с провалами по данным если кто-то начинает много читать или много писать. А потом плюнул и настроил его на работу с PostgreSQL. Оно работает лучше и стабильнее.
                                      0
                                      Движок по умолчанию надо выставить innodb, кодировку utf-8.
                                      Если будет очень любопытно выложу конфигу.


                                      Ага любопытно.
                                        +2
                                        Вот, если есть замечания с удовольствием прислушаюсь.
                                        [client]
                                        default-character-set=utf8
                                        port = 3306
                                        socket = /var/run/mysqld/mysqld.sock
                                        [mysqld_safe]
                                        socket = /var/run/mysqld/mysqld.sock
                                        nice = -10
                                        [mysqld]
                                        character_set_server=utf8
                                        collation-server=utf8_bin
                                        init_connect="SET NAMES utf8 collate utf8_bin"
                                        user = mysql
                                        socket = /var/run/mysqld/mysqld.sock
                                        port = 3306
                                        basedir = /usr
                                        datadir = /var/lib/mysql
                                        tmpdir = /tmp
                                        skip-external-locking
                                        default-storage-engine = innodb
                                        tmp_table_size = 1024M
                                        query_cache_limit = 1M
                                        query_cache_size = 256M
                                        max_heap_table_size = 256M
                                        max_connections = 400
                                        join_buffer_size = 2048K
                                        read_buffer_size = 256k
                                        read_rnd_buffer_size = 256k
                                        thread_cache_size = 4
                                        bind-address = 127.0.0.1
                                        key_buffer = 16M
                                        max_allowed_packet = 16M
                                        thread_stack = 192K
                                        myisam-recover = BACKUP
                                        max_connections = 400
                                        table_cache = 512
                                        log_error = /var/log/mysql/error.log
                                        log_slow_queries = /var/log/mysql/mysql-slow.log
                                        log-queries-not-using-indexes
                                        expire_logs_days = 10
                                        max_binlog_size = 100M
                                        innodb_file_per_table
                                        [mysqldump]
                                        quick
                                        quote-names
                                        max_allowed_packet = 16M
                                        [mysql]
                                        default-character-set=utf8
                                        [isamchk]
                                        key_buffer = 16M

                                        innodb_flush_log_at_trx_commit = 2
                                        innodb_file_per_table
                                        innodb_flush_method = O_DIRECT
                                        innodb_log_file_size = 512M
                                        innodb_log_buffer_size = 4M
                                        innodb_buffer_pool_size = 6G
                                        innodb_thread_concurrency =8
                                        /code>
                                          +2
                                          Спасибо.
                                        0
                                        Заббикс 1.8.5 у кого-нибудь стартует на ядрах >2.6.24 ?)
                                        Так и не смог его завести. Даже если его скомпилить на 2.6.24, все равно
                                        socket() for [[-]:10050] failed with error 22: Invalid argument
                                        Буду рад пообщаться с теми, кто данной проблемы не испытывает.
                                          0
                                          Работает и вполне успешно.
                                          uname -a
                                          Linux monitor 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

                                          Смотреть надо при сборке, может либ каких не хватает.
                                            0
                                            Подскажите еще версию libc6?
                                            Вот он этот баг. support.zabbix.com/browse/ZBX-3395
                                            У кого-то работает, у кого-то не работает. Очень странная ситуация.
                                              0
                                              dpkg -s libc6
                                              Package: libc6
                                              Status: install ok installed
                                              Priority: required
                                              Section: libs
                                              Installed-Size: 10212
                                              Maintainer: Ubuntu Core developers <ubuntu-devel-discuss@lists.ubuntu.com>
                                              Architecture: amd64
                                              Source: eglibc
                                              Version: 2.11.1-0ubuntu7.8

                                              0
                                              Поковырялись немного. Проблема в пассивных агентах и трапперах.
                                              В сервере включаешь трапперы и оно не стартует. В агенте включаешь DisablePassive=0 и оно не стартует.
                                              Если трапперы и пассивные агенты не нужны, то все работает.
                                              +1
                                              Проблема есть еще с версии 1.8.4.
                                              >> socket() system call that does not support SOCK_CLOEXEC flag on earlier kernels

                                              По роду деятельности приходится собирать статики агенты. Вот до сих пор агенты 1.8.3 из за этого юзаю.

                                                +1
                                                Для себя думаю просто залезть в исходники и выпилить этот флаг из bind`a
                                              +1
                                              Спасибо за partitioning и действия в discovery. Не знал.
                                              А есть ссылка, где можно больше прочитать про discovery? Я уже два года использую zabbix, для коммутаторов (да, FTTx) висит просто Template_SNMP_v2, думаю, может есть смысл сделать для них отдельный шаблон и автоматическую привязку.
                                                +1
                                                Официальный мануал достаточно подробный. Переведен на несколько языков.
                                                Discovery вместе с триггерами очень гибкая вещь. Я использую в правиле обнаружения SNMPv2 агент ".1.3.6.1.2.1.1.1.0" который возвращает тип железки который очень часто уникален для одной серии железа.
                                                Дальше пишем действие на обнаружение с использованием «И»
                                                например такое если
                                                Полученное значение содержит "MA5600 V100R011"
                                                Состояние обнаружения = "Up"
                                                Тип сервиса = "SNMPv2 агент"
                                                IP адрес узла сети = "10.хх.ххх.2-30"

                                                ипы/диапазон подставьте свои
                                                то делать следующее
                                                Присоединить шаблон "Template_Huawei_MA5605_system"
                                                Добавить в группу "Huawei MA5605"
                                                Добавить в группу "Группа какого либо района"
                                                Добавить узел сети

                                                для другого типа железки полученное значение будет другое можно написать другое действия исходя из этого.
                                                Используя подобные правила и действия, можно не беспокоится об изменениях в количестве УД, они будут сами добавляться при настройке на них snmp в данном случае. Также можно их и удалять.
                                                У меня например 73 триггера на обнаружение, и я еще не все настроил, что хотел.
                                                  0
                                                  Спасибо, документцию я уже нашел (я раньше искал — почему-то не мог найти; возможно, это было давно и тогда её не было).

                                                  Действие у меня получилось похожее, только вот забыл «Состояние обнаружения».

                                                  Еще вопрос, если Вы не против. Можно ли на одно обнаружение повесить несколько действий (и наоборот)? Т.е. допустим у меня разные диапазоны адресов для свитчей в разных районах, делаю скажем 10 Discovery, 1 действие — проверить модель и добавить в хосты, и еще 10 — занести в нужный район.
                                                    +1
                                                    Не совсем понял что вы имеете в виду.
                                                    На одно обнаружение можно сделать много действий, но зачем делать 10 разных одинаковых Discovery на разные IP? когда в одном можно указать просто все диапазоны IP в которых надо проводить сканирование. В последних версиях работает.
                                                    Лучше одним действием делать и проверку и добавление в нужный район, но в этом случае необходимо делать количество действий по количеству районов.
                                                    ЗЫ Не сомневаюсь что можно сделать и по другому, но мне так больше нравится.
                                                      0
                                                      Да, действительно, проморгал — там можно несколько диапазонов указать.
                                                      А районы пусть лучше будут в отдельных действиях — так проще их добавлять. Если, конечно, там не получится race condition и оно не будет пытаться добавить в группу хост, которого еще не существует (т.к. первое правило еще не отработало).

                                                      Кстати, Вы не делали получение имени хоста по SNMP? Я наваял костыль, но как-то это неправильно.
                                                        +1
                                                        Вот моя статья о том как я делаю переименование хостов habrahabr.ru/blogs/sysadm/82465/ (опубликовать просил товарища так как у меня не было тогда акаунта на хабре)
                                                          +1
                                                          Да Вы, я смотрю, вообще zabbix-гуру :). У меня получилось как-то похоже, но попроще.
                                                          Я прямо в Action вешаю Remote command:
                                                          zabbix:/usr/local/bin/getNameFromSnmp {DISCOVERY.DEVICE.IPADDRESS}

                                                          И на хосте с именем zabbix вот такой вот скрипт
                                                          #!/bin/sh
                                                          
                                                          sleep 5 #На всякий случай - дадим заббиксу время добавить хост, т.к. action-ы могут выполняться асинхронно
                                                          ADDRESS=`snmpget -v 2c -c public $1 .1.3.6.1.2.1.1.6.0 -O Uvq|tr -d "\n,'()/"`
                                                          echo "UPDATE hosts SET host = '$ADDRESS' WHERE ip = '$1'" | mysql -u zabbix -pпароль-h 10.x.x.x zabbix
                                                          #echo $* $ADDRESS
                                                          
                                                        0
                                                        Хех.
                                                        Discovery — странный предмет. Вот он есть, а вот его нет.
                                                        Вписал 3 диапазона. По первому прошелся, по остальным — нет.
                                                          0
                                                          Сейчас проверил, хм а ведь не работает. Хотя ВРОДЕ работало… Крайне странно. Ушел читать багрепорты.

                                                Only users with full accounts can post comments. Log in, please.