Zabbix 를 구축하고 일정 기간 운영을 할 경우 “Zabbix housekeeper processes more than 75% busy” 장애를 만나게 된다.
Zabbix 는 housekeeper 가 history 및 trends 테이블에 불필요한 쿼리를 삭제하는 기능을 가지고 있다.
감시 대상이 많을 수록 크겠지만 history_uint 테이블의 크기는 GB 단위를 사용하게 된다.
이때 DELETE 를 이용하게 되는 수백만 단위에서 시간 값을 가지고 삭제 하기 때문에 문제가 된다.
cpu 과점 문제가 발생할 수 밖에 없다. (innodb buffer pool 설정을 키우고 큰 메모리를 장착했다면 문제가 발생하지 않겠지만..)
때문에 housekeeper 대신 테이블을 일자별로 파티셔닝을 하고 DB프로시저를 이용해서 DROP을 하도록 하면 자원 사용을 줄일 수 있다.
아래 프로시저 생성 방법은 미리 일정한 시간 마다 사용할 파티션을 미리 생성(24 시간 / 3개의 포인트) 하고 맞는 시간에 Insert 가 발생 한다면
그에 맞는 파티션에 적재 되도록 하고, 보유 기간(7일)이 만료된 파티션을 DROP을 하는 기능을 가지고 있다.
1. 압축파일을 다운 받아 프로시저를 DB에 생성한다.
1 2 3 4 5 6 7 8 |
~]# cd /opt ~]# curl -LO https://www.enteroa.com/zbx_db_partitiong.sql.tgz ~]# tar xfzp zbx_db_partitiong.sql.tgz ~]# mysql -h172.20.240.1 -u zabbix -p zabbix < zbx_db_partitiong.sql ...패스워드입력... ~]# rm -f zbx_db_partitiong.sql |
프로시저는 history 는 7일 trends 는 365일 으로 지정되어 있다.
2. Mysql 으로 접속해서 스케쥴러가 켜져 있는지 확인한다.
1 2 3 4 5 6 7 |
MySQL[]> use zabbix MySQL[zabbix]> SHOW VARIABLES LIKE 'event_scheduler'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | event_scheduler | ON | +-----------------+-------+ |
3. 생성한 프로시저의 스케쥴링을 12시간 마다로 설정 하고 확인 한다.
1 2 3 4 5 6 7 8 9 10 |
MySQL[zabbix]> CREATE EVENT zbx_partitioning ON SCHEDULE EVERY 12 HOUR STARTS '2025-02-20 00:05:00' ENABLE DO CALL partition_maintenance_all('zabbix'); MySQL[zabbix]> SELECT EVENT_NAME, INTERVAL_VALUE, INTERVAL_FIELD, STATUS, STARTS, LAST_EXECUTED FROM INFORMATION_SCHEMA.events; +------------------+----------------+----------------+---------+---------------------+---------------+ | EVENT_NAME | INTERVAL_VALUE | INTERVAL_FIELD | STATUS | STARTS | LAST_EXECUTED | +------------------+----------------+----------------+---------+---------------------+---------------+ | zbx_partitioning | 12 | HOUR | ENABLED | 2025-02-20 00:05:00 | NULL | +------------------+----------------+----------------+---------+---------------------+---------------+ |
이 명령어를 실행할때 이미 쌓여있는 데이터가 크다면 최초 프로시저 실행 시간에 많은 시간이 걸릴 수 있다.
4. housekeeper 사용을 끈다.
zbx_db_partitiong.sql 파일로 복구한 프로시저에서 history 는 7일 trends 는 365일로 지정 되어 있다. (보유 날자는 필요할 경우 수정하라 @_@a)
1 2 3 4 5 6 7 8 9 10 11 |
CREATE PROCEDURE `partition_maintenance_all`(SCHEMA_NAME VARCHAR(32)) BEGIN CALL partition_maintenance(SCHEMA_NAME, 'history', 7, 24, 3); CALL partition_maintenance(SCHEMA_NAME, 'history_log', 7, 24, 3); CALL partition_maintenance(SCHEMA_NAME, 'history_str', 7, 24, 3); CALL partition_maintenance(SCHEMA_NAME, 'history_text', 7, 24, 3); CALL partition_maintenance(SCHEMA_NAME, 'history_uint', 7, 24, 3); CALL partition_maintenance(SCHEMA_NAME, 'trends', 365, 24, 3); CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 365, 24, 3); END$$ DELIMITER ; |
파티셔닝이 된 정보는 다음과 같이 확인이 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
MySQL [zabbix]> SELECT TABLE_SCHEMA, TABLE_NAME, PARTITION_NAME, CONCAT(ROUND(DATA_LENGTH / ( 1024 * 1024 ), 0), ' MB') as 'Data', CONCAT(ROUND(INDEX_LENGTH / ( 1024 * 1024 ), 0), ' MB') as 'Index' FROM information_schema.PARTITIONS WHERE TABLE_NAME != 'history_bin' AND ( TABLE_NAME like 'history%' OR TABLE_NAME like 'trends%' ); +--------------+--------------+----------------+--------+-------+ | TABLE_SCHEMA | TABLE_NAME | PARTITION_NAME | DATA | Index | +--------------+--------------+----------------+--------+-------+ | zabbix | history | p202502200000 | 284 MB | 0 MB | | zabbix | history | p202502210000 | 20 MB | 0 MB | | zabbix | history_log | p202502200000 | 0 MB | 0 MB | | zabbix | history_log | p202502210000 | 0 MB | 0 MB | | zabbix | history_str | p202502200000 | 3 MB | 0 MB | | zabbix | history_str | p202502210000 | 0 MB | 0 MB | | zabbix | history_text | p202502200000 | 116 MB | 0 MB | | zabbix | history_text | p202502210000 | 11 MB | 0 MB | | zabbix | history_uint | p202502200000 | 733 MB | 0 MB | | zabbix | history_uint | p202502210000 | 44 MB | 0 MB | | zabbix | trends | p202502200000 | 73 MB | 0 MB | | zabbix | trends | p202502210000 | 4 MB | 0 MB | | zabbix | trends_uint | p202502200000 | 287 MB | 0 MB | | zabbix | trends_uint | p202502210000 | 10 MB | 0 MB | +--------------+--------------+----------------+--------+-------+ |
출처 : https://bestmonitoringtools.com/zabbix-partitioning-tables-on-mysql-database/