mongodb에서 시계열을 어떻게 저장해야합니까


11

시계열 데이터베이스를 만들고 다음 작업을 수행해야합니다.

  • 새로운 시계열 만들기
  • 기존 시계열 업데이트
  • 한 번에 하나 이상의 시계열을 쿼리합니다 (예 : 같은 날짜의 모든 시계열 등).

Mongo가 이에 적합합니까? 그렇다면 데이터베이스를 어떻게 구성해야합니까? (한 번의 serie = 하나의 문서? 또는 한 개의 문서 = time serie의 한 항목이며이 모든 문서가 전체 시계열 인 컬렉션을 구성합니까?)

여기에서 약간 길을 잃었고 일반적으로 Mongo가 매우 유연하게 표시되어 사용자가 인프라에서 선택할 수있는 정보를 찾기가 어렵습니다.

Mongo에서 시계열을 관리하는 방법을 구체적으로 설명하는 자습서 링크는 매우 환영합니다.

감사합니다!


MongoDB의 시계열 데이터 스키마 설계를 지금 읽으십시오 . 이것에 아주 좋은 글.
akauppi

MongoDB의 시계열에 대해 설명하는 업데이트 된 백서가 있습니다. mongodb.com/collateral/time-series-best-practices
Robert Walters

답변:


6

문서 당 단일 시계열 항목을 제안합니다. 문서 당 여러 항목을 저장하는 데 몇 가지 문제가 있습니다.

  • 단일 문서는 특정 크기 (현재 16MB)로 제한됩니다. 단일 문서에 저장할 수있는 항목 수를 제한합니다.
  • 더 많은 항목이 문서에 추가되면 전체 문서 (및 시계열)가 불필요하게 삭제되고 더 큰 메모리에 재 할당됩니다.
  • 하위 문서에 대한 쿼리는 일반 문서에 대한 쿼리와 비교하여 제한됩니다
  • 매우 평평한 구조의 문서 (예 : 초당 하나의 하위 문서)는 성능이 떨어집니다
  • 내장 된 map-reduce는 하위 문서에서 잘 작동하지 않습니다

또한 타임 스탬프는 기본 MongoDB ObjectId에 내장되어 있습니다. 시계열 정밀도가 1 초 미만인 경우이를 사용할 수 있습니다 .

다음은 MongoDB를 사용하는 이벤트 로깅 라이브러리예제 BSON 문서입니다 .

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

이벤트 로그는 시계열과 유사하므로 나머지 코드를 연구하는 것이 좋습니다. Java, C #, PHP 및 Python 버전이 있습니다.

또 다른 유사한 오픈 소스 프로젝트가 있습니다 : Zarkov


[업데이트] @RockScience의 의견에 따라 몇 가지 참조를 추가했습니다.


내 시계열에 몇 년 동안 내일 데이터가있는 경우 많은 문서가 될 것입니다 !!! 문서가 너무 많아서 문제가되지 않습니까? SQL 배경에서 왔을 때 메모리가 그리 효과적이지 않다는 것을 알았습니다. (동일한 시계열의 모든 데이터 요소에 대해 많은 반복이 있기 때문에)
RockScience

@RockScience : 다른 많은 NoSQL 데이터베이스와 마찬가지로 MongoDB는 유연성, 속도 및 CPU 사용량 감소와 같은 다른 요소를 선호하여 정규화 및 메모리 효율성을 피합니다. 메모리 효율성이 필요한 경우 MongoDB가 올바른 솔루션이 아닐 수 있습니다. MongoDB는 큰 소리로 외치기 위해 각 필드의 전체 텍스트 이름을 모든 문서에 복사합니다 ! 어쨌든 MongoDB를 사용하여 매우 큰 시계열을 저장하는 방법에 대한 사례 연구를 포함하여 몇 가지 추가 리소스로 답변을 업데이트했습니다.
Leftium


2

물론, NoSQL 데이터베이스는 기존 RDBMS보다 시계열 데이터 저장에 더 적합합니다.

예. MongoDB는이 사용 사례에 매우 적합합니다.

데이터베이스를 어떻게 구성해야합니까? 하나의 문서 = 하나의 시계열 입력 대 여러 시계열.

답은 하나의 문서에 여러 시계열을 저장하는 것입니다. 문서 수가 적 으면 읽기 횟수가 적을수록 성능이 향상됩니다. 하나의 트릭은 사전 정의 된 값으로 문서를 준비하는 것입니다. 레코드 패딩 을 피하여 문서 업데이트를 최적화합니다 .

다음은 분 간격으로 1 시간 분량의 시계열을 최적으로 저장하는 방법에 대한 스키마 예입니다.

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

0 값으로 시작하면 업데이트가 최적화됩니다. 읽기는 60 개가 아닌 하나의 문서를 읽기 때문에 최적화됩니다. 하루에 해당하는 데이터를 저장해야하거나 한 달에 같은 기술을 사용하면 아이디어를 얻을 수 있습니다.

다음은 공식 MongoDb 블로그에서 MongoDb의 시계열을 관리하는 방법을 구체적으로 설명하는 자습서 링크입니다. http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- 몽고 드


1
문서 내에서 데이터를 버킷 팅하면 성능 및 리소스 사용량이 향상됩니다. MongoDB 모범 사례 백서에 대한 업데이트 된 시계열에 대해 세 가지 스키마 시나리오가 설명되어 있습니다. mongodb.com/collateral/time-series-best-practices
Robert Walters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.