본문 바로가기
개발관련 자료

인플럭스DB(InfluxDB) #10 - 사용법

by jinu957 2020. 6. 12.
728x90

이번 포스팅은 요즘 핫한 InfluxDB에 대하여 작성하도록 하겠습니다.

InfluxDB 역시 작년 기상청 프로젝트에서 전국에서 관측되는 데이터를 효과적으로 처리하기 위하여 검토되었고 그때 자료조사를 한 내용입니다.

 

순서는 

 

2020/06/11 - [개발관련 자료] - InfluxDB #1 - 개요 및 특징

2020/06/11 - [개발관련 자료] - InfluxDB #2 - 주요 개념

2020/06/11 - [개발관련 자료] - InfluxDB #3 - 용어 정리

2020/06/11 - [개발관련 자료] - InfluxDB #4 - SQL DB와 비교

2020/06/11 - [개발관련 자료] - InfluxDB #5 - Schema설계 및 데이터Layout

2020/06/11 - [분류 전체보기] - InfluxDB #6 - In-Memory Indexing과 TSM(Time-Structured Merge Tree)

2020/06/11 - [개발관련 자료] - InfluxDB #7 - TSI(Time Series Index) 개요

2020/06/11 - [개발관련 자료] - InfluxDB #8 - TSI(Time Series Index) 세부 정보

2020/06/11 - [개발관련 자료] - InfluxDB #9 - Linux CentOS 설치

2020/06/12 - [개발관련 자료] - InfluxDB #10 - 사용법

 

으로 진행되며 도입 검토 차원에서 이루어진 조사라서 실무적용 보다는 InfluxDB란 어떤 것인지 파악하는 정도로만 생각하시면 될듯합니다.

 


 

1. INSERT 데이터 쓰기

 

  • Enter insert누른 다음 라인 프로토콜의 데이터를 입력하여 InfluxDB 데이터를 씁니다.
  • insert into <retention policy> <line protocol> 특정 보존 정책에 데이터를 쓰는  사용합니다.
  • treasures 태그를 사용하여 측정의 단일 필드에 데이터를 씁니다.
  • captain_id = pirate_king. influx 자동으로 포인트를 데이터베이스의 DEFAULT보유 방침에 기록합니다.

  > INSERT treasures,captain_id=pirate_king value=2

  >

 

 

  

2. SELECT measurement

 

FROM

  • Syntax

  SELECT <field_key>[,<field_key>,<tag_key>]

  FROM <measurement_name>[,<measurement_name>]

 

  • 단일 측정에서 모든 필드  태그 선택

  > SELECT * FROM "h2o_feet"

 

  • 단일 측정에서 특정 태그  필드 선택

  > SELECT "level description","location","water_level" FROM "h2o_feet"

 

  • 단일 측정에서 특정 태그  필드를 선택하고 식별자 유형 제공

  > SELECT "level description"::field,"location"::tag,"water_level"::field FROM "h2o_feet“

 

  name: h2o_feet

  --------------

  time                      level description            location          water_level

  2015-08-18T00:00:00Z   below 3 feet                santa_monica     2.064

  2015-08-18T00:00:00Z   between 6 and 9 feet       coyote_creek     8.12

  [...]

  2015-09-18T21:36:00Z   between 3 and 6 feet       santa_monica     5.066

  2015-09-18T21:42:00Z   between 3 and 6 feet       santa_monica     4.938

 

  • 단일 측정에서 모든 필드 선택

  > SELECT *::field FROM "h2o_feet“

 

  name: h2o_feet

  --------------

  time                      level description         water_level

  2015-08-18T00:00:00Z   below 3 feet             2.064

  2015-08-18T00:00:00Z   between 6 and 9 feet    8.12

  [...]

  2015-09-18T21:36:00Z   between 3 and 6 feet    5.066

  2015-09-18T21:42:00Z   between 3 and 6 feet    4.938

 

  • 측정에서 특정 필드를 선택하고 기본 산술을 수행

  > SELECT ("water_level" * 2) + 4 from "h2o_feet"

 

  •  이상의 측정에서 모든 데이터 선택

  > SELECT * FROM "h2o_feet","h2o_pH"

 

  • 정규화  측정에서 모든 데이터 선택

  > SELECT * FROM "NOAA_water_database"."autogen"."h2o_feet"

 

  • 특정 데이터베이스의 측정에서 모든 데이터 선택(“..” Default retention policy 입니다.)

  > SELECT * FROM "NOAA_water_database".."h2o_feet"

 

  • SELECT 절에서 태그  선택

  > SELECT "water_level","location" FROM "h2o_feet"

 

