2 votes

Comment puis-je empêcher MySQL d'augmenter constamment son utilisation d'espace disque lorsqu'il est utilisé avec puppet-dashboard?

La configuration

Nous avons une configuration Debian Linux avec MySQL v5.1.73 (moteur de stockage innoDB) et puppet-dashboard version 1.2.23. Comme vous l'avez probablement deviné, puppet-dashboard utilise MySQL comme backend.

Aussi, cela ne devrait pas être pertinent mais il s'agit d'une machine virtuelle VMware sur vSphere 5.5.

Le problème

Le problème est que, malgré le nombre de nœuds puppet et la fréquence d'exécution restant relativement les mêmes, l'espace disque utilisé par MySQL continue d'augmenter de manière inquiétante jusqu'au point où cela devient maintenant un problème.

Le graphique suivant illustre le problème.

l'espace disque diminue

Nous avons mis en place deux tâches cron qui devraient permettre de libérer de l'espace disque. Elles sont les suivantes et s'exécutent quotidiennement :

  • rake RAILS_ENV=production db:raw:optimize
  • rake RAILS_ENV=production reports:prune:orphaned upto=3 unit=mon

Les chutes que vous pouvez voir dans le graphique sont les tâches cron qui s'exécutent et consomment plus d'espace en essayant de libérer de l'espace.

Les journaux binaires MySQL ne sont pas activés. 95% de l'espace disque utilisé sur ce serveur est situé dans le répertoire /var/lib/mysql/dashboard_production où les données MySQL sont stockées.

Nous avons eu ce problème auparavant avec une application différente (Zabbix monitoring) et avons dû sauvegarder la base de données et la réimporter pour libérer de l'espace. Il s'agissait d'un processus très douloureux et non une solution très élégante mais cela a finalement fonctionné.

Existe-t-il un moyen de récupérer cet espace disque ? Que pouvons-nous faire pour arrêter ce comportement ?

Modification 1

Nous utilisons en effet le moteur innoDB et nous n'utilisons pas la directive de configuration "innodb_file_per_table".

Comme demandé par Félix, la sortie de la commande est la suivante :

+----------------------+-------------------+-------------+
| 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 |
+----------------------+-------------------+-------------+

Aussi, je vais essayer la tâche reports:prune sans l'option "orphaned" comme mentionné ainsi que les autres alternatives et je mettrai à jour cette question.

Modification 2

J'ai exécuté la tâche rake reports:prune et, malgré la suppression de 230000 rapports, il continuait de consommer plus d'espace... Je vais donc passer aux autres options.

entrez la description de l'image ici

La solution

Après avoir supprimé les deux tiers des entrées de la base de données, cela n'a libéré que 200 Mo d'espace disque ce qui n'a pas de sens. Nous avons finalement sauvegardé le contenu et réimporté en veillant à activer "innodb_file_per_table".

Nous devrons juste attendre et voir si cela résout le problème à long terme mais pour le moment, cela semble être le cas.

1 votes

Utilisez-vous InnoDB? Vérifiez stackoverflow.com/questions/1270944/…

0 votes

Pouvez-vous identifier les tables les plus consommatrices d'espace? mysql -p information_schema -e 'select table_schema,table_name,data_length from tables order by data_length desc limit 10;'

0 votes

Ainsi, le gaspillage le plus significatif est resource_statuses. En regardant la croissance, il contient probablement des données historiques. Je ne suis pas sûr de comment aborder cela. Au moment venu, raccourcir les lignes manuellement :-)

3voto

Tommy Otzen Points 121

J'ai trouvé cet article qui semble traiter assez bien du problème

http://ximunix.blogspot.co.uk/2014/01/howto-cleanup-puppet-reports-and-db.html

publié par Ximena Cardinali

L'histoire courte est de commencer à supprimer les rapports en petits lots, puis de récupérer l'espace de MySQL


COMMENT nettoyer les rapports et la base de données Puppet

Si la base de données de Puppet Dashboard utilise plusieurs Go et devient de plus en plus grande chaque jour, voici une façon de récupérer de l'espace.

Il y a deux tâches rake que vous devriez exécuter tous les jours dans le cadre de la maintenance quotidienne de 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

Vous pouvez modifier le RAILS_ENV et le nombre de jours (jour), semaines (sem), mois (mois), etc. pour correspondre à votre système et à ses besoins.

  1. Arrêtez les rapports entrants:

    cd /chemin/vers/puppet-dashboard

    env RAILS_ENV=production script/delayed_job -p dashboard -m stop

  2. Commencez à supprimer les rapports par petits lots

