티스토리 뷰
인플럭스(Influx)라는 단어 자체가 친숙하지 않은 사람이지만 인플럭스 DB가 시계열 데이터베이스(Time-series Database, TSDB)라는 것을 접하자마자 호기심이 발동한다. 스카다(SCADA)나 빅데이터를 기반으로 모델을 만들어 검증하는 시스템에서 시계열 데이터, 즉 시간의 흐름에 따른 값의 변화는 상당히 중요한 정보이다. 그런데 이것을 전통적인 관계형 데이터베이스에 저장하면 저장이나 검색의 효율성 측면에서 오버헤드가 심한 것이 사실이다. 피상적인 아키텍처 수준에서도 이러한 비효율은 어렵지 않게 확인할 수 있다. 효율을 높이기 위해 테이블 파티션(Partition)이 도입되기도 했지만 한계가 있는 것이 사실이다. DBMS 입장에서 보면 시계열 데이터들은 인플럭스(Influx)라는 단어의 의미처럼 밀려 들어오는 사람이나 물건처럼 보인다. 유사한 정보임에도 불구하고 일일이 저장하다 보니 용량도 효율성도 떨어지는데 이것을 최적화해서 저장하여 용량도 효율성도 높이겠다는 시도가 시계열 데이터베이스(Time-series Database, TSDB)인 것이다.
인플럭스 DB는 인플럭스데이터(https://www.influxdata.com/)라는 회사가 2013년에 개발한 것으로 회사는 클라우드 DB 등으로 비즈니스를 하고 있지만 DBMS 자체는 MIT 라이선스로 공개하고 있는 오픈소스 프로젝트이다. C언어와 유사한 Go 언어로 만든 DBMS이다.
curl -sL https://repos.influxdata.com/influxdb.key | sudo apt-key add -
source /etc/lsb-release
echo "deb https://repos.influxdata.com/${DISTRIB_ID,,} ${DISTRIB_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
sudo apt-get update
sudo apt-get install influxdb
sudo service influxdb start
sudo apt-get install influxdb-client
위의 스크립트는 우분투 계열의 리눅스에서 간단하게 인플럭스 DBMS를 설치하고 가동할 수 있는 과정이다. 인플럭스는 기본적으로 인증을 진행하지 않고 사용할 수 있는데, 사용자 인증을 하도록 설정을 진행하고 테스트한다.
DBMS 서버와 클라이언트가 정상적으로 설치되고 서비스가 가동되었다면 위의 그림처럼 influx 명령으로 관리자 아이디를 추가할 수 있다. "CREATE USER admin WITH PASSWORD 'admin123!' WITH ALL PRIVILEGES"로 관리자를 추가하고 "show users"로 사용자를 조회하면 관리자 권한의 사용자가 추가된 것을 확인할 수 있다. 그림에서 보듯이 인터페이스는 "http://localhost:8086"처럼 웹 인터페이스를 사용하고 있음을 확인할 수 있다. 인증을 적용하려면 /etc/influxdb/influxdb.conf에서 [http] 섹션에서 "auth-enabled = true"로 설정해야 하고 서비스를 재가동해야 한다.
위의 그림은 테스트를 위한 데이터베이스를 "create database historian"로 수행하고 데이터베이스 목록을 조회한 결과이다. _internal이라는 기본 데이터베이스가 있음을 확인할 수 있다.
> use _internal
Using database _internal
> show series
key
---
cq,hostname=osboxes
database,database=_internal,hostname=osboxes
httpd,bind=:8086,hostname=osboxes
queryExecutor,hostname=osboxes
runtime,hostname=osboxes
shard,database=_internal,engine=tsm1,hostname=osboxes,id=1,path=/var/lib/influxdb/data/_internal/monitor/1,retentionPolicy=monitor,walPath=/var/lib/influxdb/wal/_internal/monitor/1
subscriber,hostname=osboxes
tsm1_cache,database=_internal,engine=tsm1,hostname=osboxes,id=1,path=/var/lib/influxdb/data/_internal/monitor/1,retentionPolicy=monitor,walPath=/var/lib/influxdb/wal/_internal/monitor/1
tsm1_engine,database=_internal,engine=tsm1,hostname=osboxes,id=1,path=/var/lib/influxdb/data/_internal/monitor/1,retentionPolicy=monitor,walPath=/var/lib/influxdb/wal/_internal/monitor/1
tsm1_filestore,database=_internal,engine=tsm1,hostname=osboxes,id=1,path=/var/lib/influxdb/data/_internal/monitor/1,retentionPolicy=monitor,walPath=/var/lib/influxdb/wal/_internal/monitor/1
tsm1_wal,database=_internal,engine=tsm1,hostname=osboxes,id=1,path=/var/lib/influxdb/data/_internal/monitor/1,retentionPolicy=monitor,walPath=/var/lib/influxdb/wal/_internal/monitor/1
write,hostname=osboxes
> show measurements
name: measurements
name
----
cq
database
httpd
queryExecutor
runtime
shard
subscriber
tsm1_cache
tsm1_engine
tsm1_filestore
tsm1_wal
write
> show tag keys
name: cq
tagKey
------
hostname
name: database
tagKey
------
database
hostname
......
> show field keys
name: cq
fieldKey fieldType
-------- ---------
queryFail integer
queryOk integer
name: database
fieldKey fieldType
-------- ---------
numMeasurements integer
numSeries integer
......
위의 내용은 _internal 데이터베이스로 들어가서 어떤 테이블이 있는지 (show measurements)를 살펴보고 테이블의 칼럼에 해당하는 것이 무엇이 있는지 "show tag keys"(인덱스 칼럼에 해당), "show field keys"(인덱스 아닌 칼럼에 해당)로 조회한 결과이다. 전통적인 SQL과 유사하게 사용할 수 있는 측면이 있지만, 테이블(measurement)을 미리 생성하지 않아도 되고 칼럼에 해당하는 tag key나 field key를 큰따옴표(")로 묶어 주어야 하는 등의 차이점이 있다.
위의 그림은 데이트를 진행하면서 실제로 시계열 데이터를 입력한 결과이다. 관계형 데이터베이스라면 테이블의 한 칼럼에 저장되었을 항목값 각각이 별도의 테이블(Measurement)로 자리하고 있고 각 테이블에는 사용자가 별도로 생성하지 않은 "time"이라는 기본 값이 있음을 확인할 수 있다. 앞서 인플럭스가 인증을 하도록 적용했으므로 인증 적용 이후로 위의 그림처럼 조회하려면 "influx -username admin -password admin123!"처럼 사용자 아이디와 비밀번호를 입력하여 로그인해야 한다.
버전 1.8부터는 위와 같은 CLI에서 "influx -type=flux"와 같은 방식으로 SQL 방식이 아니라 flux언어로 편리하게 질의할 수 있지만 필자의 시스템은 버전이 낮으므로 flux 질의는 할 수 없었다.
'IT 일반' 카테고리의 다른 글
ipTIME 공유기로 포트미러링 설정 및 데이터 캡처하기 (0) | 2024.03.14 |
---|---|
MQTT 프로토콜에 대한 이해 (0) | 2023.08.24 |
크레이트 DBMS(CrateDB)와 DBaaS 그리고 SaaS (0) | 2023.08.22 |
DNP3 프로토콜에 대한 고찰 (0) | 2023.08.18 |
BACnet에 대한 고찰 (0) | 2023.08.15 |