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
Parabéns pelo artigo Everaldo. Foi muito útil.
ResponderExcluirEveraldo
ResponderExcluirresolveu meus problemas, Parabéns
Parabéns pelo tópico amigo, muito útil mesmo!!!!
ResponderExcluirExcelente 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?
ResponderExcluirObrigado pelo comentário, quando você fizer backup do banco precisa fazer completo junto com as procedures. Daí importa e basta apenas agendar.
ExcluirBoa tarde
ResponderExcluirEu tenho um banco com galera cluster, eu preciso executar o procedimento nos dois nos do banco?
Será replicado em ambos os lugares, logo precisa executar apenas em um nó.
Excluir