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).

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

3 comentários: