Ti piacerebbe imparare come eseguire un partizionamento del database Zabbix? In questo tutorial, vi mostreremo come partizionare il database MySQL di Zabbix su un computer su cui è in esecuzione Ubuntu Linux.

• Versione Zabbix: 4.0.5
• Linux: Ubuntu 18.04
• MySQL: Ver 14.14 Distrib 5.7.25

Il nostro tutorial considera una nuova installazione di Zabbix.

Elenco Hardware:

La seguente sezione presenta l'elenco delle apparecchiature utilizzate per creare questo tutorial di Zabbix.

Tutti i componenti hardware sopra elencati sono disponibili sul sito Web di Amazon.

Zabbix Playlist:

In questa pagina, offriamo un rapido accesso a un elenco di video relativi all'installazione di Zabbix.

Non dimenticare di iscriverti al nostro canale youtube chiamato FKIT.

Esercitazione - Partizionamento del Database Zabbix

Utilizzare il seguente comando per installare il software richiesto.

# apt-get update
# apt-get install perl libdbi-perl libdatetime-perl libdbd-mysql-perl

Abbiamo bisogno di partizionare le seguenti tabelle dal database di Zabbix:

• storia
• history_log
• history_str
• history_text
• history_uint
• tendenze
• trends_uint

Il tuo server Zabbix probabilmente ha già informazioni dal monitoraggio all'interno del suo database.

Accedere alla console MySQL e verificare la data di inserimento più vecchia di Zabbix per le 7 tabelle sopra elencate:

# mysql -u root -p

use zabbix;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `history`;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `history_log`;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `history_str`;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `history_text`;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `history_uint`;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `trends`;
SELECT FROM_UNIXTIME(MIN(clock)) FROM `trends_uint`;

Per ognuno di questi comandi MySQL, l'output dovrebbe essere qualcosa di simile a questo:

+---------------------------------------+
| FROM_UNIXTIME(MIN(clock)) |
+---------------------------------------+
| 2019-03-22 17:48:07                       |
+---------------------------------------+
1 row in set (0.00 sec)

Importante! Prendi nota della data visualizzata per ciascuna delle tabelle.

Ora, partizioniamo ciascuna delle tabelle della cronologia per data:

Per prima cosa, partizioniamo la tabella Cronologia.

# mysql -u root -p
# use zabbix;

