MongoDB TTL 설정 ( 데이터 자동 삭제 스케줄 )

2022. 9. 8. 11:07mongodb

반응형

음, TTL이라는 단어를 못 들어본 사람이 있을 것이다.

TTL : Time to live 라는 약자이다. 몽고디비에선 데이터의 생명주기를 관리하기 위한 방법이다.

Mongodb는 자체적으로 TTL를 Index로 지원을 한다.

해당 인덱스(TTL)를 적용하면, 특정 시간이 지나면, 해당 범위가 데이터가 삭제된다.

몽고디비 홈페이지 TTL 설명 중 일부


몽고디비 TTL을 자세히 읽어보면, 해당 인덱스는 1분 단위로 돌아가는 걸로 보인다.

즉, 정확히 해당시간에 지워지기보다 1분 정도 오차가 있을 수 있다.

1. TTL은 왜 필요한가?

음, 몽고디비를 사용하면서 가장 중요시 하는 기능 중 하나가 바로 TTL이다.

몽고디비는 한번 용량이 늘어나면, 데이터를 지워도 용량을 스스로 반환하지 않는다.

데이터를 압축하거나, 데이터를 덤프떠서 재마이그레이션을 하지 않으면, 한번 늘어난 용량은 줄어들지 않는다.

또한 재마이그션 혹은 데이터를 압축할 때, 해당 서버의 자원이 넉넉하게 확보가 되어 있어야 한다.

따라서 무제한으로 자원을 늘릴 수 있는 환경이 아니라면, 용량 제한을 위한 조치가 반드시 필요하다.

그 조치 중 하나가 바로 TTL이다.

TTL은 데이터의 생명주기만 잘 정하면 되기 때문에 상대적으로 관리와 세팅이 쉽다.

또한 현업들도 해당 조치에 관한 설득과 이해가 쉬워 합의가 상대적으로 쉽다.

나는 해당 TTL를 설정 후, TTL시간이 되기 전에 AWS S3로 백업을 시켜둔다. 그리고 해당 데이터가 필요한 경우, AWS Athena 를 활용해 전달해준다.

참고로 우리회사는 AWS를 사용하고 있기에, 해당 서비스를 사용하지 않는 회사는 대체 서비스를 이용하면 된다.

음, 좀 쉽게 설명하자면, S3는 하둡과 같은 파일 스토리지이고, Athena는 Presto와 Impala같은 쿼리 엔지이다.




2. TTL 조건은 무엇인가?

TTL 필수 조건은 DATETIME으로 되어 있는 컬럼이다.

숫자나, 문자로 이루어진 무늬만 시간이 아닌, 리얼 데이터 타입이 DATETIME 인 데이터가 있어야 한다.

몽고디비를 사용하면, 스키마가 저장에 큰 영향을 주지 않기 때문에

데이터 타입이 잘 관리 하지 않게 되는데,

이러면, 나중에 운영 및 개발이 정말 크게 아플 수 있다.

( 몽고디비는 안 아픈데, 운영 및 개발하는 내가 아플 수 있다... )

TTL 인덱스는 제약사항이 몇개 있는데, 아래와 같다.

또한 TTL 인덱스는 멀티 인덱스로 이루어질 수 없으며, _id는 TTL를 적용할 수 없다.

그래서 나는 mongodb에 데이터를 insert 할때, 항상 insert_time를 넣어두고 작업을 진행한다.

insert_time를 넣는 작업은 별 작업이 아니지만, 넣어두지 않으면, 상당히 TTL 작업에 고민이 많아 질 것이다.

따라서 몽고디비를 적용하고 관리하는 사람들은 inseert_time을 컬럼을 추가해 관리하는 개인적으로 걸 추천한다.



3. TTL 적용 방법


먼저 DATETIME 이 있는 컬럼을 확인한다.

이래 데이터는 date_time의 컬럼의 타입이 datetime이다.

이 경우, date_time를 기준으로 TTL를 걸 수 있다.

[ 이름 컬랙션 ]

_id 이름 date_time
Object(0000000001) 홍길동 2022-01-01 00:00:00
Object(0000000002) 이순신 2022-01-03 00:00:00


[ TTL 인덱스 생성 ]

db.이름.createIndex( { "date_time": 1 }, { expireAfterSeconds: 60 } )


이렇게 설정을 하면, date_time이 현재 시간 기준 60 초(1분) 보다 큰 데이터는 모두 삭제한다.

여기서 기준은 현재 시간 ( 서버 시간 ) 을 기준으로 데이터를 삭제한다는 것이다.

이러한 효과를 이용하면 재미있는 데이터 라이프 사이클를 설정할 수 있다.

먼저, date_time이 insert_time (저장된 시간) 이라면, 해당 데이터는 저장 후 1분 이내 삭제가 된다.

하지만, date_time이 insert_time이 아닌, 미래 시간(삭제를 하고 싶은 시점) 을 입력하면,

미래에 현재 시간이이 date_time 보다 1분이 더 흘러가야 해당 데이터는 삭제된다.

expireAfterSeconds는 혹시 day나 hour 이 없나 찾아 봤는데, 안타깝게 초로만 입력을 해야 한다. .

즉, 무지성으로 원하는 삭제 시간을 초를 계산해 주어야 한다.

1분 : 60초
1시간 : 3600초
1일 : 86400 초

이렇게 말이다. ;;;;

계산기를 활용해 해당 시간을 계산하는 방법도 있지만,

나는 주로 네이버를 활용한다 ㅎㅎ


네이버에서 [초 변환] 이라고 검색하면, 원하는 기간을 초로 환산해준다.

생각보다 일자를 초로 바꾸는 작업이 헤깔린다....

곱하기가 많아지면서, 내가 어디까지 곱했지 하고 종종...잊어버린다.

이럴 때, 해당 시스템을 사용하는걸 추천한다.


4. 마무리


몽고디비라고 해도 무지성으로 사용하면, 개발자가 아플 수 있다.

NOSQL를 사용하다보면, RDB 처럼 설계의 기법이 정해진 것이 아니라,

설계 당시 많은 생각을 하고, 만들어야 한다.

NOSQL 만큼은 설계의 많은 경험이 필요한거 같다.

같은 데이터라도, 성능 차이가 극단적으로 나는게 NOSQL 시장이다.

좋은 설계를 확보해도, 결국 자원이 무제한이 아니다.

한정된 자원에서, 좋은 설계를 유지하려면 TTL은

필수이다. 물론 좋은 설계자라면 TTL을 당연히

설계를 했을것이다.

몽고디비가 용량 반환만 해주어도...

TTL의 중요도는 조금 떨어질것이다.

하지만, 몽고는....용량을 자동으로 반환해주지 않지..

참 좋은데.. 딱 하나가 슬프게 하네 ㅜㅜ




반응형

'mongodb' 카테고리의 다른 글

mongodb의 Data join은 lookup!!  (0) 2023.03.10
mongodb group by 샘플  (0) 2023.03.09
MongoDB Spark Connection 테스트  (0) 2021.07.15
Mongodb Shard 추가 및 주의사항  (0) 2021.04.22
mongodb shard 제거하기 ( remove )  (1) 2021.04.22