WHERE

  • Syntax

  SELECT_clause FROM_clause WHERE <conditional_expression>

  [(AND|OR) <conditional_expression> [...]]

 

  • 특정 필드 key-values 있는 데이터 선택

  > SELECT * FROM "h2o_feet" WHERE "water_level" > 8

 

  • 특정 문자열 필드 key-values 갖는 데이터 선택

  > SELECT * FROM "h2o_feet" WHERE "level description" = 'below 3 feet'

 

  • 특정 필드 key-values 갖는 데이터 선택  기본 산술 수행

  > SELECT * FROM "h2o_feet" WHERE "level description" = 'below 3 feet'

 

  • 특정 태그 key-values 갖는 데이터 선택

  > SELECT "water_level" FROM "h2o_feet" WHERE "location" = 'santa_monica'

 

  • 특정 필드 key-values  key-values 갖는 데이터 선택

  > SELECT "water_level" FROM "h2o_feet" WHERE "location" <> 'santa_monica'

  AND (water_level < -0.59 OR water_level > 9.95)

 

  • 특정 타임 스탬프가있는 데이터 선택

  > SELECT * FROM "h2o_feet" WHERE time > now() - 7d

 

GROUP BY

  • Syntax

  SELECT_clause FROM_clause [WHERE_clause] GROUP BY [* | <tag_key>[,<tag_key]]

 

  • 단일 태그로 쿼리 결과 그룹화

  > SELECT MEAN("water_level") FROM "h2o_feet" GROUP BY "location"

 

  •   이상의 태그로 그룹 쿼리 결과

  > SELECT MEAN("index") FROM "h2o_quality" GROUP BY location,randtag

 

  • 모든 태그별로 쿼리 결과 그룹화

  > SELECT MEAN("index") FROM "h2o_quality" GROUP BY *

 

GROUP BY time intervals

  • Syntax

  SELECT <function>(<field_key>) FROM_clause WHERE <time_range>

  GROUP BY time(<time_interval>),[tag_key] [fill(<fill_option>)]

 

  • 12 간격으로 그룹 쿼리 결과

  > SELECT COUNT("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek'

  AND time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:30:00Z'

  GROUP BY time(12m)

 

  • 12 간격으로 그룹 쿼리 결과  태그  사용

  > SELECT COUNT("water_level") FROM "h2o_feet" WHERE time >= '2015-08-18T00:00:00Z'

  AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m),"location"

 

GROUP BY time intervals and fill()

  • fill() 데이터가 없는 time intervals 대해 보고된 값을 변경합니다.
  • Syntax

  SELECT <function>(<field_key>) FROM_clause WHERE <time_range>

  GROUP BY time(time_interval,[<offset_interval])[,tag_key] [fill(<fill_option>)]

 

  • null: 데이터가 없는 time intervals 대해 (null) 보고 하지만 timestamp 리턴합니다.

   SELECT MAX("water_level") FROM "h2o_feet" WHERE "location"='coyote_creek'

  AND time >= '2015-09-18T16:00:00Z' AND time <= '2015-09-18T16:42:00Z'

  GROUP BY time(12m) fill(null)

 

