[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파일이 실행되는 로그를 확인할 수 있다