1. 서버 용량 확인 방법
서버 용량이 부족하면 서비스 장애를 초래할 수 있다. 주기적으로 서버의 용량을 점검하고 관리하는 것이 필수!
용량 확인 명령어
1) df -h
# df -h: 파일 시스템의 사용량과 남은 공간 확인
df -h
출력 예시
2) du -h
# du -h [경로]: 특정 경로의 디스크 사용량 확인
du -h /var/
출력 예시
# du -h --max-depth=1 /var: 경로의 하위 디렉터리별 용량 확인
# du -ah /var | sort -rh | head -10: 용량이 큰 파일/디렉터리 순위 확인
du -ah /var | sort -rh | head -10
/var/lib/mysql: MySQL 데이터베이스 파일 저장 경로
zabbix 폴더는 Zabbix 모니터링 시스템의 데이터베이스 데이터가 저장됨
/var 디렉터리의 용량 관리
/var 경로는 주로 로그, 캐시, 데이터베이스 파일이 쌓이기 때문에 용량이 부족해지기 쉽다.
2. 관리 방법
오래된 데이터 삭제
-Zabbix GUI에서 데이터 보존 기간을 조정해 오래된 데이터를 삭제해준다.
-MySQL에서 직접 오래된 데이터를 삭제한다.
현재 /var/lib/mysql/zabbix 디렉터리 아래에 큰 용량을 차지하는 history_text.ibd 파일이 보인다. 이 파일은 Zabbix의 히스토리 데이터를 저장하는 테이블 파일로, 불필요한 오래된 데이터를 삭제하면 용량을 확보할 수 있을듯..?
아래는 안전하게 데이터를 정리하는 구체적인 방법이다.
1) Zabbix 데이터베이스 테이블 이해
history 테이블 계열
history, history_text, history_uint 등은 Zabbix의 모니터링 데이터를 저장합니다.
일반적으로 가장 많은 데이터를 차지하는 테이블은 history_text.ibd로, 텍스트 기반의 로그 데이터가 저장됩니다.
2) 데이터 삭제 전 데이터베이스 백업하기
mysqldump -u root -p zabbix > /backup/zabbix_backup.sql
3) 바이너리 로그 삭제
삭제 후 용량이 줄어들었음.
4) DB 확인
# MySQL 접속 및 Zabbix 데이터베이스 선택
mysql -u root -p
USE zabbix;
SHOW TABLES;
# 각 테이블의 크기를 확인
SELECT table_name AS "Table",
ROUND((data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)"
FROM information_schema.TABLES
WHERE table_schema = "zabbix"
ORDER BY (data_length + index_length) DESC;
데이터 정리 전 준비 작업
# 서비스 일시 중단
# 데이터 삭제 작업 중 Zabbix 서버의 MySQL 데이터베이스 사용량이 높아질 수 있다.
# 안정적인 작업을 위해 Zabbix 서버를 일시 중지하는 것이 좋다.
sudo systemctl stop zabbix-server
데이터 백업
mysqldump -u root -p zabbix history_text > /backup/history_text_backup.sql
(1) 특정 호스트 데이터 삭제
# 만약 특정 호스트의 데이터가 너무 많이 쌓였다면 해당 호스트의 데이터를 삭제한다.
DELETE FROM history_text
WHERE itemid IN (SELECT itemid FROM items WHERE hostid = '호스트_ID');
호스트 ID는 아래 명령어로 찾을 수 있다.
SELECT hostid, host FROM hosts;
(2) 특정 아이템 데이터 삭제
# 특정 모니터링 항목에 해당하는 데이터를 삭제할 수 있다.
DELETE FROM history_text WHERE itemid = '아이템_ID';
아이템 ID는 다음과 같이 확인
SELECT itemid, name FROM items WHERE hostid = '호스트_ID';
(3) 텍스트 데이터의 크기 기준 분석
# 특정 itemid가 얼마나 많은 데이터를 쌓았고, 총 용량이 얼마나 되는지 보여준다.
# 이 쿼리로 가장 많은 데이터를 차지하는 아이템을 식별할 수 있다.
SELECT
itemid,
COUNT(*) AS entry_count,
ROUND(SUM(LENGTH(value)) / 1024 / 1024, 2) AS total_size_mb
FROM
history_text
GROUP BY
itemid
ORDER BY
total_size_mb DESC
LIMIT 10;
(4) 수집된 시간 기준으로 분석
# 특정 날짜에 많은 용량이 쌓였는지 확인할 수 있다
# 필요에 따라 특정 날짜의 데이터만 삭제할 수 있다
SELECT
FROM_UNIXTIME(clock, '%Y-%m-%d') AS date,
COUNT(*) AS entry_count,
ROUND(SUM(LENGTH(value)) / 1024 / 1024, 2) AS total_size_mb
FROM
history_text
GROUP BY
date
ORDER BY
total_size_mb DESC
LIMIT 10;
오래된 데이터 삭제
DELETE FROM history_text
WHERE clock < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY));
특정 텍스트 길이 이상의 데이터 삭제
DELETE FROM history_text
WHERE LENGTH(value) > 1000;
Truncate 테이블 (데이터 전체 삭제)
# 데이터가 복구가 불필요하다면,
# 아래 방법으로 history_text 테이블을 비우는(Truncate) 방법을 사용할 수 있다.
# Truncate 테이블 (데이터 전체 삭제)
TRUNCATE TABLE history_text;
# 장점: 빠르게 테이블을 비워준다.
# 주의: 테이블의 모든 데이터가 삭제되므로 복원이 필요하다면 백업 후 실행한다.
용량 확인
테이블 최적화
OPTIMIZE TABLE history_text;
'Server > Linux' 카테고리의 다른 글
Linux netstat 명령어 (0) | 2024.11.03 |
---|---|
Linux 프로세스 관련 명령어 (0) | 2024.11.03 |
MySQL 바이너리 로그(Binary Log) 관리 (0) | 2024.10.19 |
Ubuntu에서 패키지를 설치하거나 관리할 때 주로 사용하는 명령어 (0) | 2024.10.19 |
Linux 서버 메모리 정리 방법 (0) | 2024.10.17 |