INTO

  • Syntax

  SELECT_clause INTO <measurement_name>

  FROM_clause [WHERE_clause] [GROUP_BY_clause]

 

  • 데이터베이스 이름 바꾸기

  > SELECT * INTO "copy_NOAA_water_database"."autogen".:

  MEASUREMENT FROM "NOAA_water_database"."autogen"./.*/ GROUP BY *

 

  • 측정 결과를 쿼리에 작성

  > SELECT "water_level" INTO "h2o_feet_copy_1" FROM "h2o_feet"

  WHERE "location" = 'coyote_creek'

 

  • 정규화  측정 값에 쿼리 결과 작성

  > SELECT "water_level" INTO "where_else"."autogen"."h2o_feet_copy_2" FROM "h2o_feet"

  WHERE "location" = 'coyote_creek'

 

  • 집계  결과를 측정 값에 기록(downsampling)

  > SELECT MEAN("water_level") INTO "all_my_averages" FROM "h2o_feet"

  WHERE "location" = 'coyote_creek' AND time >= '2015-08-18T00:00:00Z'

  AND time <= '2015-08-18T00:30:00Z' GROUP BY time(12m)

 

  •  이상의 측정에 대한 집계  결과를 다른 데이터베이스에 작성
  • ( 참조를 사용한 downsampling)

  > SELECT MEAN(*) INTO "where_else"."autogen".:MEASUREMENT FROM /.*/

  WHERE time >= '2015-08-18T00:00:00Z' AND time <= '2015-08-18T00:06:00Z'

  GROUP BY time(12m)

 

  > SELECT * FROM "where_else"."autogen"./.*/

 

 

 

 

3. DELETE 시리즈 삭제

 

  • DELETE 쿼리는 데이터베이스의 series에서 모든 포인트를 삭제합니다.
  • DROP SERIES와는 달리 인덱스에서 계열을 삭제하지 않으며 WHERE 절에서 시간 간격을 지원합니다.
  •  쿼리는 FROM 절이나 WHERE  또는  모두를 포함해야 하는 다음 형식을 취합니다.

  DELETE FROM <measurement_name> WHERE [<tag_key>='<tag_value>'] | [<time interval>]

 

  • 측정과 관련된 모든 데이터 삭제 h2o_feet :

  > DELETE FROM "h2o_feet"

 

  • 측정 h2o_quality  태그 randtag 3  같은 모든 데이터를 삭제하십시오.

  > DELETE FROM "h2o_quality" WHERE "randtag" = '3'

 

  • 2019  1  1  이전에 발생한 데이터베이스의 모든 데이터 삭제 :

  > DELETE WHERE time < '2019-01-01'

 

 

4. InfluxQL 연속 쿼리

 

  • 실시간데이터에서 자동  주기적으로 실행되고 쿼리결과를 지정된 측정에 저장하는 InfluxQL 쿼리입니다.

 

 Syntax

  • Basic syntax

  CREATE CONTINUOUS QUERY <cq_name> ON <database_name>

  BEGIN

    <cq_query>

  END

 

  • Basic syntax 설명

  SELECT <function[s]> INTO <destination_measurement> FROM <measurement>

  [WHERE <stuff>] GROUP BY time(<interval>)[,<tag_key[s]>]

 

일정  적용 범위 

  • 연속 쿼리는 실시간 데이터에서 작동합니다.
  • 이들은 로컬 서버의 타임 스탬프, GROUP BY time()간격  InfluxDB 데이터베이스의 미리 설정된 시간 경계를 사용하여 실행  시기와 쿼리에서 다루어야  시간을 결정합니다.

 

자동으로 데이터 downsampling

  • 간단한 CQ 사용하여 단일 필드의 데이터를 자동으로 다운 샘플링하고 결과를 동일한 데이터베이스의 다른 측정치에 기록.

  CREATE CONTINUOUS QUERY "cq_basic" ON "transportation"

  BEGIN

    SELECT mean("passengers") INTO "average_passengers" FROM "bus_data"

    GROUP BY time(1h)

  END

 

