Como eu mantenho o MySQL sempre aumentando seu uso de espaço em disco quando usado com o painel de fantoches?

2

A configuração

Nós temos um Debian Linux configurado com o MySQL v5.1.73 (mecanismo de armazenamento innoDB) e o painel de marionetes versão 1.2.23. Como você provavelmente adivinhou, o painel de fantoches está usando o MySQL como seu back-end.

Além disso, não deve ser relevante, mas sim uma máquina virtual VMware no vSphere 5.5.

O problema

O problema é que, apesar do número de nodos de fantoches e frequência de execução permanecerem relativamente os mesmos, o espaço em disco usado pelo MySQL continua aumentando de forma perturbadora a ponto de se tornar um problema.

O gráfico a seguir ilustra o problema.

Colocamosemfuncionamentoasduastarefascronquedevempermitirqueoespaçoemdiscosejaliberado.Elessãoosseguinteseambossãoexecutadosdiariamente:

  • rakeRAILS_ENV=dbdeprodução:raw:otimizar
  • rakeRAILS_EN=relatóriosdeprodução:ameixaseca:órfãoaté=3unidades=mon

Asquedasquevocêpodevernográficosãoastarefascronexecutandoeocupandomaisespaçotentandoliberaralgumespaço.

OsregistrosbináriosdoMySQLnãoestãohabilitados.95%doespaçoemdiscousadonesteservidorestálocalizadoem/var/lib/mysql/dashboard_production,queéodiretórioondeosdadosdoMySQLestãoarmazenados.

Játivemosesseproblemaantescomumaplicativodiferente(monitoramentodoZabbix)etivemosquedescarregarobancodedadosereimportá-loparaliberarespaço.Estefoiumprocessomuitodolorosoenãoumasoluçãomuitoelegante,masacaboufuncionando.

Existealgumamaneiraderecuperarmosesteespaçoemdisco?Oquepodemosfazerparaimpediressecomportamento?

Editar1

EstamosrealmenteusandooinnoDBenãoestamosusandoadiretivadeconfiguração"innodb_file_per_table".

Conforme solicitado pelo Felix, a saída do comando é a seguinte:

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

Além disso, tentarei os relatórios: podar a tarefa sem a opção "órfã", conforme mencionado, bem como as outras alternativas, e manteremos essa questão atualizada.

Editar 2

Eu corri os relatórios: podar tarefa rake e, apesar de eliminar 230000 relatórios, ele continuou comendo mais espaço ... Eu, portanto, passar para as outras opções.

Asolução

Apósexcluirdoisterçosdasentradasnobancodedados,eleliberouapenas200MBdeespaçoemdiscosemsentido.Acabamosdespejandooconteúdoereimportando-otomandocuidadoparahabilitar"innodb_file_per_table".

Só teremos que esperar para ver se isso resolve a solução a longo prazo, mas parece ser o caso no momento.

    
por Antoine Benkemoun 27.08.2014 / 17:16

1 resposta

3

Eu encontrei este artigo que parece abordar a questão muito bem

link

postado por Ximena Cardinali

O conto começa a deletar relatórios em pequenos lotes e depois recupera o espaço do MySQL

Como limpar os relatórios de marionetes e o banco de dados

Se o banco de dados do Puppet Dashboard estiver usando vários GB e aumentando a cada dia, essa é uma maneira de recuperar parte do espaço.

Existem dois trabalhos de rake que você deve executar todos os dias como parte da manutenção diária do 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

Você pode alterar o RAILS_ENV e o número do dia (dia), semanas (semanas), meses (mês), etc. para corresponder ao seu sistema e às suas necessidades.

  1. Parar os relatórios recebidos:

    cd / path / to / puppet-dashboard

    env RAILS_ENV = roteiro de produção / delayed_job -p dashboard -m stop

  2. Inicie a exclusão de relatórios em pequenos lotes

Continue trabalhando até o tempo que você deseja manter relatórios. A razão para isso é que as tabelas Innodb têm um desempenho ruim ao excluir mais de 10 mil linhas por vez. Se você tentar excluir algumas centenas de milhares de linhas, o tempo limite será esgotado e você terá que dividi-las em exclusões menores de qualquer forma. Também o processo de rake do Ruby provavelmente usará toda a sua RAM e provavelmente será morto pelo kernel antes de terminar. Algo como essa progressão deve funcionar para a maioria das pessoas, mas se você tiver muitos meses de dados, talvez queira começar com um mês ou dois de seus primeiros registros. No nosso caso, estamos mantendo apenas 2 semanas de relatórios (14 dias).

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. Determine o melhor método para recuperar espaço do MySQL

Existem dois métodos para recuperar espaço, dependendo de como o MySQL foi configurado. Execute este comando para determinar se "innodb_file_per_table" está ativado. Deve ser definido como "ON" se for. NOTA: Eu recomendo usar o innodb no seu MySQL para casos como este.

mysqladmin variables -u root -p | grep innodb_file_per_table

Você também pode fazer uma listagem do banco de dados para ver se há arquivos de dados maiores. A tabela com maior probabilidade de ser grande é 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
...
  1. Recuperando espaço da maneira mais fácil

Se o MySQL foi configurado com innodb_file_per_table e seu Dashoard DB mostrar que seus dados estão em arquivos de tabelas grandes, faça o seguinte:

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

Isso criará uma nova tabela com base nos dados atuais e a copiará no lugar. Se você fizer uma listagem enquanto estiver em andamento, verá algo assim:

-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

E quando terminar, copiaremos o arquivo tmp no lugar. Neste caso, passamos de 15 GB para 708 MB.

-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
  1. Recuperando espaço da maneira mais difícil

Se o seu sistema não foi configurado com innodb_file_per_table ou todos os dados atuais residem em um grande arquivo ibdata, a única maneira de recuperar espaço é limpar toda a instalação e reimportar todos os dados. O método geral deve ser algo como: Primeiro configure innodb_file_per_table, despeje todos os bancos de dados, então pare o Mysql, delete / var / lib / mysql, execute mysql_install_db para criar / var / lib / mysql novamente, inicie o MySQL e finalmente reimporte os dados. Não haverá necessidade de otimizar as etapas devido à importação de dados.

  1. Finalmente, reinicie o delayed_job:

    cd / path / to / puppet-dashboard

    env RAILS_ENV = script de produção / delayed_job -p dashboard -n 2 -m start

  2. Limpeza de relatórios diários e manutenção de banco de dados:

Para uma limpeza diária de relatórios, você pode criar um script BASH simples que pesquise os relatórios em / var / lib / puppet / reports por hora (mtime +14 no nosso caso), remova-os e limpe o banco de dados com (upto = 2 unidades = semana) e coloque-o no seu crontab. Um exemplo do script pode ser:

#!/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
    
por 27.08.2014 / 17:30