Posting

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

InfluxDB 테스트 및 Machbase와의 비교

마크베이스 심광훈

지난번 포스트에서 Machbase와 InfluxDB와의 성능비교를 해보려 했었는데, 다른 일이 많아서 쉽사리 시작할 수가 없었습니다. 이 포스트에서는 InfluxDB와의 성능비교를 위해서 이것저것 시행착오를 겪은 것과 두 제품을 동등하게 비교할 수 있는 부분에 대해서만 성능 비교 결과를 보여 드리겠습니다.



입력 테스트 방법

테스트 환경 / 데이터 설정

4core 32G SSD 환경의 내부 개발 장비를 이용하여 테스트 했습니다. TAG 데이터(100만 TAG, 10억건 데이터)를 machbase에 일단 입력하고, 이 데이터를 csv 파일로 변환한 다음, InfluxDB에 입력하여 두 제품의 입력 성능/질의 성능/편의성 등을 비교해 봅니다.

  • Intel(R) Xeon(R) CPU E3-1231 v3 @ 3.40GHz (4core/8thread)
  • DDR3 32GB
  • Samsung 860Evo 1TB
  • centos-release-7-6.1810.2.el7.centos.x86_64
  • InfluxDB 1.7.7

테스트 데이터는 임의로 생성한 데이터로, 100만건의 센서가 초당 10번씩 데이터를 생성하여 총 데이터가 10억건이 되도록 진행하였습니다. machbase에 데이터 입력성능을 확인해 본 결과 초당 약 43만건의 데이터가 입력됨을 알  수 있었습니다.(debug버전 기준) 이 데이터를 machbase의 패키지에 포함된 csvexport를 이용하여 csv 파일로 기록하였습니다.

  • Machbase의 입력 속도 : 약 43만건 / 초

Influxdb에 데이터 입력

InfluxDB는 설치가 매우 쉽습니다.하지만, machbase에서 데이터를 입력한 다음 생성한 csv파일을 입력하는 것은 결코 쉽지 않았습니다. InfluxDB는 csv 파일을 입력하기 위한 csvimport 와 같은 도구를 제공하지 않습니다. Influxdb 홈페이지에서는 다음의 방법을 이용하여 csv 파일을 업로드 할 수 있다고 알려줍니다.

  • Chronograf를 통하여 입력
  • Telegraf를 이용하여 입력
  • Influx를 이용하여 입력

첫번째는 Influxdb의 web ui를 (machbase는 MWA) 이용하는 방법인데 데이터 파일의 size가 30M이상이면 입력이 안됩니다. 50기가 가까운 csv파일을 입력하는것은 불가능합니다. 두번째 방법은 machbase 의 machcollector와 같이 로그파일등의 데이터 소스에서 실시간으로 입력해 주는 도구입니다. 이 방법은 속도가 느려서 사용하지 않았습니다. 마지막 방법을 이용하여 데이터를 입력했습니다.

먼저, csv파일 자체를 Influx를 이용하여 입력하는 기능은 없습니다. Influx를 이용하여 데이터를 임포트하기 위해서는 Influx에서 이용하는 text format으로 변환해 주어야 합니다. Influx에서 제공한 샘플 python 스크립트를 참고하여, csv파일을 Influx 용 text파일로 변환하는 코드를 작성했습니다.

이 코드를 이용하여 csv 파일을 text파일로 변환합니다. 20시간 가까이 걸리는 군요. 그런데, 텍스트 파일 앞에 지시자로 데이터베이스 생성 및 입력 대상 지정 부분에 space한칸씩 들어가야 하는데, 이것이 빠졌습니다. 60기가짜리 text 파일을 에디트할 수 없어서, 확인 후 다시 생성하였습니다.

약 550만건입력 도중에 에러가 발생합니다. 살펴보니,  “max-values-per-tag”값이 10만인데, 이값을 고쳐야 하는군요. 환경 설정을 바꾸고 입력 하였습니다.

질의 테스트 및 방법

InfluxDB는 질의 성능 측정도 쉽지 않습니다. InfluxDB는 질의를 수행하는데 사용된 시간을 표현해 주지 않습니다. 그래서 대부분의 질의는 단지 느낌만으로 마크베이스와 비교했었습니다.

질의 테스트를 진행하는 데 있어서 매우 불편하고 사용하기 힘든 제약 조건들이 많았습니다. 별것은 아니지만 가장 짜증나고 힘들었던 부분은 질의문에서 스키마 객체를 쌍따옴표(“)로 둘러쳐야 했던 것입니다. SQL 표준에서도 쌍따옴표로 둘러친 이름이 허용되기는 하지만, 습관적으로 쓰던 방식대로 사용하지 못한다는 점이 처음에는 힘들었습니다.