ALTER TABLE `history` PARTITION BY RANGE ( clock)
(PARTITION p2019_03_22 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-23 00:00:00")) ENGINE = InnoDB);

Nel nostro esempio, un file denominato p2019_03_22 avrà tutte le informazioni MySQL prima del 2019-03-23.

Se la data di destinazione è 2019-03-22, è necessario inserire tutto prima del 2019-03-23.

In secondo luogo, partizioniamo la tabella history_log.

ALTER TABLE `history_log` PARTITION BY RANGE ( clock)
(PARTITION p2019_03_22 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-23 00:00:00")) ENGINE = InnoDB);

In terzo luogo, partizioniamo la tabella history_str.

ALTER TABLE `history_str` PARTITION BY RANGE ( clock)
(PARTITION p2019_03_22 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-23 00:00:00")) ENGINE = InnoDB);

In quarto luogo, partizioniamo la tabella history_text.

ALTER TABLE `history_text` PARTITION BY RANGE ( clock)
(PARTITION p2019_03_22 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-23 00:00:00")) ENGINE = InnoDB);

In quinto luogo, partizioniamo la tabella history_uint.

ALTER TABLE `history_uint` PARTITION BY RANGE ( clock)
(PARTITION p2019_03_22 VALUES LESS THAN (UNIX_TIMESTAMP("2019-03-23 00:00:00")) ENGINE = InnoDB);

Ora, partizioniamo ciascuna delle tabelle delle tendenze in base al mese:

Per prima cosa, dividiamo la tabella delle tendenze.

ALTER TABLE `trends` PARTITION BY RANGE ( clock)
(PARTITION p2019_03 VALUES LESS THAN (UNIX_TIMESTAMP("2019-04-01 00:00:00")) ENGINE = InnoDB);

Nel nostro esempio, un file denominato p2019_03 avrà tutte le informazioni MySQL prima del 2019-04-01.

Se la data di destinazione è 2019-03, è necessario inserire tutto prima del 2019-04-01.

In secondo luogo, partizioniamo la tabella trends_uint.

ALTER TABLE `trends_uint` PARTITION BY RANGE ( clock)
(PARTITION p2019_03 VALUES LESS THAN (UNIX_TIMESTAMP("2019-04-01 00:00:00")) ENGINE = InnoDB);

Database di Zabbix Le partizioni sono state create con successo.

Esercitazione - Script di Partizionamento del Database Zabbix

Useremo uno script Perl per svolgere le seguenti attività:

Creare in anticipo 10 giorni di partizione del database MySQL per impedire l'interruzione del servizio.

Elimina le vecchie partizioni MySQL che non sono più necessarie.

# mkdir /downloads/zabbix_script
# cd /downloads/zabbix_script
# vi zabbix_partition_creator.pl

Ecco il contenuto dello script zabbix_partition_creator.pl:

use strict;
use Data::Dumper;
use DBI;
use Sys::Syslog qw(:standard :macros);
use DateTime;
use POSIX qw(strftime);
openlog("mysql_zbx_part", "ndelay,pid", LOG_LOCAL0);
my $db_schema = 'zabbix';
my $dsn = 'DBI:mysql:'.$db_schema.':mysql_socket=/var/run/mysqld/mysqld.sock';
my $db_user_name = 'zabbix';
my $db_password = 'kamisama123';
my $tables = ;
my $amount_partitions = 10;
my $curr_tz = 'America/Sao_Paulo';
my $part_tables;
my $dbh = DBI->connect($dsn, $db_user_name, $db_password, );
my $sth = $dbh->prepare(qq);
$sth->execute($db_schema);
while (my $row = $sth->fetchrow_hashref())
$sth->finish();
foreach my $key (sort keys %)
delete_old_data();
$dbh->disconnect();
sub create_next_partition
sub remove_old_partitions
sub name_next_part
sub date_next_part
sub delete_old_data

È necessario modificare le seguenti parti dello script per riflettere il proprio ambiente MySQL.

my $db_schema = 'zabbix';
my $dsn = 'DBI:mysql:'.$db_schema.':mysql_socket=/var/run/mysqld/mysqld.sock';
my $db_user_name = 'zabbix';
my $db_password = 'kamisama123';
my $tables = ;
my $amount_partitions = 10;
my $curr_tz = 'America/Sao_Paulo';

Nel nostro esempio, stiamo usando il nome utente MySQL zabbix e la password MySQL kamisama123.

Nel nostro esempio, manteniamo 30 giorni di contenuto nelle tabelle della cronologia.

Nel nostro esempio, stiamo mantenendo 2 mesi di contenuto delle tabelle di tendenza.

Nel nostro esempio, impostiamo il fuso orario della data America / Sao_Paulo.

Ora, è necessario eseguire manualmente lo script senza errori.

# cd /downloads/zabbix_script
# chmod 700 zabbix_partition_creator.pl
# ./zabbix_partition_creator.pl

Accedi alla console MySQL e verifica che il sistema abbia creato in anticipo 10 giorni di partizione della cronologia.

# mysql -u root -p

use zabbix;
show create table history;

/*!50100 PARTITION BY RANGE ( clock)
(PARTITION p2019_03_22 VALUES LESS THAN (1553310000) ENGINE = InnoDB,
PARTITION p2019_03_23 VALUES LESS THAN (1553396400) ENGINE = InnoDB,
PARTITION p2019_03_24 VALUES LESS THAN (1553482800) ENGINE = InnoDB,
PARTITION p2019_03_25 VALUES LESS THAN (1553569200) ENGINE = InnoDB,
PARTITION p2019_03_26 VALUES LESS THAN (1553655600) ENGINE = InnoDB,
PARTITION p2019_03_27 VALUES LESS THAN (1553742000) ENGINE = InnoDB,
PARTITION p2019_03_28 VALUES LESS THAN (1553828400) ENGINE = InnoDB,
PARTITION p2019_03_29 VALUES LESS THAN (1553914800) ENGINE = InnoDB,
PARTITION p2019_03_30 VALUES LESS THAN (1554001200) ENGINE = InnoDB,
PARTITION p2019_03_31 VALUES LESS THAN (1554087600) ENGINE = InnoDB,
PARTITION p2019_04_01 VALUES LESS THAN (1554174000) ENGINE = InnoDB) */

Accedi alla console MySQL e verifica che il sistema abbia creato 10 mesi di partizioni delle tendenze in anticipo.

# mysql -u root -p

use zabbix;
show create table trends;

/*!50100 PARTITION BY RANGE ( clock)
(PARTITION p2019_03 VALUES LESS THAN (1554087600) ENGINE = InnoDB,
PARTITION p2019_04 VALUES LESS THAN (1556679600) ENGINE = InnoDB,
PARTITION p2019_05 VALUES LESS THAN (1559358000) ENGINE = InnoDB,
PARTITION p2019_06 VALUES LESS THAN (1561950000) ENGINE = InnoDB,
PARTITION p2019_07 VALUES LESS THAN (1564628400) ENGINE = InnoDB,
PARTITION p2019_08 VALUES LESS THAN (1567306800) ENGINE = InnoDB,
PARTITION p2019_09 VALUES LESS THAN (1569898800) ENGINE = InnoDB,
PARTITION p2019_10 VALUES LESS THAN (1572577200) ENGINE = InnoDB,
PARTITION p2019_11 VALUES LESS THAN (1575165600) ENGINE = InnoDB,
PARTITION p2019_12 VALUES LESS THAN (1577844000) ENGINE = InnoDB,
PARTITION p2020_01 VALUES LESS THAN (1580522400) ENGINE = InnoDB) */ |

Ora, pianifichiamo lo script Perl per l'esecuzione giornaliera.

# crontab -e

1  0  *  *  * /downloads/scripts/zabbix_partition_creator.pl

Congratulazioni! Hai partizionato le tabelle del database MySQL di Zabbix.