Posting

Machbase의 최신 소식을 지금 만나보세요

시계열 DBMS 아키텍처 비교 Machbase vs InfluxDB (사용성 및 데이터 모델 기준)

개요

마크베이스 CTO 심광훈

지난번 제품 비교 포스트에서는 센서 데이터를 처리하기 위해서 많이 사용하던 MongoDB와의 비교를 했습니다만, 시계열 데이터를 위한 DBMS간의 비교에 흥미있으실 분들을 위해 InfluxDB와의 아키택처 비교를 해 보겠습니다. 제품 성능 비교는 과거(3-4년전)버전으로 비교한 것이 있지만(물론 Machbase가 월등합니다.) 최신 제품 비교자료는 아직 마련된 것이 없고, 그 이후로 두 제품 모두 많은 변화가 있어 현 시점에서 이야기하기에는 바람직해 보이지 않으므로 참고 자료로만 보시는것이 좋겠습니다.

Machbase 소개

마크베이스는 시계열 센서 데이터의 빠른 입력, 검색, 통계등을 목표로 개발된 DBMS입니다. 라즈베리 파이와 같은 에지 장비를 비롯하여, 일반 단일 서버, 다중 서버 클러스터등을 지원합니다. 시계열 센서 데이터 및 머신 로그 데이터 처리에 특화된 기능 및 아키텍처를 갖고 있습니다.

InfluxDB 소개

InfluxData에서 개발중인 오픈소스 시계열 DBMS입니다. 시계열 데이터 처리에 있어서 가장 유명한 제품 중 하나입니다. InfluxDB 또한 클러스터를 지원합니다.

아키텍쳐 비교

두 제품 모두 시계열 데이터 처리에 특화된 제품으로 주요 특징을 요약하면 아래와 같습니다. 이 포스트에서는 사용성(Usability)위주의 특징 분석을 먼저 수행하고, 성능 테스트 등이 필요한 인덱스, 내부 구조와 관련한 내용은 성능테스트를 진행하고 차후에 기술하겠습니다.

구현 언어/Client interface

Machbase는 서버 코드는 C로, ODBC/CLI 및 서버 내장 도구들은 C++로 작성되어 있으며, JDBC, C#, Scala는 각기 그 언어로 라이브러리가 작성되어 있습니다. 서버와 클라이언트간의 통신 프로토콜은 일반적인 RDBMS가 지원하는 인터페이스(Prepare/Bind/Execute)를 위한 전용 프로토콜로 작성되어 최적의 효율성을 내도록 주의 깊게 구현되어 있습니다. C# connector는 github에 공개되어 누구나 내부 구현을 참조할 수 있습니다.

InfluxDB는 GO언어로 작성되어 있으며, 통신프로토콜은 REST기반으로 구성되어 있습니다. 다양한 언어로 된 client 라이브러리를 제공하지만 Prepare/Bind/Execute를 비롯한 인터페이스는 제공되지 않습니다. 대표적인 C++ 클라이언트 라이브러리(InfluxDB 홈페이지에서 연결된) 소스 코드를 보면 모든 연산이 REST로 변환되어 전달되는 것을 알 수 있습니다. 오픈소스 http 라이브러리인 curl을 이용하여 구현되어 있네요.

void HTTP::send(std::string&& post)
{
  CURLcode response;   
  long responseCode;
  curl_easy_setopt(curlHandle.get(), CURLOPT_POSTFIELDS, post.c_str());
  curl_easy_setopt(curlHandle.get(), CURLOPT_POSTFIELDSIZE, (long) post.length());
  response = curl_easy_perform(curlHandle.get());
  curl_easy_getinfo(curlHandle.get(), CURLINFO_RESPONSE_CODE, &responseCode);
  if (response != CURLE_OK) {
    throw std::runtime_error(curl_easy_strerror(response));
  }
 
  if (responseCode < 200 || responseCode > 206) {
    throw std::runtime_error("Response code : " + std::to_string(responseCode));
  }
}