데이터를 다른 보존 정책으로 자동으로 downsampling

  • 다운 샘플링  데이터를 RP(Non- DEFAULT Retention Policy) 저장하도록 대상 측정을 완전하게 한정합니다.

  CREATE CONTINUOUS QUERY "cq_basic_rp" ON "transportation"

  BEGIN

    SELECT mean("passengers") INTO "transportation"."three_weeks"."average_passengers“

    FROM "bus_data" GROUP BY time(1h)

  END

 

 참조를 사용하여 데이터베이스 자동 downsampling

  • 와일드 카드(*) INTO쿼리의  참조 구문을 사용하여 데이터베이스의 모든 측정 값과 숫자 필드의 데이터를 자동으로 다운 샘플링합니다.

  CREATE CONTINUOUS QUERY "cq_basic_br" ON "transportation"

  BEGIN

    SELECT mean(*) INTO "downsampled_transportation"."autogen".:MEASUREMENT FROM /.*/

    GROUP BY time(30m),*

  END

 

데이터 자동 downsampling  CQ 시간 경계 설정

  • 절의 오프셋 간격을 사용하여 CQ 기본 실행 시간과 미리 설정된 시간 경계를 모두 변경하십시오.

  CREATE CONTINUOUS QUERY "cq_basic_offset" ON "transportation"

  BEGIN

    SELECT mean("passengers") INTO "average_passengers" FROM "bus_data"

    GROUP BY time(1h,15m)

  END

 

5. Retention policy 관리

 

  • 데이터베이스를 만들  InfluxDB 보존 기간이 무한인 보존 정책을 자동으로 만듭니다.

  CREATE RETENTION POLICY <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD   DURATION <duration>] [DEFAULT]

 

○ [DURATION]

  • InfluxDB 데이터를 보관하는 기간을 결정합니다.
  • 보존 정책의 최소 기간은 1시간이며 최대 지속 기간은 INF(무한)입니다.

○ [REPLICATION]

  • REPLICATION절은 클러스터에 저장된  지점의 독립 사본 수를 결정합니다.
  • 복제 계수는 일반적으로 데이터 노드 수와 같습니다.
  • 그러나   이상의 데이터 노드가 있는 경우 기본 복제 요소 n 3입니다.
  • 복제 요소는 단일 노드 인스턴스의 용도로 사용되지 않습니다.

○ [SHARD DURATION]

  • 조각 그룹이 적용되는 시간 범위를 결정합니다.
  • 기본적으로 샤드 그룹 기간은 보존 정책에 의해 결정됩니다.

Icinga2에서 사용되는 대부분의 InfluxDB 설정(Icinga2 서버 서비스  상태를 확인 가능한 모니터링 )

  • Icinga2 서버는 모든 메트릭 ( 메타 데이터) InfluxDB 보내고, InfluxDB 모든 데이터를 "DEFAULT" 보존 정책에 저장하고 영구 보존합니다.
  • 모든 데이터를 무기한 저장하지 않으려면 보관 정책이 필요하며, 이전의 데이터를 다운샘플링하려면 연속 쿼리가 필요합니다.
  • Icinga2 성능 데이터를 InfluxDB 보냄 -> InfluxDB 모든 데이터를 기본 보유 정책에 저장합니다.
  •  번째 연속 쿼리는 기본 보유 정책에서 매시간 52  오래된 데이터를 가져와서 보유 정책 "rp_2_years" 기록합니다.
  •  번째 연속 쿼리 "cq_after_2_years" 보존 정책 "rp_2_years"에서 매일 104 이전의 데이터를 가져와서 보존 정책 "rp_3_years" 기록합니다.
  • 기본 보존 정책은 52  1 이전의 기본 정책에서 모든 데이터를 삭제합니다.
  • 보존 정책 "rp_2_years" 보존 정책 "rp_2_years"에서 104  2 이전의 모든 데이터를 삭제합니다.
  • 보유 정책 "rp_3_years" 156주보다 오래된 보존 정책 "rp_3_years"에서 모든 데이터를 삭제합니다.

 

728x90

댓글