본문 바로가기

ELK 스택/Elasticsearch

[Elastic] Crontab을 활용해 주기적으로 Document 삭제

반응형

이번 포스팅은 엘라스틱에 적재되는 수많은 데이터를

주기적으로 삭제하기 위해 crontab을 사용하는 예제입니다.

 

 

 

1. 엘라스틱 Curator

- 엘라스틱 자체에 Curator를 활용하여 오래된 인덱스를 지워주는 기능이 존재

- 이번 포스팅은 인덱스를 지우는 것이 아닌 Document를 지워야 하기에 Crontab활용

- 다음 포스팅에 Curator를 활용해 볼 예정 (이때는 인덱스를 날짜별로 적재해야 함)

 

 

2. Crontab이란

- 특정 시간에 특정 작업을 해야 할 때 사용. 단순하게 리눅스 작업 스케줄러라고 생각하면 편함

- 엘라스틱 서치의 데이터가 너무 많이 쌓이는 것을 미리 방지하기 위해 2일 전 데이터는 자동으로 삭제될 수 있도록 crontab을 등록해놓을 예정

 

 

3. Crontab 설치 및 재시작

$ apt-get install cron

- 우선 crontab 설정에 필요한 cron 패키지 설치

 

$ sudo service cron restart

- 설치 후 크론을 재시작해준다.

 

$ pgrep cron

- 크론이 제대로 활성화되어있는지 체크 : 숫자가 출력되면 정상 작동 중

 

 

4. 엘라스틱 서치 데이터 삭제 쿼리 작성

curl -X POST "localhost:9200/test_idx/_delete_by_query?conflicts=proceed&pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "ymd": '$result'
    }
  }
}'

- curl을 활용하여 엘라스틱에 삭제 요청을 보냄

- _delete_by_query를 활용하여 쿼리에 해당하는 document를 삭제하게 함

- 데이터가 너무 많을 경우 timeout 이 발생할 수 있기 때문에 ?conflicts=proceed&pretty 파라미터를 붙여준다.

- -H 'Content-Type:application/json"을 명시해준다.

- -d '작성한 쿼리문'으로 요청 쿼리를 보낸다.

- ymd에 들어갈 자리에는 매일 날짜가 변경되므로 변수로 작성한다.

 

 

5. sh 프로그램 작성

today=$(date '+%Y%m%d')

# 오늘날짜 기준으로 삭제 할 날짜의 수를 지정
delete_days=2

# 오늘날짜에서 지정 날짜를 빼서 result변수에 할당
result=`expr $today - $delete_days`

# 엘라스틱 쿼리문 
curl -X POST "localhost:9200/test_idx/_delete_by_query?conflicts=proceed&pretty" -H 'Content-Type: application/json' -d'
{
  "query": {
    "match": {
      "ymd": '$result'
    }
  }
}'

today=$(date '+%Y%m%d')

- 오늘 날짜를 cmd에 요청하여 결과를 받아 변수에 담는다 >> $(요청) 형식으로 작성
- 원하는 출력 날짜 형식을 아래와 같이 지정 >> +%Y%m%d = 20200417 : 이런 형식으로 출력됨

 

result=`expr $today - $delete_days`

- sh 프로그램에서 빼기 연산을 하는 방법 : 'expr $변수 - $변수'

 

 

6. crontab에 등록

$ crontab -e

>> 크론 탭 설정 입력 파일

 

# 원하는 시간과 날짜 맞춰 작성
# 매일 오후 1시 50분에 sh 프로그램을 실행 하라는 뜻

50 13 * * * sh /home/ubuntu/test.sh

>> 분(0-59) / 시간(0-23) / 일(1-31) / 월(1-12) / 요일(0-7) 

>> 위에 순서에 맞춰서 작성하면 된다

>> 요일 부분에서 0과 7은 일요일을 의미하며, 1-6은 월-토요일을 의미한다.

 

<< 참고사항 >>

50 13 * * * sh /home/ubuntu/test.sh >> /var/logs/es.log 2>&1

>> 실행한 sh파일에 대한 output로그를 저장하고 싶을 때
>> [시간 설정] [실행파일] >> [저장될 로그파일] 2>&1 

 

crontab -l

>> 현재 크론탭에 설정되어 있는 내용 확인

 

tail -f /var/log/syslog

>> 설정한 시간에 syslog를 확인하면 sh파일이 실행되는 로그를 확인할 수 있다

 

 

반응형