influxdb 2.x 적용 검토

ansunny1170·2022년 11월 23일
1

InfluxDB 2.x

목록 보기
1/1

회사에서 influx db를 1.x버전을 사용하다가 2.x버전으로 업그레이드 검토 하라는 지시가 있었습니다.
1.x -> 2.x로의 변경은 아예 다른 tool을 사용 하는 것과 같을 정도로 변화가 큰 것은 toy project를 통해 확인했습니다.

원래 계획은 간단하게 검토를 한 후에 진행하려 했지만, 업그레이드는 진행 예정이 었기 때문에 바로, 진행하게 되었습니다. 앞으로 이 포스팅에서는 influxdb 2.x버전을 적용하는 과정을 기록해보려 합니다.


# Write line protocol to InfluxDB


공식 사이트 - Write line protocol to InfluxDB

3가지 방법으로 data를 influxdb에 write할 수 있습니다.

  • influxDB UI
  • influx CLI (influx 라는 명령어를 사용)
  • influxDB API

influx 2.x 버전으로 업그레이드 하는 이유 중 하나는 Restful API를 사용할 수 있기 떄문입니다.

# InfluxDB 기능


적용 검토와는 직접적으로 관계없을 수 있습니다.
1.x버전을 기준의 기능을 알아봅니다.

## continuous queries(CQ)

기존 measurement에 저장되는 데이터를 추가적으로 가공(계산) 하여 새로운 measurenent에 저장하는 기능

공식 설명은 CQ는 실시간 데이터에서 자동적이고 주기적으로 실행하는 influxQL queries이다. 그리고 query 결과를 지정된 measurement에 저장한다.
https://docs.influxdata.com/influxdb/v1.8/query_language/continuous_queries/#introduction

다음 하위 섹션에서 예제로 배워봅니다.
더 자세한 정보는 위 링크를 참고합니다.

### example

아래와 같은 measurement가 있습니다.
버스 데이터이며, 15분 간격으로 승객 수와 컴플레인 수를 저장합니다.

name: bus_data
--------------
time                   passengers   complaints
2016-08-28T07:00:00Z   5            9
2016-08-28T07:15:00Z   8            9
2016-08-28T07:30:00Z   8            9
2016-08-28T07:45:00Z   7            9
2016-08-28T08:00:00Z   8            9
2016-08-28T08:15:00Z   15           7
2016-08-28T08:30:00Z   15           7
2016-08-28T08:45:00Z   17           7
2016-08-28T09:00:00Z   20           7

이 데이터를 자동으로 다운셈플링 할 겁니다.
아래 sql 명령어를 해석하면:

  • cq_basicbus_data measurement에서 승객의 수의 평균값을 매 시간마다 계산하고, 그 결과를 transportation database의 average_passengers measurement에 저장한다.
  • cq_basicGROUP BY time() 간격과 동일한 간격인 1시간 간격으로 실행된다.
    _ 매시간 cq_basicnow()now() 사이의 시간 범위에서 GROUP BY time() 간격을 뺀 시간 범위, 즉 now()now() 이전 1시간 사이의 시간 범위를 다루는 단일 쿼리를 실행한다.
CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"
BEGIN
  SELECT mean("passengers") INTO "average_passengers" FROM "bus_data" GROUP BY time(1h)
END

2016-08-28 아침에 달린 로그 출력 결과:

>
At **8:00** `cq_basic` executes a query with the time range `time >= '7:00' AND time < '08:00'`.
`cq_basic` writes one point to the `average_passengers` measurement:
>
    name: average_passengers
    ------------------------
    time                   mean
    2016-08-28T07:00:00Z   7
>
At **9:00** `cq_basic` executes a query with the time range `time >= '8:00' AND time < '9:00'`.
`cq_basic` writes one point to the `average_passengers` measurement:
>
    name: average_passengers
    ------------------------
    time                   mean
    2016-08-28T08:00:00Z   13.75

CQ 결과 출력:

> SELECT * FROM "average_passengers"
name: average_passengers
------------------------
time                   mean
2016-08-28T07:00:00Z   7
2016-08-28T08:00:00Z   13.75

## size of measurement

influxQL을 사용하여 measurement의 용량(크기)를 알 수 있을까요?
계속 서칭 중이지만 아직까지 SQL을 사용한 방법 중 measurement의 size를 확인 하는 방법은 못찾았습니다.

여러 의견을 보았는데 그 중 아래 방법을 사용하면 container cli 수준에서 확인은 가능 했습니다.

query문을 통해 알고 싶었지만, cli를 사용하는 방법만 알아냈습니다.
https://stackoverflow.com/questions/52428018/how-to-get-influxdb-measurement-size

In InfluxDB v1.x, you can use following command to find out the disk usage of database, measurement and even shards:

influx_inspect report-disk -detailed /var/lib/influxdb/data/

container로 influx를 사용 중이라면 volume mapping된 폴더로 저장한 데이터의 용량을 체크해볼 수는 있겠습니다.
https://www.reddit.com/r/influxdb/comments/i1hz7c/influxdb_measurement_size/

you could just look at the folder sizes of /var/lib/influxdb/data or wherever you store it.

also you can get internal data from influxdb

SELECT sum("diskBytes") FROM "_internal".."tsm1_filestore" WHERE time >= now() - 6h GROUP BY time(30s), "database"

i dont know about your use-case and data structure, but another important thing to keep in mind, also when downsampling the data you want to keep forever, is series cardinality, as it increases your RAM usage.

SHOW SERIES CARDINALITY ON YOUR_DB

여담을 더하자면..
measurement에 series는 얼마나 저장할 수 있을까요?
아마 우리가 사용하는 influx가 존재하는 os에 할당된 RAM 사용량 까지로 예상할 수 있을 것 같습니다.

회사에서 테스트 용도로 사용하는 measurement에 약 10G 이상의 데이터를 저장 후, select했을 때 성공하지 못하고 서버가 랙걸려 결국 초기화 했던 경험이 있습니다.
그리고 해당 measurement는 drop 시켰습니다.

profile
공정 설비 개발/연구원에서 웹 서비스 개발자로 경력 이전하였습니다. Node.js 백엔드 기반 풀스택 개발자를 목표로 하고 있습니다.

0개의 댓글