장/단점 비교

REST기반의 인터페이스는 Web 환경에서는 더 편리하게 사용할 수 있습니다. 웹서버에서 질의를 전송하거나, 대량의 센서들이 시계열 DB에 데이터를 입력하기 위해서 REST를 사용하면 매우 편리하게 사용할 수 있습니다. 물론 Machbase도 REST를 지원하므로, Influx의 고유한 장점으로 볼 수는 없습니다.

하지만, 소수의 센서 데이터가 대량의 데이터를 매우 빠르게 생성하는 경우 – 예를 들어, 진동센서와 같이 매우 짧은 주기로 데이터를 생성하는 경우, Machbase고유의 API인 SQLAppend나, 일반적인 ODBC Interface인 Prepare-execute, Array-Binding, Batch execute등의 기법을 이용하면 매우 효율적이지만, 모든 프로토콜이 REST인 InfluxDB는 이를 수행할 수 없습니다. 따라서 지속적으로 대량의 데이터가 짧은 주기로 발생하는 환경에서는 InfluxDB는 비효율적입니다.

이와 관련한 성능테스트는 차후에 진행해 볼 예정입니다.

데이터 모델

Machbase는 관계형 모델을 지원합니다. 센서 데이터 처리용 테이블인 TAG는 생성시 필수적인 칼럼(센서 ID, 입력 시간, 입력 값)을 제외하고 추가로 필요한 칼럼들을 정의할 수 있고, 이는 반드시 DDL을 이용하여 정의되어야 합니다.

반면 InfluxDB는 tagset이라는 반정형 데이터 포멧을 지원합니다. 하나의 레코드는 key, tag, value list로 구분됩니다. 인덱스는 tag에 대해서만 생성 가능합니다. 모든 데이터는 명시적으로 지정하지 않더라도 입력 시간 칼럼값을 갖고, select 시에 time 칼럼을 선택하지 않더라도 데이터에 반드시 포함되어 있어서 질의 결과에 포함됩니다. influxDB에서 테이블에 해당하는 것은 series로, 이를 생성하는 명시적인 DDL이 없으므로 아래의 질의문을 보고 이야기를 하겠습니다. 이 질의에서 입력될 데이터를 위한 테이블 생성문은 필요치 않습니다.(테이블 생성 질의가 없습니다.)

INSERT treasures,captain_id=pirate_king value=2

참 생소하죠? 이를 machbase query로 바꾸면(테이블과 인덱스 생성을 위한 DDL을 포함하여), 

CREATE TABLE treasures (captain_id varchar(10), value integer);
CREATE INDEX treasures_captain_id on treaures(captian_id);
INSERT INTO treasures VALUES ('pirate_king', 2);

예, 칼럼명이 insert문에 다 들어가 있습니다. InfluxDB는 스키마가 없으므로, 칼럼명을 입력시에 일일이 지정해야 합니다. 그리고 

captain_id=pirate_king value=2

앞쪽의 captain_id와 뒷쪽의 value 사이의 space가 있는데, 스페이스 앞쪽에 있는 column=value 절 (즉 captain_id=pirate_king) 이 tag절이며, 이 값에 대해서만 인덱싱이 됩니다. 이 인덱스는 중첩해서 적용될 수도 있습니다.

captain_id=pirate_king,other_tag=tag1 value=2,value2=1

이 값은 captain_id와 other_tag에 대해서 인덱싱이 되고, space문자로 나눠어진 value, value2는 인덱싱이 안되는 값으로 입력됩니다. 질의시에 인덱스가 안된 값에 대해서 검색을 하면 검색이 느린데, 이것은 fullscan질의가 되므로 당연하게 보입니다. 그런데 인덱스가 안되는 칼럼에 대해서 GROUP BY절을 쓸 수가 없습니다. GROUP BY절은 반드시 tag 칼럼에 대해서만 적용됩니다.

