[InfluxDB] 설치 및 사용법

[InfluxDB] 설치 및 사용법

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 시계열 DB로 알려져있는 InfluxDB에 대해서 알아보겠습니다. 필자가 속한 프로젝트에서도 InfluxDB 를 활용하고있는데요. 주로 서버에 대한 측정치들을 DB에 쌓아서 grafana로 보여주고있습니다.

InfluxDB 는 시계열(Time Series) 데이터베이스 중 하나로, RDBMS와 많은 점에서 유사하지만 모든 Row가 Time이라고 불리는 고유한 시간값을 가진다는 점에서 차별점을 갖습니다. InfluxDB 의 목적은 사용자 ID, 게시글 등 관계형 데이터를 저장하는 것이 아니라 지속적으로 수집되는 값들을 시간의 차원에서 쉽게 다룰 수 있게 하는 것입니다.

Influx DB main

1. 설치

필자는 레드햇을 주로 사용하기 때문에 그에 맞춰서 정리하겠습니다.

  • 패키지 매니저 업데이트
cat <
  • yum을 통한 설치
sudo yum install influxdb
sudo service influxdb start

만약 systemd(CentOS 7+, RHEL 7+)을 사용한다면..
sudo yum install influxdb
sudo systemctl start influxdb

2. 사용법

influx 명령어로 influxDB에 접속했다면 곧바로 데이터베이스의 기능을 사용할 수 있습니다. MySQL과 같은 RDBMS처럼 create database 명령어로 데이터베이스를 만들 수 있습니다. 그리고 use 명령어로 데이터베이스를 선택합니다.

RDB influxDB
database database
table measurement
column key
PK or Indexed column tag key(only string)
unindexed column field key
SET of index entries series
  • tag key 와 field key

데이터베이스 단위는 똑같이 database에 대응합니다.
테이블 단위는 table 대신 measurement라고 하는데, 시계열 데이터베이스가 시간에 따라 측정되고 수집된 자료를 저장하는 데이터베이스이므로 그에 맞는 이름을 사용한 것 같습니다.

column은 key라고 하는데, 여기서 tag와 field 개념을 구분해야 합니다.
예를 들어, 온습도 데이터가 들어오는 temperature_and_humidity라는 measurement가 있다고 합시다.

tag는 말 그대로 태그입니다. tag key에는 building, room 같은 것들이 있을 수 있습니다.
field key는 key 중에서 tag key를 제외한 나머지 key인데, 주로 측정된 값 데이터가 들어갑니다. 즉 여기서는 temperature, humidity 같은 것들이 있을 수 있습니다.

그리고 모든 measurement에는 time 키가 빌트인으로 들어갑니다.
SQL로 비유하자면 tag 키는 WHERE 절에서 주로 사용되는 인덱스 키로 볼 수 있습니다.

  • 클라이언트 명령
명령어 설명
use [database 이름] 현재 데이터베이스 지정
show measurements measurement(테이블) 목록 보기
show tag keys 모든 measurement의 모든 tag key 목록 보기
show field keys 모든 measurement의 모든 field key 목록 보기
show series 모든 measurement의 서로소인 tag key 튜플의 목록 보기
  • DB 생성
 create database ui_monitoring_new
> use ui_monitoring_new
Using database ui_monitoring_new

SQL이라면 다음 순서로 테이블을 만들었겠지만, InfluxDB는 테이블이란 용어 대신 'measurements' 라는 개념을 사용한다. measurement는 별도로 생성할 필요는 없기 때문에 곧바로 데이터를 insert 하면 measurement를 사용할 수 있다.

  • 데이터 입력
 insert ui_monitoring_new,zon_type=ap,pagetype=hoem,site_cd=sg,page_url=/sg/ result=true,resultval=0.001
> insert ui_monitoring_new,zon_type=ap,pagetype=hoem,site_cd=sg,page_url=/sg/ result=false,resultval=1

필자 같은 경우 Node.js의 앱과 연결해서 monitoring을 하는 역할을 수행한뒤 결과값을 influxDB에 넣어주는 기능을 개발했다. 아래와 같이 호출을 하였습니다.

