Как я не позволяю MySQL постоянно увеличивать использование дискового пространства при использовании с puppet-dashboard?
Настройка
У нас есть Debian Linux с MySQL v5.1.73 (механизм хранения innoDB) и puppet-dashboard версии 1.2.23. Как вы, наверное, догадались, puppet-dashboard использует MySQL в качестве бэкэнда.
Кроме того, это не должно относиться к делу, но это виртуальная машина VMware на vSphere 5.5.
Эта проблема
Проблема заключается в том, что, несмотря на то, что число марионеточных узлов и частота выполнения остаются относительно одинаковыми, дисковое пространство, используемое MySQL, продолжает беспокоящим образом увеличиваться до такой степени, что теперь оно становится проблемой.
Следующий график иллюстрирует проблему.
Мы создали два задания cron, которые должны освободить место на диске. Они следующие, и оба бегают ежедневно:
- rake RAILS_ENV= производственная база данных:raw: оптимизировать
- rake RAILS_ENV= производственные отчеты: чернослив: осиротевший до =3 единицы = пн
Капли, которые вы видите на графике, - это выполнение заданий cron, которые занимают больше места, пытаясь освободить место.
Бинарные журналы MySQL не включены. 95% дискового пространства, используемого на этом сервере, находится в каталоге /var/lib/mysql/dashboard_production, в котором хранятся данные MySQL.
Раньше у нас была эта проблема с другим приложением (мониторинг Zabbix), и нам приходилось выгружать БД и повторно импортировать, чтобы освободить место. Это был очень болезненный процесс и не очень элегантное решение, но в конечном итоге это сработало.
Есть ли способ, которым мы можем восстановить это дисковое пространство? Что мы можем сделать, чтобы остановить это поведение?
Редактировать 1
Мы действительно используем innoDB и не используем конфигурационную директиву "innodb_file_per_table".
По просьбе Феликса, вывод команды следующий:
+----------------------+-------------------+-------------+
| table_schema | table_name | data_length |
+----------------------+-------------------+-------------+
| dashboard_production | resource_statuses | 39730544640 |
| dashboard_production | metrics | 643825664 |
| dashboard_production | report_logs | 448675840 |
| dashboard_production | timeline_events | 65634304 |
| dashboard_production | reports | 50937856 |
| dashboard_production | resource_events | 38338560 |
| glpidb | glpi_crontasklogs | 21204608 |
| ocsweb | softwares | 8912896 |
| ocsweb | deploy | 5044208 |
| phpipam | logs | 1269584 |
+----------------------+-------------------+-------------+
Кроме того, я буду пробовать задание "отчеты: обрезать" без "потерянного" параметра, как было упомянуто, а также другие альтернативы и буду обновлять этот вопрос.
Редактировать 2
Я запустил задание отчетов: обрезать грабли и, несмотря на удаление 230000 отчетов, оно продолжало потреблять больше места... Поэтому я перейду к другим вариантам.
Решение
После удаления двух третей записей в базе данных он освободил только 200 МБ дискового пространства, что бессмысленно. Мы закончили вывод содержимого и его повторный импорт, стараясь включить "innodb_file_per_table".
Нам просто нужно подождать и посмотреть, исправит ли это решение в долгосрочной перспективе, но на данный момент это действительно так.
1 ответ
Я нашел эту статью, которая, кажется, решает проблему довольно хорошо
http://ximunix.blogspot.co.uk/2014/01/howto-cleanup-puppet-reports-and-db.html
опубликовал Химена Кардинали
Короткая история - начать удалять отчеты небольшими партиями, а затем освободить место из MySQL
HOWTO Cleanup Puppet Reports и DB
Если база данных для Puppet Dashboard использует несколько ГБ и с каждым днем становится все больше, это способ вернуть часть пространства.
Есть две грабли, которые вы должны выполнять каждый день как часть ежедневного обслуживания Puppet Dashboard.
cd /usr/share/puppet-dashboard
env RAILS_ENV=production rake reports:prune upto=5 unit=day
env RAILS_ENV=production rake reports:prune:orphaned
Вы можете изменить RAILS_ENV и количество дней (дней), недель (недель), месяцев (месяцев) и т. Д. В соответствии с вашей системой и ее потребностями.
Остановить входящие отчеты:
cd / path / to / puppet-dashboard
env RAILS_ENV = производственный скрипт /delayed_job -p панель мониторинга -m stop
Начните удалять отчеты небольшими партиями
Продолжайте работать в направлении того времени, за которое вы хотите хранить отчеты. Причиной этого является низкая производительность таблиц Innodb при удалении более 10 тыс. Строк одновременно. Если вы попытаетесь удалить несколько сотен тысяч строк, произойдет тайм-аут, и вам все равно придется разбить его на более мелкие удаления. Также процесс Ruby rake будет использовать, вероятно, всю вашу оперативную память и, вероятно, будет убит ядром до его завершения. Нечто подобное этому прогрессированию должно работать для большинства людей, но если у вас есть данные за много месяцев, вы можете начать с месяца или двух своих самых ранних записей. В нашем случае мы храним отчеты за 2 недели (14 дней).
env RAILS_ENV=production rake reports:prune upto=6 unit=mon
env RAILS_ENV=production rake reports:prune upto=4 unit=mon
env RAILS_ENV=production rake reports:prune upto=2 unit=mon
env RAILS_ENV=production rake reports:prune upto=3 unit=wk
env RAILS_ENV=production rake reports:prune upto=1 unit=wk
env RAILS_ENV=production rake reports:prune upto=5 unit=day
- Определить лучший способ вернуть пространство из MySQL
Есть два способа освободить пространство в зависимости от того, как был настроен MySQL. Запустите эту команду, чтобы определить, включена ли innodb_file_per_table. Должно быть установлено значение "ON", если оно есть. ПРИМЕЧАНИЕ: я рекомендую использовать innodb на вашем MySQL для подобных случаев.
mysqladmin variables -u root -p | grep innodb_file_per_table
Вы также можете сделать список базы данных, чтобы увидеть, есть ли файлы данных большего размера. Таблица, скорее всего, будет большой, это resource_statuses.ibd.
ls -lah /var/lib/mysql/dashboard_production
...
-rw-rw---- 1 mysql mysql 8.9K Jan 08 12:50 resource_statuses.frm
-rw-rw---- 1 mysql mysql 15G Jan 08 12:50 resource_statuses.ibd
...
- Осваивать пространство простым способом
Если MySQL был сконфигурирован с innodb_file_per_table и ваша база данных Dashoard показывает, что ваши данные находятся в больших табличных файлах, сделайте следующее:
mysql -u root -p
use puppet_dashboard;
OPTIMIZE TABLE resource_statuses;
Это создаст новую таблицу на основе текущих данных и скопирует ее на место. Если вы делаете листинг, пока он находится в процессе, вы должны увидеть что-то вроде этого:
-rw-rw---- 1 mysql mysql 8.9K Jan 08 12:50 resource_statuses.frm
-rw-rw---- 1 mysql mysql 15G Jan 08 12:50 resource_statuses.ibd
-rw-rw---- 1 mysql mysql 8.9K Jan 08 12:50 #sql-379_415.frm
-rw-rw---- 1 mysql mysql 238M Jan 08 12:51 #sql-379_415.ibd
И когда он закончится, он скопирует файл tmp на место. В этом случае мы перешли с 15 ГБ до 708 МБ.
-rw-rw---- 1 mysql mysql 8.9K Jan 08 13:01 resource_statuses.frm
-rw-rw---- 1 mysql mysql 708M Jan 08 13:03 resource_statuses.ibd
- Осваивать космос трудным путем
Если ваша система не была настроена с параметром innodb_file_per_table или все текущие данные находятся в большом файле ibdata, единственный способ освободить место - стереть всю установку и заново импортировать все данные. Общий метод должен быть примерно таким: сначала настройте innodb_file_per_table, дампируйте все базы данных, затем остановите Mysql, удалите /var/lib/mysql, запустите mysql_install_db, чтобы снова создать /var/lib/mysql, запустите MySQL и, наконец, снова импортируйте данные. Там не будет необходимости оптимизировать шаги из-за импорта данных.
Наконец, перезапустите delayed_job:
cd / path / to / puppet-dashboard
env RAILS_ENV = производственный скрипт /delayed_job -p панель мониторинга -n 2 -m start
Очистка ежедневных отчетов и обслуживание БД:
Для ежедневной очистки отчетов вы можете создать простой BASH-скрипт, который будет искать отчеты в /var/lib/puppet/reports по времени (в нашем случае mtime +14), удалять их, а затем очищать базу данных с помощью (upto=2 unit=wk) и установите его в свой crontab. Примером скрипта может быть:
#!/bin/bash
REPORTS=`find /var/lib/puppet/reports -type f -mtime +14`
for i in $REPORTS; do rm -f $i; done
cd /usr/share/puppet-dashboardenv RAILS_ENV=production rake reports:prune upto=2 unit=wk