2012-01-18 6 views
8

나는 mongodb를 사용하여 스트림으로 나와있는 30 일 데이터를 저장합니다. 나는 새 데이터를위한 공간을 만들기 위해 가장 오래된 데이터를 버릴 수있는 제거 메커니즘을 찾고있다. 나는이 상황을 파티션을 사용하여 처리했던 mysql을 사용했다. 나는 날짜 기반 인 30 개의 파티션을 유지했다. 가장 오래된 날짜가 지정된 파티션을 삭제하고 새 데이터를 저장할 새 파티션을 만들었습니다. Mongodb에서 데이터베이스 제거를 처리하는 방법

내가 MongoDB의에서 같은 일을지도

, 나는 '파편'을 기반으로 날짜를 사용하여 같은 느낌. 그러나 문제는 그것이 나의 데이터 분배를 나쁘게 만든다는 것이다. 새로운 데이터가 모두 같은 샤드에 있다면, 그 샤드는 너무나 뜨거워서 많은 사람들이 액세스하고 오래된 데이터를 포함하는 샤드는 사용자가 덜로드하게됩니다.

컬렉션을 기반으로 제거를 수행 할 수 있습니다. 30 개의 콜렉션을 가질 수 있으며 새로운 데이터를 수용하기 위해 가장 오래된 콜렉션을 버릴 수 있습니다. 하지만 몇 가지 문제가 있습니다. 1) 컬렉션을 작게 만들면 컬렉션별로 수행되는 것처럼 샤딩으로 많은 이점을 얻을 수 없습니다. 2) 내 쿼리는 30 개 컬렉션 모두에서 쿼리로 변경하고 유니온을 가져와야합니다.

이 상황을 처리하기위한 좋은 제거 메커니즘 (있는 경우)을 제안하십시오.

답변

9

실제로 MongoDB에서 제거하는 데는 3 가지 방법이 있습니다. 이미 몇 가지 트레이드 오프를 확인한 것 같습니다. 단일 수집

:

  1. 단일 수집 된 데이터베이스

옵션 # 1을 삭제, 오래된 컬렉션을 하루

  • 데이터베이스를 드롭 된 항목을 하루
  • 컬렉션을 삭제 찬성

    쉬운지도/
  • 단점

    • 삭제는 삽입 한 비용이 감소 실행
    • 쉬운을 구현하는
      • 는 IO를 많이하고 "조각 모음"또는 할 필요가 원인 DB를 "압축"합니다. 둘 다 에있는 당신이 두 배 "쓰기"를 취급 결국 어느 시점에서
      • 하루 분량의 데이터와 의 데이터 하루의 가치를 삭제를 삽입합니다.

      옵션 # 2 : 1 일 기준, 수집

      프로

      • collection.drop()를 통해 데이터를 제거하기가 매우 빠릅니다.
      • Still Map/Reduce를 사용하면 매일 출력을 요약 데이터와 병합하거나 다시 줄일 수 있습니다.

      단점

      • 당신은 여전히 ​​단편화 문제가있을 수 있습니다.
      • 쿼리를 다시 작성해야합니다. 그러나, 필자가 충분한 양의 데이터를 가지고 있다면 내게 직접 데이터에 액세스하는 경우는 드뭅니다. 대신에 그 데이터에 대해 Map/Reduces를 실행하는 경향이 있습니다. 따라서이 변경되지 않을 수 있습니다 해당 많은 쿼리.

      옵션 # 3 : 1 일 기준, 데이터베이스

      • 삭제가 가능한 한 빨리이다

        프로이 파일은 단순히 잘립니다.

      • 제로 조각화 문제 및 이전 데이터의 백업/복원/보관이 쉽습니다.

      단점

      • 은 (일부 래퍼 코드를 기록 할 것으로 예상) 더 도전을 조회 할 것이다.
      • 지도/Reduce를 작성하는 것이 그리 쉽지는 않지만 어쨌든 사용자의 요구를 더 잘 충족시킬 수있는 Aggregation Framework를 살펴보십시오.

      지금 옵션 # 4가 있지만, 일반적인 해결책이 아니다. 단순히 Capped Collections을 사용하여 "제거"했던 사람들을 알고 있습니다. 확실히 작동하는 경우가 있지만 엄격한 경고가 있으므로 실제로 수행중인 작업을 알아야합니다.

    관련 문제