Ad Widget

Collapse

Zabbix партиционирование

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Fractal1990
    Senior Member
    • Mar 2016
    • 129

    #1

    Zabbix партиционирование

    Приветствую, собираюсь делать партиционирование, zabbix последней версии, база уже 220 Gb (работает все равно шустро, но хаускипер долго чистит), нашел статью - http://unixadm.info/content/разбиени...;-zabbix-mysql я так понимаю бэкап делать нет смысла? т.к. выделено всего 320 гигов (виртуалка) и просто не влезет?, далее как я понял я к примеру хочу сохранить последнюю неделю инфы, т.е. к примеру секционирование запущу 27.07.2016 и интервал дней сделаю с 20 по 28, также не могу найти в статье через какой срок будет удаляться старая инфа? или все будет зависеть от настроек очитски в вебе?
  • id2669099
    Member
    • Mar 2016
    • 68

    #2
    Originally posted by Fractal1990
    , далее как я понял я к примеру хочу сохранить последнюю неделю инфы, т.е. к примеру секционирование запущу 27.07.2016 и интервал дней сделаю с 20 по 28, также не могу найти в статье через какой срок будет удаляться старая инфа? или все будет зависеть от настроек очитски в вебе?
    думаю что в любом случае надо делать дамп, а потом уже удалить ненужные таблицы, но могу ошибаться

    на счёт очистки, в статье указано что его отключить нужно, очисткой ненужных данных занимается процедура drop_partitions, для каждой таблицы задаются свои параметры для очистки
    https://www.zabbix.org/wiki/Docs/howto/mysql_partition - я когда делал партицирование, ориентировался на эту статью, на 3 версии заббикса всё корректно работает и от себя добавлю, что всё это дело надо повесить на встроенный планировщик(event_sheduler) в mysql

    Comment

    • yukra
      Senior Member
      • Apr 2013
      • 1359

      #3
      Originally posted by Fractal1990
      Приветствую, собираюсь делать партиционирование, zabbix последней версии, база уже 220 Gb (работает все равно шустро, но хаускипер долго чистит), нашел статью - http://unixadm.info/content/разбиени...;-zabbix-mysql я так понимаю бэкап делать нет смысла? т.к. выделено всего 320 гигов (виртуалка) и просто не влезет?, далее как я понял я к примеру хочу сохранить последнюю неделю инфы, т.е. к примеру секционирование запущу 27.07.2016 и интервал дней сделаю с 20 по 28, также не могу найти в статье через какой срок будет удаляться старая инфа? или все будет зависеть от настроек очитски в вебе?
      Вы видимо как-то не так понимаете суть партицирования, после него заббиксе полностью перестает управлять хранением истории, и за этоначинают отвечать хранимые процедуры в mysql

      Comment

      • Fractal1990
        Senior Member
        • Mar 2016
        • 129

        #4
        Originally posted by yukra
        Вы видимо как-то не так понимаете суть партицирования, после него заббиксе полностью перестает управлять хранением истории, и за этоначинают отвечать хранимые процедуры в mysql
        разве? я думал только теряется работа хаускипера, а хранение истории в днях остается, если нет то как можно настроить удаление только после к примеру 90 дней. в остальном я верно предположил по поводу 7 дней?

        Comment

        • Fractal1990
          Senior Member
          • Mar 2016
          • 129

          #5
          Originally posted by id2669099
          думаю что в любом случае надо делать дамп, а потом уже удалить ненужные таблицы, но могу ошибаться

          на счёт очистки, в статье указано что его отключить нужно, очисткой ненужных данных занимается процедура drop_partitions, для каждой таблицы задаются свои параметры для очистки
          https://www.zabbix.org/wiki/Docs/howto/mysql_partition - я когда делал партицирование, ориентировался на эту статью, на 3 версии заббикса всё корректно работает и от себя добавлю, что всё это дело надо повесить на встроенный планировщик(event_sheduler) в mysql
          пробовал по этой статье начать, в главе "Stored Procedures" при вставке кода выдавал какую то ошибку, сейчас не помню на память

          Comment

          • Fractal1990
            Senior Member
            • Mar 2016
            • 129

            #6
            Originally posted by Fractal1990
            пробовал по этой статье начать, в главе "Stored Procedures" при вставке кода выдавал какую то ошибку, сейчас не помню на память
            зашел в mysql> и далее в этом контексте мне вставлять?

            Code:
            DELIMITER $$
            CREATE PROCEDURE `partition_create`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
            BEGIN
                    /*
                       SCHEMANAME = The DB schema in which to make changes
                       TABLENAME = The table with partitions to potentially delete
                       PARTITIONNAME = The name of the partition to create
                    */
                    /*
                       Verify that the partition does not already exist
                    */
            
                    DECLARE RETROWS INT;
                    SELECT COUNT(1) INTO RETROWS
                    FROM information_schema.partitions
                    WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_description >= CLOCK;
            
                    IF RETROWS = 0 THEN
                            /*
                               1. Print a message indicating that a partition was created.
                               2. Create the SQL to create the partition.
                               3. Execute the SQL from #2.
                            */
                            SELECT CONCAT( "partition_create(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;
                            SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );
                            PREPARE STMT FROM @sql;
                            EXECUTE STMT;
                            DEALLOCATE PREPARE STMT;
                    END IF;
            END$$
            DELIMITER ;
            вставлять полностью?

            Comment

            • Fractal1990
              Senior Member
              • Mar 2016
              • 129

              #7
              Originally posted by Fractal1990
              зашел в mysql> и далее в этом контексте мне вставлять?

              Code:
              DELIMITER $$
              CREATE PROCEDURE `partition_create`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
              BEGIN
                      /*
                         SCHEMANAME = The DB schema in which to make changes
                         TABLENAME = The table with partitions to potentially delete
                         PARTITIONNAME = The name of the partition to create
                      */
                      /*
                         Verify that the partition does not already exist
                      */
              
                      DECLARE RETROWS INT;
                      SELECT COUNT(1) INTO RETROWS
                      FROM information_schema.partitions
                      WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_description >= CLOCK;
              
                      IF RETROWS = 0 THEN
                              /*
                                 1. Print a message indicating that a partition was created.
                                 2. Create the SQL to create the partition.
                                 3. Execute the SQL from #2.
                              */
                              SELECT CONCAT( "partition_create(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;
                              SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );
                              PREPARE STMT FROM @sql;
                              EXECUTE STMT;
                              DEALLOCATE PREPARE STMT;
                      END IF;
              END$$
              DELIMITER ;
              вставлять полностью?

              Comment

              • Dorlas
                Member
                • May 2016
                • 31

                #8
                Originally posted by Fractal1990
                Приветствую, собираюсь делать партиционирование, zabbix последней версии, база уже 220 Gb (работает все равно шустро, но хаускипер долго чистит), нашел статью - http://unixadm.info/content/разбиени...;-zabbix-mysql я так понимаю бэкап делать нет смысла? т.к. выделено всего 320 гигов (виртуалка) и просто не влезет?, далее как я понял я к примеру хочу сохранить последнюю неделю инфы, т.е. к примеру секционирование запущу 27.07.2016 и интервал дней сделаю с 20 по 28, также не могу найти в статье через какой срок будет удаляться старая инфа? или все будет зависеть от настроек очитски в вебе?
                Я недавно делал партиции.

                Инструкция как я делал:
                1. Сделали backup больших таблиц (history_uint, history, history_text, history_log, history_str)
                mysqldump --no-create-info --lock-tables -u zabbix -p zabbix history_str > backup_history_str.sql

                2. Очищаем таблицу (проще дропнуть таблицу и создать заново)

                3. Слегка меняем структуры таблиц
                ALTER TABLE `history_log` DROP PRIMARY KEY, ADD PRIMARY KEY (`itemid`,`id`,`clock`);
                ALTER TABLE `history_log` DROP KEY `history_log_2`;
                ALTER TABLE `history_text` DROP PRIMARY KEY, ADD PRIMARY KEY (`itemid`,`id`,`clock`);
                ALTER TABLE `history_text` DROP KEY `history_text_2`;

                4. Создаем partition table с делением по дням
                ALTER TABLE `history_str` PARTITION BY RANGE( clock ) (
                PARTITION p20160705 VALUES LESS THAN (UNIX_TIMESTAMP("2016-07-06 00:00:00")),
                PARTITION p20160706 VALUES LESS THAN (UNIX_TIMESTAMP("2016-07-07 00:00:00")),
                PARTITION p20160707 VALUES LESS THAN (UNIX_TIMESTAMP("2016-07-08 00:00:00")),
                PARTITION p20160708 VALUES LESS THAN (UNIX_TIMESTAMP("2016-07-09 00:00:00"))
                );

                5. Загружаете из бекапа все таблицы
                mysql -u zabbix -p zabbix < 20160704_history_log.sql

                Готово

                Теперь добавление новой партиции в ручном режиме
                ALTER TABLE `history_str` ADD PARTITION (PARTITION p20160705 VALUES LESS THAN (UNIX_TIMESTAMP("2016-07-06 00:00:00")));
                Удаление
                ALTER TABLE `history_str` DROP PARTITION p20160627;

                Теперь по подрезке БД, я не стал использовать процедуры в mysql, а написал скрипт по подрезке и созданию партиций, в скрипте использую команду по создание партиции:
                mysql -u zabbix zabbix --execute="ALTER TABLE $TABLE DROP PARTITION p$DATE_OLD"

                и аналогичная по созданию партиции,
                теперь при необходимости увеличить/уменьшить кол-во хранения дней, правим одну цифру внутри скрипта...

                Comment

                • Fractal1990
                  Senior Member
                  • Mar 2016
                  • 129

                  #9
                  Originally posted by dorlas
                  Я недавно делал партиции.

                  Инструкция как я делал:
                  1. Сделали backup больших таблиц (history_uint, history, history_text, history_log, history_str)
                  mysqldump --no-create-info --lock-tables -u zabbix -p zabbix history_str > backup_history_str.sql

                  2. Очищаем таблицу (проще дропнуть таблицу и создать заново)

                  3. Слегка меняем структуры таблиц
                  alter table `history_log` drop primary key, add primary key (`itemid`,`id`,`clock`);
                  alter table `history_log` drop key `history_log_2`;
                  alter table `history_text` drop primary key, add primary key (`itemid`,`id`,`clock`);
                  alter table `history_text` drop key `history_text_2`;

                  4. Создаем partition table с делением по дням
                  alter table `history_str` partition by range( clock ) (
                  partition p20160705 values less than (unix_timestamp("2016-07-06 00:00:00")),
                  partition p20160706 values less than (unix_timestamp("2016-07-07 00:00:00")),
                  partition p20160707 values less than (unix_timestamp("2016-07-08 00:00:00")),
                  partition p20160708 values less than (unix_timestamp("2016-07-09 00:00:00"))
                  );

                  5. Загружаете из бекапа все таблицы
                  mysql -u zabbix -p zabbix < 20160704_history_log.sql

                  Готово

                  Теперь добавление новой партиции в ручном режиме
                  alter table `history_str` add partition (partition p20160705 values less than (unix_timestamp("2016-07-06 00:00:00")));
                  Удаление
                  alter table `history_str` drop partition p20160627;

                  Теперь по подрезке БД, я не стал использовать процедуры в mysql, а написал скрипт по подрезке и созданию партиций, в скрипте использую команду по создание партиции:
                  Mysql -u zabbix zabbix --execute="alter table $table drop partition p$date_old"

                  и аналогичная по созданию партиции,
                  теперь при необходимости увеличить/уменьшить кол-во хранения дней, правим одну цифру внутри скрипта...
                  Хм. На выходных попробую, а создание и удаление все вручную будет? Скрипт скинете?

                  Comment

                  • Dorlas
                    Member
                    • May 2016
                    • 31

                    #10
                    Originally posted by fractal1990
                    Хм. На выходных попробую, а создание и удаление все вручную будет? Скрипт скинете?
                    Там элементарный скрипт, пишится за 5 минут...

                    Вам нужно будет решить проблему с вводом пароля, и подстроить скрипт под свои особенности...

                    Code:
                    date_old=`date +%y%m%d --date="(date) -8 day"`                           #Дата удаляемой партиции
                    date1=`date +%y%m%d --date="(date) +1 day"`                              #Дата новой партиций
                    date2=`date +%y-%m-%d --date="(date) +2 day"`                            #Дата окончания новой партиции
                    tables="history_str# history_log# history_text# history# history_uint#"  #Список таблиц mysql
                    logfile="/etc/zabbix/scripts/drop_part.log"
                    
                    echo `date` >> ${logfile}
                    for table in `echo $tables`
                    do
                      table1=`echo $table |cut -f1 -d#`
                    #Удаление старой партиции
                      count=`ls -lah /var/lib/mysql/zabbix/ | grep $table | wc -l`
                      echo "Работаем с таблицей: $table кол-во партиций: $count" >>${logfile}
                      echo "Удаляем партицию p$date_old" >>${logfile}
                      [ "$count" -ge "8" ] && mysql -u zabbix zabbix --execute="alter table $table1 drop partition p$date_old" >>${logfile} 2>>${logfile}
                    #Создание новой партиции
                      echo "Создаём новую партицию" "p"$date1>>${logfile}
                      part_new=`ls -lah /var/lib/mysql/zabbix/ | grep $table | grep p$date1 `
                      echo $part_new >>${logfile}
                      [ "$part_new" = "" ] && mysql -u zabbix zabbix --execute="alter table $table1 add partition (partition p$date1 values less than (unix_timestamp('$date2 00:00:00')))" >>${logfile} 2>>${logfile}
                    done

                    Comment

                    • id2669099
                      Member
                      • Mar 2016
                      • 68

                      #11
                      Originally posted by Fractal1990
                      пробовал по этой статье начать, в главе "Stored Procedures" при вставке кода выдавал какую то ошибку, сейчас не помню на память
                      ошибка может быть из-за знаков табуляции, которые скопировались вместе с кодом, по крайней мере у меня было так

                      а по поводу удаления, это настраивается при вызове процедуры
                      CALL partition_maintenance('zabbix', 'history', 28, 24, 14);
                      28 - максимальное количество дней сколько будут храниться партиции для этой таблицы, потом партиция удалится
                      24 - создавать партиции на каждые 24 часа
                      14 - число партиций, которые надо создать наперёд

                      это актуально для https://www.zabbix.org/wiki/Docs/howto/mysql_partition

                      Comment

                      • Fractal1990
                        Senior Member
                        • Mar 2016
                        • 129

                        #12
                        Originally posted by id2669099
                        ошибка может быть из-за знаков табуляции, которые скопировались вместе с кодом, по крайней мере у меня было так

                        а по поводу удаления, это настраивается при вызове процедуры
                        CALL partition_maintenance('zabbix', 'history', 28, 24, 14);
                        28 - максимальное количество дней сколько будут храниться партиции для этой таблицы, потом партиция удалится
                        24 - создавать партиции на каждые 24 часа
                        14 - число партиций, которые надо создать наперёд

                        это актуально для https://www.zabbix.org/wiki/Docs/howto/mysql_partition
                        попробовал сделать, бэкапнул все в zip, далее начал делать предварительно копировав команды в блокнот, все вроде нормально но в итоге более mysql не запустился... плюнул нафиг после 3-х часов возни, переставил zabbix, лью бэкап обратно, в бэкапе все восстановиться? все шаблоны и устройства?

                        Comment

                        • id2669099
                          Member
                          • Mar 2016
                          • 68

                          #13
                          Originally posted by fractal1990
                          попробовал сделать, бэкапнул все в zip, далее начал делать предварительно копировав команды в блокнот, все вроде нормально но в итоге более mysql не запустился... плюнул нафиг после 3-х часов возни, переставил zabbix, лью бэкап обратно, в бэкапе все восстановиться? все шаблоны и устройства?
                          ну да, всё должно восстановиться

                          Comment

                          • Fractal1990
                            Senior Member
                            • Mar 2016
                            • 129

                            #14
                            Originally posted by id2669099
                            ну да, всё должно восстановиться
                            а как долго льется бэкап? я его распаковал, он весом 90 гигов, mysqladmin pr показывает update history.str

                            Code:
                            root@zabbix:~# mysqladmin pr
                            +-------+------+-----------+--------+---------+------+--------+------------------------------------------------------------------------------------------------------+
                            | Id    | User | Host      | db     | Command | Time | State  | Info                                                                                                 |
                            +-------+------+-----------+--------+---------+------+--------+------------------------------------------------------------------------------------------------------+
                            | 1478  | root | localhost | zabbix | Query   | 5    | update | INSERT INTO `history_str` VALUES (43644,1469562263,'Fa0/9',640212395),(43653,1469562263,'Fa0/23',640 |
                            | 16368 | root | localhost |        | Query   | 0    |        | show processlist                                                                                     |
                            +-------+------+-----------+--------+---------+------+--------+------------------------------------------------------------------------------------------------------+
                            объем на жестком растет понемногу, но уже 2 дня так

                            Comment

                            Working...