SELECT "value" FROM "sensor_data".."tag_data" WHERE "tag_name" ='TAG_0001'

기타 여러가지 제약사항들이 있는데, 각각 설명해 보겠습니다.

Group by 제약

InfluxDB에 입력된 데이터는 인덱스 칼럼에 해당하는 tag_key와 비-인덱스 칼럼에 해당하는 value_key가 있습니다. group by 조건절에 오는 칼럼은 time칼럼과 tag_key 칼럼만 해당합니다. CREATE TABLE문이 없기 때문에, 입력시에 이 칼럼이 인덱스인지 아닌지를 결정해서 tag_key부분에 설정해 주어야 합니다. 만약 입력후에 해당 값을 value_key로 입력했다면, 데이터를 삭제 후 재입력하지 않는 이상 group by절에 사용할 수 없습니다.

TAG KEY SELECT 오류

이 문제는 정말로 당황스러웠는데요, TAG KEY로 설정된 칼럼들만 SELECT하면 결과가 아무것도 안나옵니다.

다음과 같은 상태로 데이터를 입력할 때,

tag_data,name=EQ0^TAG0 value=134.03,lot_no=1001 1483196400000000000

위 입력상황에서 인덱스는 “name”이라는 tag_key에 대해서 생성되는데, name 칼럼에 대한 질의는 아무 결과도 표시하지 않았습니다.

SELECT "name" FROM "tag_data"

에러메시지도 아무것도 나오지 않더군요.  나중에 찾아보니, tag key”만” 단독으로 검색하면 결과가 안나온다고 되어 있었습니다.

비슷하게 “time”칼럼값만 검색하려 해도 (이경우엔 오류를 출력해 주기는 합니다.) 결과가 안나옵니다. 다음 질의는 오류를 리턴합니다.

 select "time" from "tag_data" where "name"='EQ0^TAG0';
ERR: at least 1 non-time field must be queried

비정상 종료

다음 질의는 influx가 (서버 프로세스인 influxd가 아니라) 메모리를 무제한 사용하다가 종료합니다.

Select mean("value") from "tag_data" where "name"='EQ0^TAG0' group by time(1s)

유사한 질의를 machbase에 실행하면  0.01초 만에 결과가 나옵니다.

Mach> select name, avg(value), date_Trunc('second', t_time) as t from tag where name ='EQ0^TAG1' group by name, t;

query실행 시간이 출력되지 않는 문제를 해결하기 위해서 shell command로 질의를 수행하다가 발견한 문제인데요, 조건절에 입력되는 문자열에 따옴표가 없으면 influxd가 cpu/memory를 무한정 사용하다가 비정상 종료됩니다. 위 질의를 정상적으로 수행하기 위해서는 time값에 대한 조건절을 반드시 명시해야 합니다.

select mean("value") from "tag_data" where "name" = 'EQ0^TAG10'and "time" >= 1483196400000000000 and time <= 1483196462400000000 group by time(3s)

아래 질의는 서버프로세스인 influxd가 cpu/memory를 무제한 사용하다가 비정상 종료됩니다.

SELECT value FROM sensor_data..tag_data WHERE "name" = EQ0^TAG0

질의를 실행하고 몇초가 지난 시점의 시스템 상황은 아래와 같습니다.

Mem : 32729528 total, 11867052 free, 14498128 used,  6364348 buff/cache
KiB Swap: 16449532 total,  6253320 free, 10196212 used. 17659684 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND  
25412 root      20   0   35.7g  18.3g   5.2g R 464.8 58.6  10:48.17 influxd

다음 질의는 질의 수행시 가용메모리를 거의 전부 사용하고 10초 이상 걸립니다.

select "value", "name" from "tag_data" limit 10

다양한 이상 증세와 질의 수행시 정확한 수행시간이 표시되지 않는 문제 등에 의해서, 성능 비교를 1:1로 수행할 수 없었으나, 다음의 결과를 얻었습니다.

Machbase TAG table과 InfluxDB는 "정상적으로 동작하는"질의들에 대해서는 거의 동등한 질의 수행 성능을 냅니다. 문제는 동등하게 수행할 수 있는 질의의 수가 많지 않고, InfluxDB의 질의 수행 시간 표시기 되지 않아서 정확한 비교가 어려웠습니다.

성능 비교

Machbase의 센서 데이터 테스트 suite를 이용하여 10억건의 센서데이터를 Machbase및 Influxdb에 입력하고, 기본 검색 테스트를 수행하였습니다.

입력 성능

앞서 이야기한 것과 같이 Influxdb에서 입력하기 위해 csv파일 변환 시간은 제거하고 변환된 텍스트 파일을 이용하여 입력한 시간만을 측정합니다.

