큰 시계열 데이터를 효율적으로 저장하는 방법은 무엇입니까?


27

매우 많은 양의 시계열 데이터를 저장하고 쿼리 할 수 ​​있어야합니다.

데이터의 속성은 다음과 같습니다.

  • 시리즈 수 : 약 12.000 (12,000)
  • 전 세계의 데이터 포인트 수 : 한 달에 약 500.000.000 (5 억)
  • 혼합 값 유형 : 대부분의 데이터 포인트는 부동 소수점 값이고 나머지는 문자열입니다
  • 샘플링주기 : 시리즈 간 및 시리즈 변수
  • 타임 스탬프 : 밀리 초 정밀도
  • 데이터 보존 기간 : 붕괴 또는 다운 샘플링없이 몇 년
  • 데이터 아카이브는 거의 실시간으로 구축해야하지만 합리적인 지연 (~ 1 시간)이 허용됩니다.
  • 필요한 경우 과거 데이터를 재 구축 할 수 있지만 높은 비용
  • 때때로, 그러나 아주 드물게 일부 과거 데이터를 업데이트해야합니다

계획된 쿼리의 속성 :

  • 데이터에 대한 대부분의 쿼리는 타임 스탬프 기반 쿼리입니다. 하루에서 몇 개월 / 년까지 다양합니다. 90 % 이상이 최신 데이터에 대한 쿼리입니다.

다른 요구 사항 :

  • 이 솔루션은 무료 맥주와 마찬가지로 무료이어야하며 오픈 소스

내 생각은 PyTables / Pandas를 HDF5 파일 과 함께 SQL 데이터베이스 대신 백엔드로 저장하는 것으로 생각했습니다 .

질문 :

  1. PyTables / Pandas가 "최상의"경로라고 가정하면 데이터를 여러 HDF 파일로 분할하는 것이 좋습니다. 각 파일은 주어진 시간에 걸쳐 있거나 단일 파일에 넣은 다음 큰 파일이됩니까?

  2. 고정 또는 표 형식을 선호합니까? 한 달에 하나의 HDF 파일을 유지하면 고정 형식이 정상적으로 보입니다.이 방법으로 전체 시리즈가 RAM에 적합하고 테이블 형식 색인이 없어도 메모리 내에서 슬라이스 할 수 있습니다. 나 맞아 ?

이것이 최선의 방법 이 아닌 경우이 데이터 저장소를 어떻게 구성해야합니까? 또는 어떤 기술을 고려해야합니까? 대규모 시계열 데이터 세트를 다루는 것은 처음이 아닙니다.이 문제를 해결하는 일반적인 방법은 무엇입니까?


내가 고려한 다른 접근법 :

  • 배열 데이터베이스 : 배열의 시작 및 종료 시간과 샘플링 기간 만 저장하면되므로 배열 자체의 값과 인덱싱이 쉬우므로 일정한 샘플링 기간을 가진 시계열에 가장 적합합니다. 그러나 시리즈 자체 내에서 가변 샘플링 기간을 사용하면 타임 스탬프-> 값 관계를 더 가깝게 유지해야합니다. 제 관점에서 배열 DBMS에 적합하지 않습니다.
  • 타임 스탬프, paramID, 값이 열인 표준 SQL 데이터베이스이지만 특성상 쿼리에 대해 많은 디스크 I / O를 요청합니다.

배열 데이터베이스 ( en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS)를 고려해야합니다 . 나는 그들 중 하나가 당신의 생각에 들어가야한다고 옳고, 심지어 가장 좋고 심지어는 충분하다고 대답하지 않습니다. 해당 목록의 항목 외에도 kdb 시스템 ( kx.com )이 있지만 무료는 아닙니다.
고성능 Mark

입력 해 주셔서 감사합니다. 배열 데이터베이스를 고려했지만 이것으로 발견 한 문제는 일정한 샘플링 기간을 가진 시계열에 가장 적합하다는 것 입니다. 그러면 배열의 시작 및 종료 시간과 샘플링 기간 만 저장하면됩니다. 배열 자체와 인덱싱이 쉽습니다. 그러나 시리즈 자체 내에서 가변 샘플링 기간을 사용 하면 타임 스탬프-> 값 관계를 더 가깝게 유지해야합니다. 제 관점에서 배열 DBMS에 적합하지 않습니다. 그 말로, 나는 틀렸다는 것이 기쁘다.
flyingmig

