KsI-wiki online documents

Ndoutils

Материал из Ksimute

Перейти к: навигация, поиск

Коробанов Сергей
Март 22, 2010


Отросла таблица ndoutils до 17 Гб. В процессе разборок узнали много нового.

со старту - смотрим информацию о таблицах:

 mysql> show table status \G;


нашли большую

 *************************** 36. row ***************************
            Name: nagios_logentries
          Engine: InnoDB
         Version: 10
      Row_format: Compact
            Rows: 58322315
  Avg_row_length: 201
     Data_length: 11 771 314 176
 Max_data_length: 0
    Index_length: 0
       Data_free: 0
  Auto_increment: 59152145
     Create_time: 2010-02-24 13:55:35
     Update_time: NULL
      Check_time: NULL
       Collation: latin1_swedish_ci
        Checksum: NULL
  Create_options:
         Comment: Historical record of log entries; InnoDB free: 9216 kB


 mysql> select * from nagios_logentries limit 2 \G;

Смотрим entry_time: 2009-01-13 10:39:16

nagios_logentries год не тримировалась :(
nagios_externalcommands тоже не тримировалась...

бага

Bug in ndo2db found
http://tracker.nagios.org/view.php?id=118
0000118: missing automatic trimming nagios_logentries table
2009-12-14 03:50

Счас побеждать будем.

Смотроим Changelog версии 1.4.b9
Последняя на данный момент. У меня установлена 1.4.7

- Allow externalcommands table to be trimmed with a specific time limit (Opsera Ltd)
Ух ты :) еще пара лет и logentries тоже тримироваться будет :) :)

Смотрим исходники

 db.c
 /* trim/delete old data from a given table */
 
 if(asprintf(&buf,"DELETE FROM %s WHERE instance_id='%lu' AND %s<%s"
                     ,table_name
                     ,idi->dbinfo.instance_id
                     ,field_name
                     ,ts[0]
                    )==-1)
               buf=NULL;

Умрет этот метод на огромных таблицах.
т.е. таблица лочится во время DELETE если много удалений будет будем тормозить INSERT
Это актуально для нагиосов с более чем 3000 чеками

Смотрим дальше. Тримирование:

      if(((unsigned long)current_time-60)>(unsigned long)idi->dbinfo.last_table_trim_time){
               if(idi->dbinfo.max_timedevents_age>0L)
                       ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_TIMEDEVENTS],
 "scheduled_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_timedevents_age));
               if(idi->dbinfo.max_systemcommands_age>0L)
                       ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SYSTEMCOMMANDS],
 "start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_systemcommands_age));
               if(idi->dbinfo.max_servicechecks_age>0L)
                       ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_SERVICECHECKS],
 "start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_servicechecks_age));
               if(idi->dbinfo.max_hostchecks_age>0L)
                       ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_HOSTCHECKS],
 "start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_hostchecks_age));
               if(idi->dbinfo.max_eventhandlers_age>0L)
                       ndo2db_db_trim_data_table(idi,ndo2db_db_tablenames[NDO2DB_DBTABLE_EVENTHANDLERS],
 "start_time",(time_t)((unsigned long)current_time-idi->dbinfo.max_eventhandlers_age));
               idi->dbinfo.last_table_trim_time=current_time;
               }

Вообщем не заложено тримирование logentries. Хотя ничего не мешало сделать...
Будем искать другое решение, а пока сделаем workaround.

Сначала кильнем базейку.
потом напишим триммер, отдельным cron процессом или демоном если не найдем нормального решения.

Базейку-по правильному килять так:

 mysql> create table backup like nagios_logentries;
 mysql> RENAME TABLE nagios_logentries TO nagios_logentries_backup, backup TO nagios_logentries;
 mysql> drop table nagios_logentries_backup;

Хотя можно и truncate сделать... что-то я не подумал :) :) :)