이와 같이 column=value, tag=value형태로 설정되는 key-value 데이터 모델을 InfluxDB는 tagset이라고 하며, Machbase와 같은 relational model과 차이점으로 볼 수가 있습니다.

질의 언어

Machbase는 SQL질의에 시계열 데이터 특성을 위해 추가 문법을 제공합니다. 그래서 SQL에 익숙한 사용자들은 별 무리없이 사용이 가능하죠. InfluxDB는 이를 좀 더 많이 변화시켜서 Machbase에 비해 No-SQL과 비슷하게 변형하였습니다.

간단한 질의와 결과를 살펴보겠습니다.

> SELECT COUNT("water_level") FROM h2o_feet
name: h2o_feet
--------------
time                           count
1970-01-01T00:00:00Z     15258

예, SELECT로 질의하는 칼럼명에 time이 없음에도 불구하고 강제적으로 해당 칼럼이 삽입되어 의미없는 값이 출력되기도 하고, 칼럼명에 해당하는 값을 쌍따옴표로 둘러치기는 하지만 이해하기에는 별 무리가 없어 보입니다.

과거에는 Flux라는 질의언어를 갖고 있었는데 앞서 설명한 SQL like한 질의언어로 변경하고 있다고 합니다.

from(db:"metrics")
|> range(start:-1h)
|> filter(fn: (r) => r._measurement == "foo")

이것은 Machbase SQL로 변환하면,

SELECT *
FROM metrics
WHERE measurement = 'foo' DURATION 1 hour;

결론

이 포스트에서 다룰 인터페이스 내용에 대한 부분은 이정도로 마칠까 합니다. 두 제품 모두 시계열 데이터를 빠르게 처리할 목적으로 개발되었지만, 관계형 데이터베이스와 DBMS표준 인터페이스를 최대한 지원하는 Machbase와 달리 InfluxDB는 좀 더 No-SQL에 가까운 특징을 갖고 있습니다. 요약하면,

  • Machbase는 C로 구현되었으며 전통적인 DB인터페이스(ODBC/JDBC등)을 지원하지만, InfluxDB는 GO로 구현되었고 REST기반의 인터페이스와 이를 crappting하는 구조로 Prepare/Bind/Execute로 동작하지 않는다.
  • Machbase는 관계형 데이터베이스로 DDL을 이용하여 정의된 스키마대로 동작하고, 이는 기존 DBMS와 동일한 외형을 갖지만, InfluxDB는 그렇지 않고,  tagset이라는 독자적인 데이터 모델을 이용하며, DDL이 존재하지 않고 칼럼 데이터 파싱을 실시간으로 수행한다.
  • Machbase는 질의 언어로 SQL기반에 추가 확장 구문을 지원하고, InfluxDB도 유사하지만 보다 No-SQL에 가까운 형태로 동작한다.

실제로 아키텍처 비교에 의한 성능 측정까지 다루어야 했지만 시간관계로 다루지 못하여 안타깝습니다. 다음에 이 내용은 반드시 다루도록 하겠습니다.

추가로 의문사항이나 비교해야할 내용이 있으면 연락주십시오.

감사합니다.

연관 포스트

Deep Anomaly Detection in Time Series (2) : 이상 감지 모델

개요 안녕하세요, 마크베이스의 Cloud개발본부 연구원 양창은입니다. 지난 게시글 Deep Anomaly Detection in Time Series (1) : Time Series Data에서는 시계열 데이터와 이상치(Anomaly)의 종류에 대해 알아보았습니다. 그리고

IIoT를 위한 Data Lake – machlake

Data Lake 란, 대규모의 다양한 원시 데이터 세트를 기본 형식으로 저장하는 데이터 리포지터리 유형입니다. 원시 데이터는 특정 목적을 위해 처리되지 않은 데이터를 뜻합니다. 산업 IoT