设置
我们有一个使用 MySQL v5.1.73(innoDB 存储引擎)和 puppet-dashboard 版本 1.2.23 设置的 Debian Linux。您可能已经猜到了,puppet-dashboard 使用 MySQL 作为其后端。
此外,它不应该是相关的,但这是 vSphere 5.5 上的 VMware 虚拟机。
问题
问题在于,尽管 puppet 节点的数量和运行频率保持相对相同,但 MySQL 使用的磁盘空间仍在以令人不安的方式不断增加,以至于现在已经成为一个问题。
下图说明了这个问题。
我们已经实施了两个 cron 作业,应该可以释放磁盘空间。它们如下,并且都每天运行:
- 耙 RAILS_ENV=生产数据库:原始:优化
- rake RAILS_ENV=生产报告:修剪:孤立最多=3 单位=星期一
您可以在图中看到的下降是 cron 作业正在运行并占用更多空间以试图释放一些空间。
未启用 MySQL 二进制日志。此服务器上使用的 95% 的磁盘空间位于 /var/lib/mysql/dashboard_production,这是存储 MySQL 数据的目录。
我们之前在使用不同的应用程序(Zabbix 监控)时遇到过这个问题,不得不转储数据库并重新导入以释放空间。这是一个非常痛苦的过程,不是一个非常优雅的解决方案,但它最终奏效了。
有什么办法可以回收这个磁盘空间?我们能做些什么来阻止这种行为?
编辑 1
我们确实在使用 innoDB,并且我们没有使用配置指令“innodb_file_per_table”。
按照 Felix 的要求,命令的输出如下:
+----------------------+-------------------+-------------+
| 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
我运行了 reports:prune rake 任务,尽管删除了 230000 份报告,但它继续占用更多空间……因此,我将继续使用其他选项。
解决方案
在删除数据库中三分之二的条目后,它只释放了 200MB 的磁盘空间,这是毫无意义的。我们最终转储了内容并重新导入它,注意启用“innodb_file_per_table”。
我们只需要等待,看看这是否能长期解决解决方案,但目前似乎是这样。
我发现这篇文章似乎很好地解决了这个问题
http://ximunix.blogspot.co.uk/2014/01/howto-cleanup-puppet-reports-and-db.html
发表者 Ximena Cardinali
小故事是开始小批量删除报告,然后从 MySQL 中回收空间
HOWTO 清理木偶报告和数据库
如果 Puppet Dashboard 的数据库使用数 GB 并且每天都在变大,这是一种收回一些空间的方法。
作为 Puppet Dashboard 日常维护的一部分,您应该每天运行两个 rake 作业。
您可以更改 RAILS_ENV 和天数 (day)、周数 (wk)、月数 (mon) 等以匹配您的系统及其需求。
停止传入报告:
cd /path/to/puppet-dashboard
env RAILS_ENV=生产脚本/delayed_job -p dashboard -m stop
开始小批量删除报表
继续努力争取保留报告的时间长度。原因是 Innodb 表在一次删除超过 10k 行时性能很差。如果您尝试删除几十万行,它将超时,并且无论如何您都必须将其分解为较小的删除。此外,Ruby rake 进程可能会使用您的所有 RAM,并且可能在完成之前被内核杀死。这种进展应该适用于大多数人,但如果您有很多个月的数据,您可能希望从最早的一两个月的记录开始。在我们的案例中,我们只保留 2 周(14 天)的报告。
根据 MySQL 的配置方式,有两种回收空间的方法。运行此命令以确定是否启用了“innodb_file_per_table”。如果是,则应将其设置为“ON”。注意:对于这种情况,我建议在您的 MySQL 上使用 innodb。
您还可以列出数据库以查看是否有更大的数据文件。最有可能很大的表是 resource_statuses.ibd。
如果 MySQL 配置了 innodb_file_per_table 并且您的 Dashoard DB 显示您的数据位于大型表文件中,请执行以下操作:
这将根据当前数据创建一个新表并将其复制到位。如果您在此过程中进行列表,您应该会看到如下内容:
完成后,它会将 tmp 文件复制到位。在这种情况下,我们从 15GB 增加到 708MB。
如果您的系统未配置 innodb_file_per_table 或所有当前数据都驻留在大型 ibdata 文件中,那么回收空间的唯一方法是擦除整个安装并重新导入所有数据。整体方法应该是这样的:首先配置innodb_file_per_table,dump所有数据库,然后停止Mysql,删除/var/lib/mysql,运行mysql_install_db再次创建/var/lib/mysql,启动MySQL,最后重新导入数据。由于数据导入,无需优化步骤。
最后,重启delayed_job:
cd /path/to/puppet-dashboard
env RAILS_ENV=生产脚本/delayed_job -p dashboard -n 2 -m start
每日报告清理和数据库维护:
对于每日报告清理,您可以创建一个简单的 BASH 脚本,该脚本按时间搜索 /var/lib/puppet/reports 上的报告(在我们的例子中为 mtime +14),删除它们,然后使用 (upto=2 unit= wk) 并将其设置在您的 crontab 中。脚本的一个示例可以是: