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 сделать... что-то я не подумал :) :) :)