튼튼발자 개발 성장기🏋️

[MongoDB] 제한 컬렉션 본문

카테고리 없음

[MongoDB] 제한 컬렉션

시뻘건 튼튼발자 2025. 3. 17. 23:34
반응형

MongoDB에서 제한 컬렉션은 고정된 크기를 가지며, 저장 공간이 초과되면 가장 오래된 데이터가 자동으로 삭제되는 특성을 가진 컬렉션이다. 제한 컬렉션은 주로 로그 데이터, 센서 데이터, 실시간 데이터 스트림과 같이 일정량의 최신 데이터만 유지해야 하는 경우에 사용된다.

제한 컬렉션 특징

  • 고정된 크기: 설정된 크기를 초과하면 가장 오래된 문서가 자동으로 삭제됨
  • 쓰기 성능 최적화: 미리 할당된 공간을 사용하여 성능이 우수함
  • 자동 삭제: 별도의 삭제 연산 없이 오래된 데이터가 자동으로 사라짐
  • 정렬 보장: _id 필드 기준으로 입력 순서가 보장됨
// 제한 컬렉션 생성
db.createCollection("capped_logs",
{
   "capped":true,
   "size":1048576,
   "max":1000
});
  • capped: true : 제한 컬렉션으로 생성
  • size: 1048576 : 1MB 크기로 제한
  • max: 1000 : 최대 1000개의 문서만 유지

tailable cursor

제한 컬렉션에서 새롭게 추가되는 문서를 계속해서 읽을 수 있도록 하는 커서이다. 이는 `tail -f`를 생각하면 쉽게 이해할 수 있다/. 새로운 문서가 추가될 때 자동으로 가져올 수 있다. 다만 10분 동안 아무런 경과가 없으면 종료되므로 이후에 컬렉션에 다시 쿼리하는 로직을 포함시켜야한다.

  • 실시간 스트리밍: 새로운 문서가 추가될 때 자동으로 읽을 수 있음
  • 기존 문서 유지: 삭제된 데이터는 다시 읽을 수 없음
  • 로그 모니터링에 유용

 

var cursor = db.capped_logs.find()
	.addOption(DBQuery.Option.tailable)
	.addOption(DBQuery.Option.awaitData);
    
while (cursor.hasNext()) {
    printjson(cursor.next());
}

위 코드에서는 제한 컬렉션에서 데이터를 지속적으로 읽어오는 tailable cursor를 생성하여, 새로운 데이터가 추가될 때마다 자동으로 출력한다.

 

TTL 인덱스

TTL 인덱스는 문서가 일정 시간이 지나면 자동으로 삭제되도록 하는 인덱스이다. 로그 데이터, 임시 데이터 등 자동 삭제가 필요한 데이터에 적합하다.

TTL 인덱스 생성 방법

// 1시간 후 자동 삭제되는 TTL 인덱스 생성
db.expiringData.createIndex({
   "createdAt":1
},
{
   "expireAfterSeconds":3600
});
  • expireAfterSeconds: 특정 필드 기준으로 문서를 자동 삭제하는 옵션

 

GridFS

[MongoDB란?]에서 등장한 GridFS가 나왔다. MongoDB GridFS는 BSON 문서 크기 제한(16MB)을 초과하는 파일을 저장하고 검색할 수 있는 파일 저장 시스템이다. 일반적으로 MongoDB는 하나의 문서에 16MB 이상의 데이터를 저장할 수 없지만, GridFS를 사용하면 대용량 파일도 MongoDB에서 효과적으로 관리할 수 있다.

  • 파일을 청크 단위로 저장 (기본 청크 크기: 255KB)
  • 메타데이터 저장 가능
  • 여러 드라이버에서 지원

GridFS의 작동 방식

GridFS는 파일을 작은 청크 단위로 나누어 저장하며, 두 개의 컬렉션을 사용한다.

  • fs.files: 파일의 메타데이터를 저장
  • fs.chunks: 실제 파일 데이터를 저장

파일을 저장할 때 기본적으로 255KB 크기의 청크로 나누어 저장하며, 필요에 따라 설정을 변경할 수도 있다. MongoDB 드라이버는 파일을 저장할 때 자동으로 청크를 관리하고 재조립하는 기능을 제공한다.

 

GridFS를 사용해야 하는 경우

다음과 같은 경우에는 GridFS를 사용하는 것이 유용하다.

  • 파일 크기가 16MB를 초과하는 경우: 일반 BSON 문서에 저장할 수 없는 대용량 파일을 관리할 때 필요하다.
  • 파일을 메모리에 로드하지 않고 일부만 액세스해야 하는 경우: GridFS는 전체 파일을 불러오지 않고 특정 부분만 검색할 수 있다.
  • 파일을 여러 시스템에 자동 배포해야 하는 경우: MongoDB 복제본 세트를 통해 데이터를 분산 저장할 수 있다.
  • 기본 파일 시스템의 제한을 극복해야 하는 경우: 디렉터리에 저장할 수 있는 파일 수가 제한된 경우에도 GridFS를 활용할 수 있다.

GridFS의 장점과 단점

장점

  • 대용량 파일 저장 가능: BSON 문서 크기 제한을 넘는 데이터를 저장할 수 있다.
  • 부분 검색 가능: 파일의 특정 부분만 불러오는 기능이 지원된다.
  • 복제 및 백업 용이: MongoDB의 복제 기능을 활용하여 데이터를 안전하게 관리할 수 있다.

단점

  • 파일 조각화 문제: 파일이 여러 개의 문서로 저장되므로, 성능이 저하될 수 있다.
  • 쓰기 성능 저하: 일반적인 파일 시스템보다 저장 속도가 느릴 수 있다.
  • 운영 부담 증가: GridFS를 활용하려면 MongoDB 설정을 최적화해야 한다.

GridFS 시작하기: mongofiles

MongoDB에서는 mongofiles 유틸리티를 사용하여 GridFS에 파일을 업로드하고 다운로드할 수 있다.

mongofiles -d mydb put example.txt // 업로드
mongofiles -d mydb get example.txt // 다운로드

 

MongoDB 드라이버로 GridFS 작업하기

from pymongo import MongoClient
from gridfs import GridFS

# MongoDB 연결
client = MongoClient("mongodb://localhost:27017")
db = client["mydb"]
fs = GridFS(db)

# 파일 업로드
with open("example.txt", "rb") as f:
    file_id = fs.put(f, filename="example.txt")
    print(f"File uploaded with id: {file_id}")

# 파일 다운로드
with open("downloaded_example.txt", "wb") as f:
    file_data = fs.get(file_id).read()
    f.write(file_data)
    print("File downloaded successfully")

client.close()

GridFS의 대안

GridFS를 사용하지 않고도 MongoDB에서 대용량 파일을 저장할 수 있는 방법이 있다.

  • BinData 데이터 타입 사용: BSON 문서 내에서 바이너리 데이터를 저장할 수 있지만, 16MB 제한이 있다.
  • 외부 스토리지 활용: AWS S3, Google Cloud Storage 같은 클라우드 스토리지를 사용하면 더 유연하게 대용량 파일을 관리할 수 있다.
반응형