지금까지 고려한 내용을 추가하기위한 편집 질문
flyingmig

질문 : 모든 데이터를 저장해야합니까? 시간이 지남에 따라 데이터가 소멸 될 수 있습니까?
J Trana

1
@ moinuddin-quadri 테이블 형식을 사용하여 월별 HDF5 파일로 백업 된 팬더 DataFrame 객체를 사용했습니다. 이 시스템은 1 년 이상 운영되어 왔으며 SSD 디스크를 사용하지 않아도 매우 안정적이고 빠릅니다. 나는 시간이있을 때 답으로 모든 것을 기록하려고 노력할 것이다. 그렇지 않으면 저에게 PM을 자유롭게 느끼십시오.
flyingmig

답변:


5

흑연 프로젝트의 일부인 탄소속삭임을 살펴볼 수 있습니다 . 카본은 매우 많은 양의 시계열 데이터를 처리 할 수 ​​있습니다. 이제 문서를 읽었으므로 (사용한 지 몇 년이 지났음) 숫자 데이터 전용입니다. 문자열 데이터도 있다고 말하면 유용하지 않을 수 있습니다. 그러나 대량의 데이터를 신속하게 처리 할 수있는 방법에 대한 지혜를 얻을 수 있습니다.

흑연이 Orbitz에서 처음 생산 될 때 얼마나 잘 스케일링되는지에 대한 아이디어를 제공하기 위해 분당 160,000 개의 메트릭 을 처리했습니다 .


제안에 감사드립니다. 그러나 밀리 초 정밀도가 필요할 때 정밀도가 두 번째이며, 올바르게 지적했듯이 거기에 저장할 수없는 문자열 데이터가 있기 때문에 이해의 속삭임에 맞지 않습니다.
flyingmig

1
@flyingmig 속삭임을 너무 빨리 쓰지 마십시오. 타임 스탬프는 유닉스 시대 값입니다. 그리고 질문에 설명 된 "문자열 데이터"는 열거 형과 비슷하게 들리며 일반적으로 작은 정수 값으로 저장됩니다.
로스 패터슨

Sears는 탄소 / 흑연 / 세레스를 사용하여 분당 4M + 고유 데이터 포인트를 저장합니다. 완벽하지는 않지만 흑연 클러스터링과 SSD가 필요하지만 작동합니다. 다른 모든 솔루션은이 수준까지 확장 할 수 없지만 우리가 발견 한 아이디어가 있다면 자유롭게 참여할 수 있습니다.
Kevin J. Rice

3

InfluxDB 는 Go로 작성된 오픈 소스 데이터베이스입니다. 특히 시계열 데이터를 처리하기 위해 작성되었으며 Cassandra보다 훨씬 우수한 성능을 보여주는 벤치 마크를 게시했습니다 .

InfluxDB는 디스크 공간을 10.8 배 더 적게 사용하고 테스트 된 쿼리에 대해 최대 168 배 빠른 응답 시간을 제공하면서 4.5 배 더 높은 쓰기 처리량으로 세 가지 테스트에서 Cassandra보다 성능이 뛰어났습니다.


2

열 지향 데이터베이스를 체크 아웃 할 수 있습니다. 배열 데이터베이스의 의미가 확실하지 않지만 제안 된 접근 방식을 사용하면 시간 프레임 당 동적 값을 가질 수 있습니다. 동일한 타임 스탬프에 대해 여러 값을 가질 수도 있습니다. 흥미로운 부분은 동일한 타임 스탬프에서 측정 된 값이있는 경우 추가 열 (예 : 온도 및 습도, 주식 거래 가격 및 거래 규모 등을 측정하는 센서)로 저장할 수 있다는 것입니다. 열 지향 특성으로 인해 열이 100 개인 테이블을 가질 수 있지만 쿼리가 5 개의 열에 만 액세스하는 경우 데이터베이스는 5 개의 열의 데이터 만 읽습니다.

자신의 시계열 데이터베이스를 만드는 방법에 대한 시리즈를 작성했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.