terça-feira, 28 de janeiro de 2020

[Sobre o Zabbix] Particionamento do Banco MySQL/MariaDB


Neste tutorial, aprenderemos, passo a passo, como particionar o banco de dados Zabbix (historys e trends) no MySQL ou MariaDB.

O Zabbix guarda os dados coletados em dois formatos: history e trends. O primeiro tipo (histórico), como o próprio nome indica, guarda todos os valores coletados, sem nenhuma sumarização. Por outro lado, as médias guardam os dados sumarizados de hora a hora visando possibilitar a geração de gráficos e outras informações com um custo menor para o banco de dados.

O processo housekeeping do Zabbix é responsável pela exclusão de dados antigos de trends e history. A remoção de dados antigos do banco de dados usa consulta de exclusão do SQL e pode afetar negativamente o desempenho do banco de dados. Muitos de nós recebemos o alarme irritante “Zabbix housekeeper processes more than 75% busy” por causa disso.

Esse problema pode ser facilmente resolvido com o particionamento de banco de dados. O particionamento cria tabelas para cada hora ou dia (conforme schedulado) e as elimina quando não são mais necessárias. O SQL DROP é muito mais eficiente que a instrução DELETE.

Você pode usar este tutorial para qualquer versão do Zabbix após a versão 3.0 (3.2, 3.4, 4.0, 4.2, 4.4, 5.0, 6.0, 7.0).

Antes de continuarmos, faça um backup do banco de dados Zabbix, mas se a instalação for nova, não haverá necessidade de backup. Também é recomendado parar o Zabbix Server antes de iniciar este procedimento.

Sem mais delongas, vamos logo à prática. \O/

Etapa 1: Faça o download do script para particionamento

yum install git dos2unix

git clone https://github.com/everaldoscabral/particionamento_MySQL-MariaDB.git

cd particionamento_MySQL-MariaDB/

chmod +x zbx_db_partitiong.sql

dos2unix zbx_db_partitiong.sql

Realize o download do arquivo, envie/descompacte o Arquivo (zbx_db_partitiong.sql)  no seu servidor de Banco de Dados.

Nativamente no MySQL o event scheduler vem desabilitado, é necessário habilitar no arquivo my.cnf:

[mysqld] 
event_scheduler = ON
Depois basta reiniciar o mysql.

O script “zbx_db_partitiong.sql” está configurado para manter 7 dias de dados de histórico (history) e 365 dias de dados de estatísticas (trend) - vá para a etapa 2 se essas configurações lhe atende.

Mas caso queira alterar os dias de histórico e estatísticas, abra o arquivo "zbx_db_partitiong.sql" e altere os parâmetros conforme imagem abaixo:


Etapa 2: Criando procedimento de particionamento  com o script


A sintaxe para a execução de script é “mysql -u '<db_username>' -p'<db_password>' <zb_database_name> < zbx_db_partitiong.sql“. Agora executo-o no banco de dados do Zabbix, conforme exemplo:

mysql -u 'zabbix' -p'zabbixDBpass' zabbix <  zbx_db_partitiong.sql

O script irá criar procedimentos de particionamento de forma rápida em banco novo mas em banco grande, isso pode demorar horas.

Etapa 3: Criando um job no crontab

Abra o crontab com o comando "sudo crontab -e" e adicione a linha mais abaixo, onde será executado todos os dias às 03:30:

30 03 * * * /usr/bin/mysql -u 'zabbix' -p'zabbixDBpass' zabbix -e "CALL partition_maintenance_all('zabbix');" > /tmp/CronDBpartitiong.log 2>&1

Salve e feche o crontab.

O crontab irá executar todos os dias conforme programado descartando tabelas antigas e criando novas e a saída de execução do crontab ficará registrado em “/tmp/CronDBpartitiong.log“

Caso não queira esperar a execução do crontab você pode executar direto no terminal:

