MongoDB에서 제공하는 TTL Index를 적절히 활용하여 데이터 관리간 로그성 데이터나
세션 정보와 같은 일회성(임시) 데이터 관리를 간편하게 할 수 있습니다.
시작에 앞서 우선 TTL이 의미하는 바에 대해 먼저 알아보고 가겠습니다.
TTL 이란?
위키백과에 따르면 TTL을 다음과 같이 정의하고 있습니다.
타임 투 리브(Time to live, TTL)는 컴퓨터나 네트워크에서 데이터의 유효 기간을 나타내기 위한 방법이다. TTL은 계수기나 타임스탬프의 형태로 데이터에 포함되며, 정해진 유효기간이 지나면 데이터는 폐기된다. 컴퓨터 네트워크에서 TTL은 패킷의 무한 순환을 방지하는 역할을 한다. 컴퓨터 애플리케이션에서 TTL은 캐시의 성능이나 프라이버시 수준을 향상시키는 데에 사용되기도 한다. |
또한 MonogoDB 레퍼런스 사이트상에서 TTL Index를 아래와 같이 정의하고 있습니다.
TTL 인덱스는 MongoDB가 특정 시간 이후 또는 특정 시계 시간에 컬렉션에서 문서를 자동으로 제거하는 데 사용할 수있는 특수 단일 필드 인덱스이며, 한정된 시간 동안만 데이터베이스에 유지해야하는 이벤트 데이터, 로그 및 세션 정보와 같은 특정 유형의 정보 관리에 유용합니다. |
앞서 해당 정의를 알아보았고 실제 MongoDB 에서 어떻게 Index를 설정하는지 알아보도록 합시다
우선 실습에 앞서 test collection에 document를 하나 insert해 보도록 하겠습니다.
#test collection상 테스트 데이터 insert
> db.test.insert({
... "createdAt": new Date(),
... "logEvent":2,
... "logmessage":"true"
... })
#insert된 데이터 확인
> db.test.find()
{ "_id" : ObjectId("5e9e695d2102239e089d86f1"), "expiredAt" : ISODate("2020-04-21T03:33:02Z"), "logEvent" : 2, "logmessage" : "true" }
MongoDB TTL Index 생성 방법
TTL인덱스를 생성해 보겠습니다.
(생성시 파라미터의 각 의미는 아래를 참고해 주세요)
#TTL Index 생성
#createdAt을 기준으로, 해당 value값의 시점보다 120초 이후면 삭제되도록 index생성
> db.test.createIndex({"createdAt":1},{expireAfterSeconds : 120})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
- expiredAt : 해당 필드에 index를 생성
- 1 : true 를 의미
- expireAfterSeconds : 120
- 해당 필드 value에 적혀있는 시간에서 120초 이후에 삭제를 진행
생성이 정상적으로 완료되었다면 아래 명령어를 통해 Index가 생성되어 있는것을 확인 하실 수 있습니다.
#Index 확인
#_id : OjbectId로 default Index가 생성 되어있고, 추가한 createdAt Index를 확인할 수 있다.
> db.test.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.test"
},
{
"v" : 2,
"key" : {
"createdAt" : 1
},
"name" : "createdAt_1",
"ns" : "test.test",
"expireAfterSeconds" : 120
}
]
위 예제에서 처음 데이터 생성시 createdAt을 new Date()를 이용하여 생성했기에
데이터 생성시점 이후 120초 후에 해당 데이터가 삭제되어 있는것을 확인하실 수 있습니다.
MongoDB TTL Index 활용
TTL index를 아래와 같이 활용 또한 가능 합니다.
#TTL Index 생성
#expiredAt 필드를 기준으로, 해당 시점과 현재 시점이 같을경우 삭제하도록 생성
> db.test.createIndex({"expiredAt":1 }, {expireAfterSeconds:0})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
이렇게 TTL Index를 생성해 둔 뒤, collection에 Document를 insert할때 아래와 같이 ExpiredAt의 Value를
실제 삭제가 필요한 시점으로 넣어 두면 해당 시점에 데이터가 삭제 되는 것을 확인하실 수 있습니다.
#테스트데이터 insert
#현재 expiredAt에 TTL index를 expireAfterSeconds 를 0 으로 설정해 두었기에 해당 시점에 데이터가 삭제 된다.
> db.test.insert({
... "expiredAt": new Date('April 21, 2020 03:33:02'),
... "logEvent":2,
... "logmessage":"true"
... })
참고로 MongoDB의 TTL Thread는 1분단위로 동작하고 있음으로, 1분 가량의 오차가 존재할수 있으며 시스템의 부하정도에 따라서도 해당 시점이 조정될수 있으니 사용에 참고해 주시기 바랍니다.
MongoDB Index 삭제 방법
마지막으로 생성했던 Index 삭제하는 방법에 대해 소개해 드리고 마무리 하도록 하겠습니다.
#Index 삭제
#Index의 key값을 입력(아래 예제에서는 expiredAt 이 key), 1은 true를 의미
> db.test.dropIndex({"expiredAt":1})
'IT Tech > MongoDB' 카테고리의 다른 글
MongoDB 외부접속 허용하기 (0) | 2020.08.26 |
---|---|
MongoDB 컬렉션 및 필드명 변경하기 (0) | 2020.04.20 |
MongoDB query log 설정방법 (0) | 2019.12.19 |
댓글