與 puppet-dashboard 一起使用時,如何防止 MySQL 增加其磁碟空間使用量?
設置
我們有一個使用 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 作業。
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 和天數 (day)、週數 (wk)、月數 (mon) 等以匹配您的系統及其需求。
- 停止傳入報告:
cd /path/to/puppet-dashboard
env RAILS_ENV=生產腳本/delayed_job -p dashboard -m stop 2. 開始小批量刪除報表
繼續努力爭取保留報告的時間長度。原因是 Innodb 表在一次刪除超過 10k 行時性能很差。如果您嘗試刪除幾十萬行,它將超時,並且無論如何您都必須將其分解為較小的刪除。此外,Ruby rake 程序可能會使用您的所有 RAM,並且可能在完成之前被核心殺死。這種進展應該適用於大多數人,但如果您有很多個月的數據,您可能希望從最早的一兩個月的記錄開始。在我們的案例中,我們只保留 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”。注意:對於這種情況,我建議在您的 MySQL 上使用 innodb。
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 DB 顯示您的數據位於大型表文件中,請執行以下操作:
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 文件複製到位。在這種情況下,我們從 15GB 增加到 708MB。
-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,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 7. 每日報告清理和數據庫維護:
對於每日報告清理,您可以創建一個簡單的 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