root@dbserver:~ $ mysql -u 'zabbix' -p'zabbixDBpass' zabbix -e "CALL partition_maintenance_all('zabbix');"
+-----------------------------------------------------------+
 | msg                                                       |
 +-----------------------------------------------------------+
 | partition_create(zabbix,history,p201910150000,1571180400) |
 +-----------------------------------------------------------+
 +-----------------------------------------------------------+
 ...etc.

Verifique o status do particionamento após finalização de execução:

root@dbserver:~ $ mysql -u 'zabbix' -p'zabbixDBpass' zabbix -e "show create table history\G"
         Table: history
  Create Table: CREATE TABLE history (
    itemid bigint(20) unsigned NOT NULL,
    clock int(11) NOT NULL DEFAULT '0',
    value double(16,4) NOT NULL DEFAULT '0.0000',
    ns int(11) NOT NULL DEFAULT '0',
    KEY history_1 (itemid,clock)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
  /*!50100 PARTITION BY RANGE (clock)
  (PARTITION p201910140000 VALUES LESS THAN (1571094000) ENGINE = InnoDB,
   PARTITION p201910150000 VALUES LESS THAN (1571180400) ENGINE = InnoDB,
   PARTITION p201910160000 VALUES LESS THAN (1571266800) ENGINE = InnoDB) */
root@dbserver:~ $ mysql -u 'zabbix' -p'zabbixDBpass' zabbix -e "show create table trends\G"
         Table: trends
  Create Table: CREATE TABLE trends (
    itemid bigint(20) unsigned NOT NULL,
    clock int(11) NOT NULL DEFAULT '0',
    num int(11) NOT NULL DEFAULT '0',
    value_min double(16,4) NOT NULL DEFAULT '0.0000',
    value_avg double(16,4) NOT NULL DEFAULT '0.0000',
    value_max double(16,4) NOT NULL DEFAULT '0.0000',
    PRIMARY KEY (itemid,clock)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
  /*!50100 PARTITION BY RANGE (clock)
  (PARTITION p201910140000 VALUES LESS THAN (1571094000) ENGINE = InnoDB,
   PARTITION p201910150000 VALUES LESS THAN (1571180400) ENGINE = InnoDB,
   PARTITION p201910160000 VALUES LESS THAN (1571266800) ENGINE = InnoDB) */
Como pode verificar na saída, foi criada 3 partições para as tabelas history e trends.

Etapa 4: Configurando o  Housekeeping no Zabbix Frontend

Configue o housekeeping como imagem abaixo:



Se a imagem não for de auto-entendimento, abaixo seguem explicações:

  • Vá para Housekeeping: Administration -> General -> Housekeeping;
  • Desmarque a seleção “Enable internal housekeeping” em History e Trends;
  • Marque a opção “Override item trend period” em History e Trends;
  • Defina os dias em“data storage period” para History e Trends (conforme configurado no particionamento, informado no script);
  • Clique no botão Update.

Bom é isso, espero ter ajudado!

Abraços.
\O

7 comentários:

  1. Parabéns pelo artigo Everaldo. Foi muito útil.

    ResponderExcluir
  2. Everaldo
    resolveu meus problemas, Parabéns

    ResponderExcluir
  3. Parabéns pelo tópico amigo, muito útil mesmo!!!!

    ResponderExcluir
  4. Excelente tutorial! Tenho uma dúvida, eu estou usando esse particionamento em um servidor antigo. Agora preciso migrar para um servidor novo. Eu crio esse processo de particionamento antes? e depois migro os dados? ou migro os dados e depois crio o particionamento?

    ResponderExcluir
    Respostas
    1. Obrigado pelo comentário, quando você fizer backup do banco precisa fazer completo junto com as procedures. Daí importa e basta apenas agendar.

      Excluir
  5. Boa tarde
    Eu tenho um banco com galera cluster, eu preciso executar o procedimento nos dois nos do banco?

    ResponderExcluir
    Respostas
    1. Será replicado em ambos os lugares, logo precisa executar apenas em um nó.

      Excluir