코딩마을방범대
[ELK] 일정 기간이 지난 인덱스 자동 삭제하기 본문
서버에 구축되어있는 SpringBoot 프로젝트는 logs 폴더에 날짜별로 로그 파일이 쌓인다.
이 로그 파일들은 30일의 유효기간을 가지고 있고, 30일이 지나면 자동으로 삭제된다.
ELK 구축 후 log 파일들을 자동으로 읽고 인덱스명이 날짜별로 생성되게 설정해두었다.
하지만 실제 로그 파일에 설정된 유효기간은 설정되지 않아 인덱스만 무제한으로 생성되는 상황이다.
이럴 경우 인덱스에도 유효기간을 설정해두면 관리하기 조잡하지 않고 좋을 것 같다고 생각되어 인덱스에 유효기간을 설정할 수 있는 방법이 있는지 알아보게 되었다.
ILM(인덱스 생애 주기 관리, Index Lifecycle Management)
데이터의 수명 주기에 따라 인덱스를 생성, 관리, 삭제하는 정책을 정의할 수 있음
구성요소
1. 정책 (Policy)
- 인덱스의 생애 주기를 관리하는 규칙을 정의
- 정책은 여러 단계(phase)로 구성되며, 각 단계는 특정 작업을 수행함
2. 단계 (Phase)
단계 | 설명 |
Hot Phase | 데이터가 생성되고 가장 활성화된 상태 (인덱스에 대한 쓰기 작업이 이루어짐) |
Warm Phase | 데이터가 덜 활성화된 상태, 쓰기 작업은 없지만 검색 작업이 여전히 이루어질 수 있음 (인덱스를 더 저렴한 스토리지로 이동하거나 샤드 수를 줄일 수 있음) |
Cold Phase | 데이터가 거의 사용되지 않는 상태 (인덱스를 읽기 전용으로 설정하거나 저비용 스토리지로 이동할 수 있음) |
Delete Phase | 데이터가 더 이상 필요하지 않은 상태 (인덱스를 삭제하는 작업이 수행됨) |
3. 액션 (Action)
- 각 단계에서 수행할 수 있는 작업을 정의
- 인덱스를 삭제하거나, 샤드를 리사이즈하거나, 인덱스를 롤오버하는 등의 작업이 있음
샤드란?
데이터를 분산 저장하기 위한 기본 단위.
인덱스는 데이터의 집합을 나타내며, 이 인덱스는 대량의 데이터를 처리하기 위해 여러 개의 샤드로 나뉘어 저장된다.
이 샤드들을 클러스터의 여러 노드에 분산시킨다.
클러스터 >> 노드 >> 인덱스 >> 샤드
프라이머리 샤드와 레플리카 샤드:
프라이머리 샤드(Primary Shard): 데이터의 원본 복사본을 포함하는 샤드. 인덱스 생성 시 지정하며, 기본적으로 각 인덱스에는 여러 개의 프라이머리 샤드가 있을 수 있다.
레플리카 샤드(Replica Shard): 프라이머리 샤드의 복제본. 데이터의 가용성과 내구성을 높이기 위해 사용된다. 만약 프라이머리 샤드가 있는 노드가 다운되면, 레플리카 샤드를 통해 데이터에 접근할 수 있다.
이점
- 자동화: 수동으로 인덱스를 관리할 필요 없이 정책에 따라 자동 처리됨
- 비용 효율성: 오래된 데이터는 저비용 스토리지로 이동하거나 삭제하여 스토리지 비용을 절감할 수 있음
- 성능 최적화: 데이터의 사용 패턴에 따라 적절한 스토리지를 선택하고 인덱스를 최적화하여 성능을 유지할 수 있음
- 유지 관리 용이: 인덱스의 생애 주기를 체계적으로 관리하여 데이터 관리를 단순화함
예시
인덱스가 생성된 후 30일이 지나면 롤오버(새 인덱스 생성)하고, 60일이 지나면 삭제하는 규칙은 아래와 같이 정의할 수 있다.
정책명은 my_policy로 정의하였다.
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_age": "30d"
}
}
},
"delete": {
"min_age": "60d",
"actions": {
"delete": {}
}
}
}
}
}
ILM 설정하기
1. ILM 정책 생성
my_policy라는 정책을 생성하여 30일의 유효기간을 두는 것으로 설정할 것이다.
PUT _ilm/policy/정책명
{
"policy": {
"phases": {
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
2. 인덱스 탬플릿에 정책 적용
my_index-* 라는 인덱스 패턴이 설정된 탬플릿에, 1번에서 생성한 정책을 적용하는 것이다.
Kibana UI를 이용하게 된다면, 아래 사진처럼 Index settings에 입력해주면 된다.
UI가 아닌 API로 호출하여 설정하는 방법은 아래와 같다.
만약 기존에 존재하는 탬플릿에 적용하는거라면 index_template 블록의 모든 내용을 포함시켜줘야 한다.
안그러면 기존 설정 사항 다 지워짐!! (아래 포스트 참고)
PUT _template/탬플릿명
{
"index_patterns": ["my_index-*"],
"template": [
"settings": {
"index.lifecycle.name": "정책명"
}
]
}
3. 기존 인덱스 수정하기 (선택사항)
기존에 탬플릿이 적용되어 있었다면, 수정된 사항을 적용시켜주기 위해 인덱스를 새로 만들어야한다.
방법은 위 포스트를 참고하면 된다.
만약 탬플릿을 적용시키기 위해 인덱스를 새로 생성하기 번거롭다면 아래와 같이 인덱스에 일일히 정책을 적용시켜주는 방법이 있다.
PUT 인덱스명/_settings
{
"index": {
"lifecycle": {
"name": "정책명"
}
}
}
4. 인덱스에 정책 적용됐는지 확인하는 방법
GET 인덱스명/_ilm/explain
ILM 관련 API
ILM 삭제
# ILM 삭제 전에 인덱스에서 정책을 제거해줘야함.
PUT 인덱스명/_settings
{
"index": {
"lifecycle": {
"name": null
}
}
}
DELETE _ilm/policy/정책명
ILM 수정
PUT _ilm/policy/my_policy
{
"policy": {
"phases": {
// 수정할 내용
"delete": {
"min_age": "60d",
"actions": {
"delete": {}
}
}
}
}
}
ILM 정책 조회
# 모든 정책 조회
GET _ilm/policy
# 특정 정책 조회
GET _ilm/policy/my_policy
'💡 백엔드 > ELK' 카테고리의 다른 글
[ELK] Kafka와 ELK 연동하기 (0) | 2024.11.19 |
---|---|
[ELK] 탬플릿 생성하기 (message.keyword 필드가 비어있다면?) (0) | 2024.11.15 |
[ELK] Log를 불러올 때 타임스탬프를 커스텀 필드로 정의하기 (0) | 2024.11.13 |
[ELK] 데이터뷰 및 필드 생성하기 (0) | 2024.11.13 |
[ELK] 다른 서버에 구축되어 있는 ELK와 연결하기 (0) | 2024.11.12 |