curl -is -XPOST "http://{IP}:{PORT}/write?db=ui_monitoring_db" --data-binary "ui_monitoring_new,zone_type=ap,pagetype=home,site_cd=sg,page_url=/sg/ result=true,resultval=0.001"

 //** Send Success to InfluxDB
                var influxApi = 'curl -is -XPOST "http://10.0.17.86:8086/write?db=ui_monitoring_db" --data-binary "ui_monitoring_new,zone_type=' + zoneType + ',page_type='+ pageType +',site_cd=' + siteCd  + ',page_url=' + url  + ' result=true,resultval=0.001"';

                exec(influxApi, function(status, output) {
                        console.log(status);
                });
  • 테이블(measurement) 조회
  show measurements;
name: measurements
name
----
ui_monitoring_new
  • 데이터 조회
 SELECT * FROM "ui_monitoring_new" LIMIT 1
필자의 경우 데이터가 많아서 LIMIT 1로 1 row만 확인하고있음.

위의 insert 쿼리에서 time이라는 값을 지정하지 않았는데도 자동으로 시간이 입력되어 있습니다. influxDB는 쿼리가 저장되는 시간을 ns(나노세컨드) 단위로 자동으로 저장하며, 당연히 UTC를 기준으로 합니다.

 SELECT "result" FROM "ui_monitoring_new" LIMIT 1
name: ui_monitoring_new
time                result
----                ------
1526630150707300172 true

데이터 값이 많은 경우, 위와 같이 특정 컬럼만 가져올 수 있습니다.

  • 데이터 추가
measurement에 없는 값(ami_ck,ami_id)을 가지는 데이터를 하나만 더 넣어보자.
insert ui_monitoring_new,ami_ck=1,ami_id=1,zon_type=ap,pagetype=hoem,site_cd=sg,page_url=/sg/ result=true,resultval=0.001

놀랍게도 measurement의 스키마가 하나 더 늘어났고, 없는 부분은 공백처리 되어있다. 이로부터 InfluxDB는 스키마가 없는 형태로 동작한다는 것을 알 수 있다. 어떻게 보면 MongoDB와도 매우 유사하다고 볼 수도 있는데, 완벽한 비정형 데이터는 아니라는 점에서 차이를 가진다.

3. REST API

필자가 위에서 설명했듯이, 필자의 프로젝트에서는 monitoring app(Node.js)가 모니터링 수행을 한 후, 결과값을 InfluxDB에 쌓고있다. InfluxDB에 쌓을 시에, REST API를 통해서 넣고, 다음과 같이 insert합니다.

curl -is -XPOST "http://{IP}:{PORT}/write?db=ui_monitoring_db"  --data-binary "ui_monitoring_new,zone_type=ap,pagetype=home,site_cd=sg,page_url=/sg/ result=true,resultval=0.001"

[결과값]
HTTP/1.1 204 No Content
Content-Type: application/json
Request-Id: 9d7b7fcc-b291-11e9-ae08-02435dcfe90f
X-Influxdb-Build: OSS
X-Influxdb-Version: 1.7.7
X-Request-Id: 9d7b7fcc-b291-11e9-ae08-02435dcfe90f
Date: Tue, 30 Jul 2019 06:16:49 GMT

4. 마치며

필자가 DevOps 업무를 하면서 처음 시도했던것이 influxDB에 measurement를 만들고, 데이터를 넣는 일을 했었습니다.
pupeeteer를 활용한 monitoring시스템을 구축하고, 그 결과값을 influxDB에 쌓은뒤, grafana로 대시보드를 보여주었는데, 손쉽게 모니터링 시스템을 구축할 수 있었습니다.

개인적인 생각으로는 적절한 모니터링 툴이 없는 스타트업의 경우 약간의 노력으로 왠만한 상용 솔루션 부럽지 않은 모니터링 툴을 만들 수도 있습니다.

뭔가 모니터링 하고자하는 니즈가 있는 부서의 담당 개발자에게 데이터 수집 방법 및 Grafana로 대시보드 그리는 법 포함해서 30분 정도만 교육하면 얼마 안되서 바로 만들어서 활용하는 식입니다.

이처럼 시스템모니터링 용도뿐 아니라 서비스 반응을 실시간으로 모니터링하여 개선점 도출, 수정, 테스트, 배포 프로세스가 스피드있게 진행되어야 하는 DevOps 환경에서는 더욱 유용할 것입니다.

다음시간에는 influxDB + grafana 연계를 통한 대시보드 구현에 대해서 소개하겠습니다.

워니즈 블로그
워니즈 깃헙

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다