만약 자신의 집에서 사용중인 전기를 측정하는 센서가있다고 치고 , 그 센서는 1초에 한번씩 전력값을 측정한다고 치자. (사실 센서에서는 수천번 측정한다고한다.그것들의 1초 평균값을 가져온다고 생각하자. 더 상세하게 분석하려면 1초 평균값,최대피크값등등 가져오면 더 좋을것이다.물론BM에따라서는 1분당 , 1시간당 평균,최저,최고값을 사용할수도있겠다.)  이 측정 값을 분석해서 , 집안에서 사용중인 모든 가전제품등의 대기전력 및 여러가지 패을 알아낸다고 하자.  

막간 상식 코너 ~! 

와트(W)  : 움직이는 전하는 일을 한다. 예를 들어 열을 발생시키거나 전동기를 회전시키는 등의 일을 한다. 일의 능률(전기에너지가 빛이나 열에너지로 바뀌는 비율)을 전력이라 한다. 

전력 (P) : 단위시간(1초) 동안 전기기구에서 소모하는 전기에너지의 량. 

P  =  V(볼트) * A(암페어) 




1초에 한번씩 생성되는 데이터를   시간/값 => ( "2015-10-15 10:50:30" , 563.34)  라고 하면  Postgresql 같은 일반 관계형데이터베이스에 저장한다고 치자.   

timestamp  or Character (20 byte) : real  (4byte) 이렇게 2가지의 컬럼이 필요하겠지.  

대략 25 바이트라고치고 , 

1분에 1500 byte 

1시간에 90000 byte  

1일에    2160000 byte   (대략 2 mb)

1달에    64800000 byte  (61 mb) 

1년에    788400000 byte (751 mb)  


집안에 센서가 여러개면 더 늘어나겠지. 일단 센서1개 로 잡고  백업,인덱스등 부산물의 데이타용량은 제외 ,  데이터를 압축 등 적용안한다고 치고  대략적으로 1기가라고 잡자. 

한가구에 대략 1기가로 잡고 , 만약 전기서비스를 하는 회사를 만들었다고 치고, 빅데이터들을 관리 분석한다고 할때 , 1만가구쯤을 대상으로 서비스한다고 치면 1만기가 =  9 테라바이트 정도 된다.

요즘 테라단위의 HDD 들이 나오고 있다. 10TB 도 나온듯하다. 와우~  (http://it.donga.com/21465/)

프로토타입으로 저런 데이터를  postgresql 에 모아서 ,모여진 데이터를 실시간으로 d3.js 를 이용해서 가시화 하고 있다고 하자.



이제부터 본격적인 시스템을 설계한다고 치면, 언제까지 저런 데이터를 postgresql 에 담아두고 활용할거냐는건데.. 웬지 , 용량을 더 늘려야할거 같다.  스케일 업을 할수도있고, 스케일 아웃을 할수도있겠지..스케일 아웃에 대해서 고려해면다면  couchbase / hadoop hdfs /  mongodb 뭐 이런것들이 떠오른다. 분석을 생각해본다면 , Apache storm 이나 spark streaming 도 떠오른다. 

여기서 한발 더 나아가서 ,  저런 시계열 데이터를 특별히 다루는것들이 있는지도 살펴봐야겠는데..몇몇가지가 있더라~~  그래서 이번 게시물에서는 그 몇몇가지에 대해서 한번 살펴본다.

그 시계열 DB 들이 couchbase / hdfs / mongodb 와 경쟁을 하게될지, 협업을 하게될지..나는 아직 잘모른다. 그 시계열 DB 들이  RDBMS 들과 어떤 앙상블을 이루게될지 희미하다. 따라서 일단 정리해본다. -.-v    (일단 주워담고, 차근차근 정리해본다. 당분간 정신없을 게시물이될듯)



OpenTSDB (http://opentsdb.net/)







- OpenTSDB 는 타임시리즈데몬(TSD) 들로 구성된다. 
- 잘 알려진 에너지 회사인 OPower 에서도 사용한다.
- 각각의 TSD 들은 독립적이며 상태공유 없이 돌아간다. 
- 각각의 TSD 는 HBase 를 사용하며, 타임시리즈데이터를 가져와서 저장한다.
- HBase 스키마는 저장공간을 줄이기위해 비슷한 타임시리즈를 빠르게 집약하는것에 최적화.
- TSD 유저들은 HBase 에 직접적으로 접근할 필요가 없다. 



InfluxDB (https://influxdb.com/)


0) 2013년 첫 릴리즈 

1) InfluxDB는 data store를 위해 구글이 만든 key/value database library인 LevelDB를 사용하고 있습니다.따라서, 아래와 같은 LevelDB의 특징을 가지고 있습니다.(다음버전엔 RocksDB 로 이동예정)

–  기본적으로 데이타를 compression하기 때문에 읽기와 삭제에 다소 느릴 수 있습니다.
   (출처: http://obfuscurity.com/2013/11/My-Impressions-of-InfluxDB, https://code.google.com/p/leveldb/)

– 그러나, LevelDB와 다르게 SQL-like query language를 지원합니다. group by, join, 또 복수개의 time series(RDBMS에서 테이블이라고 이해하시면 됩니다.)를 merge하는 것도 가능합니다.

2) InfluxDB는 distributed and scale horizontally하게 설계되었습니다. 따라서, cluster에 새로운 node만 추가하면 쉽게 scale-out 할 수 있습니다. 

3) Continuous Queries를 지원합니다. 이게 뭐냐면, 정해준 시간마다 해당 query를 실행해서 그 결과 값을 지정하는 테이블의 특정 칼럼으로 저장하게 해줍니다. 보통 분석, 통계 데이타를 쌓을 때 스케줄러를 통해 많이 하는 작업(downsampling 같은 작업)인데요. InfuxDB는 이런 작업을 Continuous Query 한방으로 해결해줍니다. 

