User Tools

Site Tools


informatica:linux:zabbix

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
informatica:linux:zabbix [2014/07/29 06:29] – [Autenticacion LDAP] javiinformatica:linux:zabbix [2015/03/14 12:47] – [Housekeeper y particionado] javi
Line 116: Line 116:
  
 7. Crear el script de arranque: 7. Crear el script de arranque:
- 
-**TODO**: el script que se provee para debian creo recordar que no funciona del todo bien, en concreto la parte de "status". 
  
   sudo ln -s /ruta/zabbix-2.0.2/misc/init.d/debian/zabbix-server /etc/init.d/   sudo ln -s /ruta/zabbix-2.0.2/misc/init.d/debian/zabbix-server /etc/init.d/
Line 401: Line 399:
 http://zabbixzone.com/zabbix/mysql-performance-tips-for-zabbix/ http://zabbixzone.com/zabbix/mysql-performance-tips-for-zabbix/
  
-Es MUY recomendable:+http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html 
 + 
 +https://www.zabbix.org/wiki/Docs/howto/mysql_partition 
 + 
 +1. Habilitar file per table 
 + 
 +http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html 
 + 
 +2. Cambiar indices (puede ser lento y bloquear inserts): 
 +<code> 
 +mysql -u zabbix2014 -p 
 +use zabbix2014; 
 +Alter table history_text drop primary key, add index (id), drop index history_text_2, add index history_text_2 itemid, id); 
 +Alter table history_log drop primary key, add index (id), drop index history_log_2, add index history_log_2 (itemid, id); 
 +</code> 
 + 
 +3. Crear procedures: 
 +<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 ; 
 +</code> 
 + 
 +<code> 
 +DELIMITER $$ 
 +CREATE PROCEDURE `partition_drop`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), DELETE_BELOW_PARTITION_DATE BIGINT) 
 +BEGIN 
 +        /* 
 +           SCHEMANAME = The DB schema in which to make changes 
 +           TABLENAME = The table with partitions to potentially delete 
 +           DELETE_BELOW_PARTITION_DATE = Delete any partitions with names that are dates older than this one (yyyy-mm-dd) 
 +        */ 
 +        DECLARE done INT DEFAULT FALSE; 
 +        DECLARE drop_part_name VARCHAR(16); 
 +  
 +        /* 
 +           Get a list of all the partitions that are older than the date 
 +           in DELETE_BELOW_PARTITION_DATE.  All partitions are prefixed with 
 +           a "p", so use SUBSTRING TO get rid of that character. 
 +        */ 
 +        DECLARE myCursor CURSOR FOR 
 +                SELECT partition_name 
 +                FROM information_schema.partitions 
 +                WHERE table_schema = SCHEMANAME AND TABLE_NAME = TABLENAME AND CAST(SUBSTRING(partition_name FROM 2) AS UNSIGNED) < DELETE_BELOW_PARTITION_DATE; 
 +        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
 +  
 +        /* 
 +           Create the basics for when we need to drop the partition.  Also, create 
 +           @drop_partitions to hold a comma-delimited list of all partitions that 
 +           should be deleted. 
 +        */ 
 +        SET @alter_header = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " DROP PARTITION "); 
 +        SET @drop_partitions = ""; 
 +  
 +        /* 
 +           Start looping through all the partitions that are too old. 
 +        */ 
 +        OPEN myCursor; 
 +        read_loop: LOOP 
 +                FETCH myCursor INTO drop_part_name; 
 +                IF done THEN 
 +                        LEAVE read_loop; 
 +                END IF; 
 +                SET @drop_partitions = IF(@drop_partitions = "", drop_part_name, CONCAT(@drop_partitions, ",", drop_part_name)); 
 +        END LOOP; 
 +        IF @drop_partitions != "" THEN 
 +                /* 
 +                   1. Build the SQL to drop all the necessary partitions. 
 +                   2. Run the SQL to drop the partitions. 
 +                   3. Print out the table partitions that were deleted. 
 +                */ 
 +                SET @full_sql = CONCAT(@alter_header, @drop_partitions, ";"); 
 +                PREPARE STMT FROM @full_sql; 
 +                EXECUTE STMT; 
 +                DEALLOCATE PREPARE STMT; 
 +  
 +                SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, @drop_partitions AS `partitions_deleted`; 
 +        ELSE 
 +                /* 
 +                   No partitions are being deleted, so print out "N/A" (Not applicable) to indicate 
 +                   that no changes were made. 
 +                */ 
 +                SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, "N/A" AS `partitions_deleted`; 
 +        END IF; 
 +END$$ 
 +DELIMITER ; 
 +</code> 
 + 
 +<code> 
 +DELIMITER $$ 
 +CREATE PROCEDURE `partition_maintenance`(SCHEMA_NAME VARCHAR(32), TABLE_NAME VARCHAR(32), KEEP_DATA_DAYS INT, HOURLY_INTERVAL INT, CREATE_NEXT_INTERVALS INT) 
 +BEGIN 
 +        DECLARE OLDER_THAN_PARTITION_DATE VARCHAR(16); 
 +        DECLARE PARTITION_NAME VARCHAR(16); 
 +        DECLARE LESS_THAN_TIMESTAMP INT; 
 +        DECLARE CUR_TIME INT; 
 +  
 +        CALL partition_verify(SCHEMA_NAME, TABLE_NAME, HOURLY_INTERVAL); 
 +        SET CUR_TIME = UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')); 
 +  
 +        SET @__interval = 1; 
 +        create_loop: LOOP 
 +                IF @__interval > CREATE_NEXT_INTERVALS THEN 
 +                        LEAVE create_loop; 
 +                END IF; 
 +  
 +                SET LESS_THAN_TIMESTAMP = CUR_TIME + (HOURLY_INTERVAL * @__interval * 3600); 
 +                SET PARTITION_NAME = FROM_UNIXTIME(CUR_TIME + HOURLY_INTERVAL * (@__interval - 1) * 3600, 'p%Y%m%d%H00'); 
 +                CALL partition_create(SCHEMA_NAME, TABLE_NAME, PARTITION_NAME, LESS_THAN_TIMESTAMP); 
 +                SET @__interval=@__interval+1; 
 +        END LOOP; 
 +  
 +        SET OLDER_THAN_PARTITION_DATE=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL KEEP_DATA_DAYS DAY), '%Y%m%d0000'); 
 +        CALL partition_drop(SCHEMA_NAME, TABLE_NAME, OLDER_THAN_PARTITION_DATE); 
 +  
 +END$$ 
 +DELIMITER ; 
 +</code> 
 + 
 +<code> 
 +DELIMITER $$ 
 +CREATE PROCEDURE `partition_verify`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), HOURLYINTERVAL INT(11)) 
 +BEGIN 
 +        DECLARE PARTITION_NAME VARCHAR(16); 
 +        DECLARE RETROWS INT(11); 
 +        DECLARE FUTURE_TIMESTAMP TIMESTAMP; 
 +  
 +        /* 
 +         * Check if any partitions exist for the given SCHEMANAME.TABLENAME. 
 +         */ 
 +        SELECT COUNT(1) INTO RETROWS 
 +        FROM information_schema.partitions 
 +        WHERE table_schema = SCHEMANAME AND TABLE_NAME = TABLENAME AND partition_name IS NULL; 
 +  
 +        /* 
 +         * If partitions do not exist, go ahead and partition the table 
 +         */ 
 +        IF RETROWS = 1 THEN 
 +                /* 
 +                 * Take the current date at 00:00:00 and add HOURLYINTERVAL to it.  This is the timestamp below which we will store values. 
 +                 * We begin partitioning based on the beginning of a day.  This is because we don't want to generate a random partition 
 +                 * that won't necessarily fall in line with the desired partition naming (ie: if the hour interval is 24 hours, we could 
 +                 * end up creating a partition now named "p201403270600" when all other partitions will be like "p201403280000"). 
 +                 */ 
 +                SET FUTURE_TIMESTAMP = TIMESTAMPADD(HOUR, HOURLYINTERVAL, CONCAT(CURDATE(), " ", '00:00:00')); 
 +                SET PARTITION_NAME = DATE_FORMAT(CURDATE(), 'p%Y%m%d%H00'); 
 +  
 +                -- Create the partitioning query 
 +                SET @__PARTITION_SQL = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " PARTITION BY RANGE(`clock`)"); 
 +                SET @__PARTITION_SQL = CONCAT(@__PARTITION_SQL, "(PARTITION ", PARTITION_NAME, " VALUES LESS THAN (", UNIX_TIMESTAMP(FUTURE_TIMESTAMP), "));"); 
 +  
 +                -- Run the partitioning query 
 +                PREPARE STMT FROM @__PARTITION_SQL; 
 +                EXECUTE STMT; 
 +                DEALLOCATE PREPARE STMT; 
 +        END IF; 
 +END$$ 
 +DELIMITER ; 
 +</code> 
 + 
 +Este ultimo los gobierna todos, por tanto hay que seleccionar los valores que se adapte a nuestras necesidades: 
 + 
 +<code> 
 +DELIMITER $$ 
 +CREATE PROCEDURE `partition_maintenance_all`(SCHEMA_NAME VARCHAR(32)) 
 +BEGIN 
 +                CALL partition_maintenance(SCHEMA_NAME, 'history', 28, 24, 14); 
 +                CALL partition_maintenance(SCHEMA_NAME, 'history_log', 28, 24, 14); 
 +                CALL partition_maintenance(SCHEMA_NAME, 'history_str', 28, 24, 14); 
 +                CALL partition_maintenance(SCHEMA_NAME, 'history_text', 28, 24, 14); 
 +                CALL partition_maintenance(SCHEMA_NAME, 'history_uint', 28, 24, 14); 
 +                CALL partition_maintenance(SCHEMA_NAME, 'trends', 730, 24, 14); 
 +                CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 730, 24, 14); 
 +END$$ 
 +DELIMITER ; 
 +</code> 
 + 
 +4. Dar permisos de ejecucion al ultimo procedimiento. Vamos a dar al mismo usuario que puede leer la base de datos de zabbix: 
 + 
 +<code> 
 +GRANT EXECUTE ON PROCEDURE zabbix2014.partition_maintenance_all TO 'zabbix2014'@'localhost'; 
 +flush privileges; 
 +exit; 
 +</code> 
 + 
 +5. Creamos archivo para poder iniciar sesion mysql sin contrasenya: 
 + 
 +  vim ~/.my.cnf 
 +   
 +Con el siguiente contenido: 
 + 
 +<code> 
 +[client] 
 +user=zabbix2014 
 +password=zabbix2014 
 +</code> 
 + 
 +Ajustamos permisos: 
 + 
 +  chmod 0600 ~/.my.cnf 
 +   
 +6. Creamos un script para ser llamado desde cron: 
 + 
 +<code> 
 +sudo vim /opt/partition_maintenance_all.sh 
 +</code> 
 + 
 +Con el siguiente contenido (ajustar variables): 
 + 
 +<code> 
 +#!/bin/bash 
 + 
 +LOG="/var/log/"`basename $0`".log" 
 +STRING_START="START of the script:" 
 +STRING_END="END of the script:" 
 +MYSQL_USER="zabbix2014" 
 +MYSQL_DB=$MYSQL_USER 
 +MYSQL_PROCEDURE="partition_maintenance_all" 
 + 
 +[[ ! $LOG ]]; touch $LOG 
 +DATE="$(date +%d/%m/%Y) $(date +%H:%M:%S)" 
 + 
 +echo -e "\n################### $STRING_START $DATE ##################"  >> $LOG 
 + 
 +#mysql -u $MYSQL_USER -e "CALL partition_maintenance_all('zabbix2014')\G" zabbix2014 >> $LOG 2>&
 +#mysql -u $MYSQL_USER -e "CALL partition_maintenance_all('"$MYSQL_DB"')\G" $MYSQL_DB >> $LOG 2>&
 +mysql -u $MYSQL_USER -e "CALL "$MYSQL_PROCEDURE"('"$MYSQL_DB"')\G" $MYSQL_DB >> $LOG 2>&
 + 
 +DATE="$(date +%d/%m/%Y) $(date +%H:%M:%S)" 
 + 
 +echo -e "\n################### $STRING_END $DATE ##################"  >> $LOG 
 +</code> 
 + 
 +Ajustamos permisos y logs: 
 + 
 +<code> 
 +sudo chown usuario:usuario /opt/partition_maintenance_all.sh 
 +chmod +x /opt/partition_maintenance_all.sh 
 +sudo touch /var/log/partition_maintenance_all.sh.log 
 +sudo chown root:usuario /var/log/partition_maintenance_all.sh.log 
 +chmod 660 /var/log/partition_maintenance_all.sh.log 
 +</code>
  
-1. [[http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html|InnoDB File-Per-Table Mode]]+Y anyadimos la entrada a cron, para ser ejecutada, por ejemplo, cada dia:
  
-2. [[https://www.zabbix.org/wiki/Docs/howto/mysql_partition|mysql partition]]+  13 4 * * * /opt/partition_maintenance_all.sh >> /var/log/partition_maintenance_all.sh.log 2>&1
 ====== Comandos varios ====== ====== Comandos varios ======