개발

MongoDB Bucket Pattern

senyalog 2024. 12. 23. 19:22

The Bucket Pattern

  • 타임시리즈 데이터를 효율적으로 저장하고 읽기 성능을 최적화하기 위해 데이터를 그룹화하여 저장하는 디자인 패턴

 

Main Idea

  • 데이터를 일정 범위(시간, 범위, 키)에 따라 그룹화하여 하나의 문서에 저장. 다수의 작은 문서 대신, 관련 데이터를 하나의 버킷에 모아 읽기/쓰기 성능을 최적화


Additional

  • 그룹화 기준은 무엇으로 할 것인가?
    • 조직id 별로 매출을 모아서 확인할 수 있어야함
    • 모든 조직에 대한 매출 합계를 확인할 수 있어야함
  • 하나의 bucket에 들어가는 데이터의 양은 어떻게 할 것인가?!
    • 하나의 문서에는 16MB를 초과하지 않아야함
    • 16MB의 크기는 어느정도일까?!
      • timestamp 는 약 20바이트
{
  "_id": "sensor1",
  "bucketStart": "2024-12-19T10:00:00Z",
  "bucketEnd": "2024-12-19T10:10:00Z",
  "metadata": { "location": "Seoul", "deviceType": "sensor" },
  "data": [
    { "timestamp": "2024-12-19T10:00:00Z", "value": 30.5, "quality": "GOOD" },
    { "timestamp": "2024-12-19T10:01:00Z", "value": 31.0, "quality": "GOOD" },
    ...
  ]
}
  • 위 구조에서는 한 항목당 68바이트 정도의 데이터를 갖음
  • 16MB에 저장 가능한 데이터는 246829개의 항목이 됨
  • 그렇다면 분 당 약 4114개의 데이터를 넣을 수 있음
  • 다만 최대 크기가 16MB이니 이를 꽉채워 사용하는 것보단 여유를 두고 사용하는 것이 좋을 것 같음
  • 현 개발 중인 서버에서 분당 요청이 많아도 100단위이기 때문에 bucket의 최대 사이즈는 크게 고민하지 않아도 될 것 같음__
  • 어떤 단위로 버킷을 쪼갤지?
    • 정답은 없음. 어떤 단위로 쪼갤지에 대한 근거만 있으면 됨.
    • 글로벌 서비스를 운영하는 경우에는 한시간 단위로 bucket을 생성하는 것이 직관적인 계산하는데 편하지 않을까 싶음.

번외 

  • mongodb에서 document 크기를 확인하는 명령어
    • db.collection.findOne({}).bsonsize()