MachbaseInfluxDB 
1639910건/초237871건/초Tag 1000개, 센서 데이터 10억건 기준

Machbase와 InfluxDB의 입력 성능은 아래와 같은 chart로 표시될 수 있습니다. Machbase의 입력성능이 InfluxDB보다 약 7배 높습니다.

단순 검색 성능

전체 데이터에 대해서 특정 센서의 모든 데이터를 검색하는 질의입니다. 다음의 질의를 통하여 수행했습니다.

select count(*) from (select * from tag where name = 'EQ0^TAG14' and t_time
       between to_date('2017-01-01 00:00:00') and to_date('2017-01-01 01:00:00') ); -- machbase
SELECT * FROM tag_data WHERE "name" = 'EQ0^TAG1' AND time >= '2017-01-01T00:00:00Z' AND time < '2017-01-01T01:00:00Z' -- influx
Machbase(second)InfluxDB(second) 
0.2761.392Tag 1000개, 센서 데이터 10억건 기준

시간 조건을 추가하여 1시간 분량의 데이터를 검색한 경우 다음의 질의를 이용하였습니다. InfluxDB는 로그에 출력되는 수행시간에  결과 전송 시간을  포함시키지 않으므로, 질의가 약간 다릅니다.

select count(*) from (select * from tag where name = 'EQ0^TAG14' and t_time
       between to_date('2017-01-01 00:00:00') and to_date('2017-01-01 01:00:00') ); -- machbase
SELECT * FROM tag_data WHERE "name" = 'EQ0^TAG1' AND time >= '2017-01-01T00:00:00Z' AND time < '2017-01-01T01:00:00Z' -- influx

실행 결과는 다음과 같습니다.

Machbase(second)Influx(second)
0.0100.116

이와 같이 단순 질의의 경우, 마크베이스가 InfluxDB에 비하여 높은 성능을 갖는 것을 알 수 있습니다.

집합 연산 실행

Machbase의 rollup 기능을 이용하여 특정 tag의 단위 시간당 평균값을 얻는 질의를 수행하였습니다. 1시간 기준으로 1초 단위의 평균을 얻는 질의는 아래와 같습니다.

select count(*) from (select /*+ ROLLUP(TAG, sec) */ t_time, value from tag
where name ='EQ0^TAG1' and
t_time between to_date('2017-01-01 00:00:00') and to_date('2017-01-01 01:00:00'));  -- machbase rollup
  
SELECT mean(value) FROM tag_data WHERE "name" = 'EQ0^TAG1' AND
  time >= '2017-01-01T00:00:00Z' AND time < '2017-01-01T01:00:00Z' GROUP BY time(1s) -- influx

위 질의 수행 시간은 다음과 같습니다.

Machbase(second)Influx(second)
0.0050.026

1일간의 데이터에 대해서, 시간별로 평균값을 얻는 질의는 아래와 같이 수행됩니다. InfluxDB와 Machbase의 Timezone 설정이 달라, 시간값의 범위가 약간 다릅니다.

select count(*) from (select  /*+ ROLLUP(TAG, hour) */ t_time, value from tag where name ='EQ0^TAG1'
 and t_time between to_date('2017-01-01 00:00:00') and to_date('2017-01-02 00:00:00' )); -- machbase rollup
  
SELECT mean(value), time FROM tag_data WHERE "name" = 'EQ0^TAG1' AND
 time >= '2016-12-31T15:00:00Z' AND time < '2017-01-01T15:00:00Z' GROUP BY time(1h) -- influx

위 질의를 수행해 본 결과, 아래와 같은 결과를 얻었습니다.

Machbase(second)Influx(second)
0.0010.132

단순 검색 질의 및 통계 질의 수행시, Machbase가 Influxdb 대비 우수한 성능을 얻은 것을 알 수 있습니다.

다음 chart는 Machbase 대비 InfluxDB의 질의 수행 시간 비교입니다.

결론

InfluxDB는 SQL언어 지원방식이 달라서 기존 SQL 사용자는 InfluxDB가 지원하지 않는 기능이나 특수한 사항을 유의하여 사용해야 합니다. REST API 만을 지원하는 InfluxDB는 사용상 DBMS의 전통적 API와 차이점이 있습니다. 그리고 성능에 관해서는 Machbase에 비해 매우 낮습니다.

InfluxDB와 같은 오픈소스 시계열 DBMS를 도입하려는 고객분들께, RDBMS와 완벽히 호환되며, 성능도 더 뛰어나고 컨설팅, 개발, 운영에 있어서 도움을 받을 수 있는 Machbase를 강력히 추천합니다..

연관 포스트

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