시계열 데이터베이스로서의 MongoDB
시계열 데이터베이스에 mongodb를 사용하려고 하는데 그 시나리오에 가장 적합한 설정 방법을 제안할 수 있는 사람이 있는지 궁금합니다.
시계열 데이터는 주가 기록과 매우 유사합니다.저는 다른 기계에서 가져온 다양한 센서의 데이터 모음을 가지고 있습니다.수십억 개의 타임스탬프 값이 있으며 다음과 같은 질문을 하고 싶습니다(애플리케이션 수준보다는 데이터베이스에서 하는 것이 좋습니다).
주어진 센서 세트와 시간 간격에 대해, 나는 그 간격 내에 있는 모든 타임스탬프와 센서 값을 시간별로 순서대로 원합니다.모든 센서가 동시에 샘플링된 동일한 타임스탬프를 공유한다고 가정합니다.
주어진 센서 세트와 시간 간격에 대해, 나는 주어진 시간 간격 내에 있는 모든 k번째 항목(타임 스탬프 및 해당 센서 값)을 시간별로 순서대로 원합니다.
이를 가장 잘 설정하고 쿼리를 달성하는 방법에 대한 권장 사항이 있습니까?
제안해 주셔서 감사합니다.
분명히 이것은 오래된 질문이지만, 제가 시계열 데이터를 위해 MongoDB를 조사할 때 우연히 발견했습니다.새로운 삽입 작업이 아닌 완전한 문서를 사전에 할당하고 업데이트 작업을 수행하기 위해 다음과 같은 접근 방식을 공유할 가치가 있다고 생각했습니다.이 접근 방식은 여기와 여기에서 문서화되었습니다.
매 분마다 데이터를 저장하고 있다고 상상해 보십시오.다음 문서 구조를 고려합니다.
{
timestamp: ISODate("2013-10-10T23:06:37.000Z"),
type: ”spot_EURUSD”,
value: 1.2345
},
{
timestamp: ISODate("2013-10-10T23:06:38.000Z"),
type: ”spot_EURUSD”,
value: 1.2346
}
이는 표준 관계형 접근법과 유사합니다.이 경우 기록된 값당 하나의 문서를 생성하므로 삽입 작업이 많이 발생합니다.우리는 더 잘 할 수 있다.다음 사항을 고려합니다.
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “spot_EURUSD”,
values: {
0: 1.2345,
…
37: 1.2346,
38: 1.2347,
…
59: 1.2343
}
}
이제 문서 하나를 작성하고 59개의 업데이트를 수행할 수 있습니다.업데이트가 원자적이고 개별 쓰기가 더 작으며 다른 성능 및 동시성 이점이 있기 때문에 훨씬 더 좋습니다.하지만 우리가 전체 시간이 아니라 하루 전체를 하나의 문서에 저장하고 싶다면 어떨까요?그러면 마지막 값을 얻으려면 1440개 항목을 따라 걸어야 합니다.이를 개선하기 위해 다음 항목으로 확장할 수 있습니다.
{
timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
type: “spot_EURUSD”,
values: {
0: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
1: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
…,
22: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
23: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343}
}
}
이 중첩된 접근법을 사용하면 하루의 마지막 값을 얻기 위해 최대 24 + 60만 걸으면 됩니다.
미리 패딩으로 채워진 모든 값으로 문서를 작성하면 문서의 크기가 변경되지 않으므로 이동되지 않습니다.
데이터를 영구히 보관할 필요가 없는 경우(즉,당신은 그것을 신경쓰지 않을 것입니다). 당신은 아마도 '유효한 수집'을 고려하는 것이 좋을 것입니다.상한선이 있는 컬렉션에는 여러 가지 제한 사항이 있으며, 이는 사용자가 원하는 것에 잘 맞는 것처럼 들리는 몇 가지 흥미로운 이점을 제공합니다.
기본적으로 캡션 컬렉션은 지정된 크기를 가지며, 채워질 때까지 삽입 순서대로 문서가 작성되며, 이 때 가장 오래된 문서를 최신 문서로 덮어씁니다.제한된 컬렉션의 문서에 대해 수행할 수 있는 업데이트가 약간 제한되어 있습니다.문서 크기를 변경하는 업데이트를 수행할 수 없습니다(추가 공간을 찾으려면 디스크로 이동해야 함).당신이 묘사한 것에 대해 이것이 문제가 되는 것을 볼 수 없습니다.
결과적으로 상한 컬렉션의 데이터는 삽입 순서대로 디스크에 기록되고 그대로 유지되므로 삽입 순서에 대한 쿼리가 매우 빨라집니다.
그런데 센서와 센서가 생산하는 데이터는 얼마나 다른가요?만약 그것들이 비교적 비슷하다면, 저는 그것들을 사용하기 쉽도록 같은 컬렉션에 모두 저장하는 것을 제안하고 싶습니다. 그렇지 않으면 그것들을 나누세요.
단일 컬렉션을 사용한다고 가정하면 두 쿼리 모두 매우 실행 가능한 것처럼 들립니다.한 가지 주의해야 할 점은 상한 컬렉션의 이점을 얻으려면 컬렉션의 '자연스러운' 순서에 따라 쿼리해야 하므로 타임스탬프 키로 쿼리하는 것이 그렇게 빠르지 않다는 것입니다.판독치가 일정한 간격으로 측정된 경우(특정 시간 간격으로 측정된 판독치의 수를 알 수 있음) 쿼리 1에 대해 다음과 같은 방법을 제안합니다.
db.myCollection.find().limit(100000).sort({ $natural : -1 })
예를 들어, 초당 100회의 판독치를 저장한다고 가정하면 위의 데이터는 마지막 100초 분량의 데이터를 반환합니다. 100초를 추가할 수 ..skip(100000)
.
두 번째 질문의 경우 MapReduce가 필요할 것 같지만 특별히 어려운 질문은 아닌 것 같습니다.위의 쿼리와 유사한 쿼리를 사용하여 관심 있는 문서 범위를 선택한 다음 관심 있는 문서 간격만 선택할 수 있습니다.map
기능.
다음은 상한선이 있는 컬렉션에 대한 Mongo Docs입니다. http://www.mongodb.org/display/DOCS/Capped+Collections
이것이 도움이 되길 바랍니다!
이것이 오래된 질문이라는 것을 알지만, 저는 저에게 많은 도움이 되는 블로그들을 찾았습니다.
언급URL : https://stackoverflow.com/questions/7368759/mongodb-as-a-time-series-database
'programing' 카테고리의 다른 글
아이폰의 반환 키를 키보드가 사라지게 만드는 방법은 무엇입니까? (0) | 2023.06.22 |
---|---|
GCC의 정렬된 malloc()? (0) | 2023.06.22 |
wp-admin에서 페이지의 제목을 편집할 수 없도록 하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
안드로이드 응용 프로그램에서 직접 Google Play Store를 여는 방법은 무엇입니까? (0) | 2023.06.17 |
ASP.Net에서 상태 코드 500을 보내고 응답에 쓰는 방법은 무엇입니까? (0) | 2023.06.17 |