4) MongoDB 처럼 Schemaless design입니다.

5) Primary interface로 native HTTP API를 제공하고 Java, Javascript, Ruby, Rails, Python, PHP,          Node.js, Go 등 많은 library를 제공합니다.

6)  Go로 작성되었습니다.

7) InfluxDB는 오픈소스입니다. 소스를 다운로드 받아서 쓰실 수 도 있고 아니면, influxdb.org에서 매달 일정 비용을 내고 호스팅 서비스를 받으실 수 있습니다.

8) Linux & OS X

9) 스키마 프리 

10) HTTP API / JSON over UDP 

11) Numeric data and String 

12) Sharding 지원 /  Selelctable replication factor 

 InfluxDB 는 여러모로 시계열  DB 중에 가장 널리 선택받고 사용될듯 합니다.

(저도 전력빅데이터 분석을 위해서 InfluxDB + Grafana 조합을 사용중입니다) 


Graphite  (http://graphite.wikidot.com/)


Graphite 는 무엇인가?

Graphite 는 높은 확장성을 가진  실시간  그래픽 시스템이다. 당신이 관심있어하는 그래프를 그리기위한  수치 타임시리즈 데이터를 수집할수있는 어플리케이션을 만들수있으며. 그것을 Graphite 의 벡엔드로 보낼수도있다.  그 데이터들은 Carbon 이라 불리는 Graphite 의 특별한 데이터베이스에 저장될것이다. 그리고나서 Graphite 의 웹 인터페이스를 통해 가시화될수있을것이다. 

Graphite 는 수치 타임시리즈 데이터를 다루기위해 특별히 디자인되었으며, 따라서 주식을 나타내는데 도 좋다. 오직 수백건을 표현하기위해서라면 Graphite 는 지나치다. 수백개의 서버에서 나타내는 수많은 성능 지표들을 나타내기위해서 적절하다. 


어떻게 스케일 확장가능한가?

CPU 관점에서 Graphite 는 프런트엔드 와 백엔드 양쪽모두 수평적으로 확장할수있다. 이 말은 당신은 그저 더 많은 서버를 추가하기만 하면 된다는것이다. 그것은 벡엔드 서버가 고장났을때, 데이터 손실을 야기하는 상황에서 내고장성을 가지고있다는뜻이며, 만약 충분한 수용능력이 있을경우 시스템 운용에 지장받지 않는다는것이다. 

I/O 관점에서 봤을때, under load Graphite 는 매우 빠르게 많은 다른 파일들상에서 작은 I/O 오퍼레이션을 수행한다. 이것은 Graphite 로 보내는 각각의 distinct metric 들이 자신의 데이터베이스 파일에 저장되기 때문이다. 

Graphite 의 벡엔드는 만약 디스크가 크기가 작은 수많은 쓰기 연산을 다룰수 없을때 들어오는 데이터를 캐쉬한다.  (대부분의 디스크들은 초당 수천 I/O 연산을 할수없다.비록 각각의 데이타포인트가 오직 수 바이트일지라도. 추가: HDD의 경우 초당 랜덤 엑세스가 100~200회 밖에 되지 않는다. TPS가 1,000이 넘어가는 요청은 랜덤 엑세스로는 처리하기가 어렵다. MySQL InnoDB의 경우 Sequential write를 통해 초당 2,000회 정도의 Insert가 가능하다.) . 그런 현상이 발생했을때 Graphite 의 데이터베이스 엔진 (Whisper) 은  카본에 한번에 여러개의 데이터포인트를 쓰는것을 허용한다. 그리하여 전반적인 처리량을 증가시킨다. 



- 2006 년 첫 릴리즈 

- 최근 릴리즈는 0.9.10 (12년  5월 31일. 업데이트가 안되는듯?) 

- python 으로 만들어진 오픈소스이다. (python 관련 라이브러리를 잔뜩 설치해야한다) 

- webapp 은 Django 로 만들어졌으며 , ExtJS 를 사용한다. 그래프 랜더링은 Cairo 를 사용함.

- 주요모듈은  carbon / whisper / graphite-web 이다.

-  Linux / Unix  (설치가 비교적 복잡한 편)

-  데이터 스키마 있음  

- HTTP API / Sockets 

- Numeric data only

Sharding / replication factor  없음  

- Apache 2.0 License. (굉장히 자유스러운 라이센스) 

 Collector는 Graphite에 어떠한 데이터를 쌓기 위한 모듈입니다. 여기에 대한 특별한 제한은 없습니다만, 시계열 데이터베이스의 특성상 기본적으로 데이터가 저장될 네임스페이스와 시간, 데이터 이렇게 3가지 데이터가 필요합니다. 이러한 정보를 Graphite의 모듈인 Carbon-Cache에 보냅니다. Carbon-Cache는 Collector가 보낸 데이터를 받아 Whisper에 저장합니다. Carbon-Cache가 데이터 수집기라면 Whisper는 실제로 데이터를 파일시스템에 저장하고 읽어오는 모듈입니다. 자 이제 Whisper를 통해 데이터가 파일 시스템에 저장되었습니다. 그렇다면 이 데이터를 어떻게 가져올 수 있을까요. 이 시점에서 등장하는 게 Graphite-Web입니다. Graphite-Web은 http 프로토콜을 통해서 Whisper에 저장된 데이터를 읽어와 이미지 파일이나, 데이터 형식으로 출력합니다. Graphite-Web은 기본적으로 데이터를 제공하는 API와 대시보드 기능 두 가지를 제공하고 있습니다. 여기서 제공하는 대시보드 기능을 그냥 사용해도 무방합니다만, 기본적으로 그렇게 편리하지는 않습니다. 직접적인 Graphite 프로젝트는 아닙니다만, 이 Graphite-Web에서 대시보드를 제외하고 API 기능만을 따로 구현해둔 Graphite-api라는 모듈도 있습니다. 다른 대시보드를 사용한다면 Graphite-Web이나 Graphite-api 어느 툴을 사용해도 무방합니다.




Grafana  (http://grafana.org/)





Grafana 는 소스로 Graphite / Elasticsearch / InfluxDB 등을 이용하여  타임시리즈를 그래프 / 대쉬보드로 가시화해주는 툴입니다. 

- 일라스틱서치는 키바나라는걸 주로 사용하더군요. (ELK : 일라스틱서치, 로그스태시, 키바나) 






레퍼런스:

http://brad2014.tistory.com/334

http://blog.nacyot.com/articles/2014-07-17-graphite-with-dokcer/

https://josephkim75.wordpress.com/2014/03/12/influxdb-distributed-time-series-database/

'NoSQL' 카테고리의 다른 글

Neo4j - 인덱스 사용하기  (0) 2015.10.30
Neo4j 인사이드 : 파일 스토리지  (0) 2015.10.30
MongoDB vs Couchbase (2)  (0) 2015.09.03
MongoDB vs Couchbase (1)  (0) 2015.09.03
카우치베이스(Couchbase) - 아키텍쳐 구조  (0) 2015.05.06
http://opentsdb.net/overview.html를 번역했다. OpenTSDB 는 사물인터넷 분야에서 많이 사용되며, 잘 알려진 에너지 IoT 기업인 OPower (http://blog.opower.com/category/technology/) 에서도 사용중이다.


OpenTSDB 는 타임 시리즈 데몬(
Time Series Daemon (TSD)) 들로 구성된다.(몇몇 커맨드라인 유틸리티셋 포함)
OpenTSDB  상호작용은 TSD 하나 혹은 그 이상이 작동하면서 이루어진다. 각각의  TSD 는 독립적이며 
상태공유없이 돌아가기때문에 여러가지 일들을 하기위해  여러 TSD 들에게 일거리를 던져주는데 아무 문제없다.

각각의 TSD 는 HBase 오픈소스 데이타베이스를 사용하며 타임시리즈데이터를 가져와서 저정한다. HBase 스키마는 저장공간을 줄이기위해 비슷한 타임시리즈를 빠르게 집약하는것에 대해 최적화 되어있다. TSD 유져들은 HBase 에 직접적으로 접근할 필요가 없다. 간단한 텔넷 스타일 프로토콜/HTTP API/ 간단한 빌트인 GUI 등을 경유해서 TSD 와 커뮤니케이션할수있다. 모든 커뮤니케이션들은 동일한 포트상에서 발생한다. (TSD 는 처음 몇바이트를 읽어서 클라이언트의 프로토콜을 이해한다.)




쓰기


OpenTSDB 를 사용하는 첫번째 단계는 TSDs 에 타임시리즈 데이터를 보내는것이다.   여러가지 툴(tools )들이  다양한 소스로부터 데이터를 꺼내서 OpenTSDB 에 넣기위해  존재한다. 만약 당신이 필요한 툴을 찾지 못한다면 직접 스크립트를 짤 필요가 있다.  (e.g. by reading interesting metrics from /proc on Linux, collecting counters from your network gear via SNMP, or other interesting data from your applications, via JMX for instance for Java applications) 그리고 TSDs 중 하나에 데이터 포인트들을 주기적으로 푸시하면 된다.

StumbleUpon 는  tcollector  라 불리는 파이썬 프레임워크를 썼는데(wrote) , Linux 2.6, Apache's HTTPd, MySQL, HBase, memcached, Varnish 등으로 부터 수천가지의 계측데이터를 모으기위해 사용되었다. 
이런 적은 영향(
low-impact)을 주는 프레임워크는 몇가지 쓸만한 컬렉터들을 포함하고, 그 커뮤니티는 꾸준히 그 이상의 기능을  제공한다. OpenTSDB 와 상호작용하는 프레임워크들은  Collectd /  Statsd  / the Coda Hale metrics emitter 를 지원하며 포함한다. OpenTSDB 에서 , 타임시리즈 데이타 포인트는 다음과 같이 구성된다:


  • 계측(Metric) 이름.
  • UNIX 타임스탬프 (seconds or millisecinds since Epoch).
  • 값 (64 bit integer or single-precision floating point value).
  • 태그들의 셋  (key-value 쌍 )  포인트에 해당하는 타임시리즈를  나타낸다.

태그들은 다른 소스들 또한 연계된 엔터티들로 부터 유사한 데이터 포인터들을 구분하기위해 사용된다.  그래서 당신은 쉽게 그들을 개별적으로 또는 그룹으로 나타낼수 있다. 태그는 머신의 이름을 가진 주석된 데이터 포인트들로 구성된다. (머신이 포함된 pool 또는 클러스터의 이름도~) 이것은 당신이  서버의 논리적 풀의 집약상태를 보여주는 데쉬보드 뿐만아니라 추가적으로 서버당 당신의 서비스의 상태를  나타내는 데쉬보드를 쉽게 만들수있게한다.

mysql.bytes_received           1287333217 327810227706             schema=foo host=db1
mysql.bytes_sent                  1287333217 6604859181710           schema=foo host=db1
mysql.bytes_received           1287333232 327812421706             schema=foo host=db1
mysql.bytes_sent                  1287333232 6604901075387           schema=foo host=db1
mysql.bytes_received           1287333321 340899533915             schema=foo host=db2
mysql.bytes_sent                  1287333321 5506469130707           schema=foo host=db2

이 예는 4개의 다른 타임 시리즈에 속한 6개의 데이터포인트를 보여준다. 각각의  계측과 태그의 컴비네이션들은 다른 타임 시리즈를 만들어낸다.  
4개의 타임시리즈 모두는 2개의 계측(
metrics) 은mysql.bytes_received or mysql.bytes_sent중 하나이다.

 데이터 포인트는 최소한 하나의 태그를 가져야하고  계측에 대한 매 타임 시리즈들은 동일한 숫자의 태그(역주: 위의 예는 2개) 를 가져야한다.  데이터 포인트당 6~7개 이상의 태그를 갖는건 추천하지 않는다. 새로운 데이터 포인트와 연계된 비용이 포인트 넘어 태그의 숫자에 지배되기 때문이다.

위의 예의 태그를 가지고서  쉽게 호스트 또는 스키마당 MySQL 의 네트워크 액티비티를 보여주는 그래프나 데쉬보드를 생성할수있을것이다. OpenTSDB 2.0 은 계측의 질과 메타데이터를 추적하는  데이터 포인트들과 함께 non-numeric 주석을 저장할수있게됬다. 


읽기

타임시리즈 데이터는 라인 그래프로 보통 그려질수있다. 그래서 OpenTSDB  는 그래프를 생성기위해  하나 혹은 그 이상의 계측과 태그를 선택하는 빌트인 심플 유저인터페이스를 제공한다.

 HTTP API 는  monitoring frameworks /  dashboards / statistics packages or automation tools 같은 외부  시스템들과  묶여서  OpenTSDB 에서 활용된다. 관련된 툴들을 보기위해  resources 페이지로 가자.  


+ Recent posts