Continuez ainsi jusqu'à ce que vous atteigniez la durée pendant laquelle vous souhaitez conserver les rapports. La raison en est que les tables Innodb ont de mauvaises performances lors de la suppression de plus de 10 000 lignes à la fois. Si vous essayez de supprimer quelques centaines de milliers de lignes, le processus expirera et vous devrez le diviser en suppressions plus petites de toute façon. De plus, le processus rake Ruby utilisera probablement tout votre RAM et risque probablement d'être interrompu par le noyau avant de terminer. Une progression de ce type devrait fonctionner pour la plupart des gens, mais si vous avez des données sur plusieurs mois, vous voudrez peut-être commencer par un ou deux mois de vos premiers enregistrements. Dans notre cas, nous ne conservons que les rapports des 2 dernières semaines (14 jours).

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
  1. Déterminez la meilleure méthode pour récupérer de l'espace de MySQL

Il existe deux méthodes pour récupérer de l'espace en fonction de la configuration de MySQL. Exécutez cette commande pour déterminer si "innodb_file_per_table" est activé. Il devrait être défini sur "ON" s'il l'est. REMARQUE: Je recommande d'utiliser innodb sur votre MySQL pour des cas comme celui-ci.

mysqladmin variables -u root -p | grep innodb_file_per_table

Vous pouvez également faire une liste de la base de données pour voir s'il existe des fichiers de données plus volumineux. La table la plus susceptible d'être grande est resource_statuses.ibd.

ls -lah /var/lib/mysql/dashboard_production
...
-rw-rw---- 1 mysql mysql      8,9K 08 janv. 12:50 resource_statuses.frm
-rw-rw---- 1 mysql mysql       15G 08 janv. 12:50 resource_statuses.ibd
...
  1. Récupérer de l'espace facilement

Si MySQL a été configuré avec innodb_file_per_table et que votre base de données Dashoard montre que vos données sont dans de grands fichiers de table, faites ce qui suit:

mysql -u root -p
use puppet_dashboard;
OPTIMIZE TABLE resource_statuses;

Cela créera une nouvelle table basée sur les données actuelles et la copiera en place. Si vous faites une liste pendant que cela est en cours, vous devriez voir quelque chose comme ceci:

-rw-rw---- 1 mysql mysql       8,9K 08 janv. 12:50 resource_statuses.frm
-rw-rw---- 1 mysql mysql        15G 08 janv. 12:50 resource_statuses.ibd
-rw-rw---- 1 mysql mysql       8,9K 08 janv. 12:50 #sql-379_415.frm
-rw-rw---- 1 mysql mysql       238M 08 janv. 12:51 #sql-379_415.ibd

Et une fois terminé, il copiera le fichier tmp en place. Dans ce cas, nous sommes passés de 15 Go à 708 Mo.

-rw-rw---- 1 mysql mysql 8,9K 08 janv. 13:01 resource_statuses.frm
-rw-rw---- 1 mysql mysql 708M 08 janv. 13:03 resource_statuses.ibd
  1. Récupérer de l'espace difficilement

Si votre système n'a pas été configuré avec innodb_file_per_table ou si toutes les données actuelles résident dans un grand fichier ibdata, la seule façon de récupérer de l'espace est d'effacer toute l'installation et de réimporter toutes les données. La méthode globale devrait être quelque chose comme ceci: Configurez d'abord innodb_file_per_table, exportez toutes les bases de données, puis arrêtez Mysql, supprimez /var/lib/mysql, exécutez mysql_install_db pour recréer /var/lib/mysql, démarrez MySQL, et enfin réimportez les données. Il ne sera pas nécessaire de passer par les étapes d'optimisation en raison de l'importation des données.

  1. Enfin, redémarrez le delayed_job :

    cd /chemin/vers/puppet-dashboard

    env RAILS_ENV=production script/delayed_job -p dashboard -n 2 -m start

  2. Nettoyage des rapports quotidiens et maintenance de la base de données :

Pour un nettoyage quotidien des rapports, vous pouvez créer un simple script BASH qui recherche les rapports sur /var/lib/puppet/reports par date de modification (mtime +14 dans notre cas), les supprime, puis nettoie la base de données avec (upto=2 unit=sem) et le placer dans votre crontab. Un exemple du script peut être :

#!/bin/bash
RAPPORTS=`find /var/lib/puppet/reports -type f -mtime +14`
for i in $RAPPORTS; do rm -f $i; done

cd /usr/share/puppet-dashboardenv RAILS_ENV=production rake reports:prune upto=2 unit=sem

0 votes

Oui, ne pas définir innodb_file_per_table est le principal suspect ici.

0 votes

@MichaelHampton Ah, mais alors les données ne se concentreraient pas dans un sous-arbre de /var/lib/mysql, mais plutôt dans les fichiers ibdata*, n'est-ce pas ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X