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