이번 포스팅은 요즘 핫한 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"에서 모든 데이터를 삭제합니다.
'개발관련 자료' 카테고리의 다른 글
안드로이드스튜디오에서 RabbitMQ 사용하기 #2 - 레빗엠큐 시작하기전에 (1) | 2021.05.26 |
---|---|
안드로이드스튜디오에서 RabbitMQ 사용하기 #1 - RabbitMQ 설치하기 (CentOS 7 기준) (0) | 2021.05.25 |
인플럭스DB(InfluxDB) #9 - Linux CentOS 설치 (0) | 2020.06.11 |
인플럭스DB(InfluxDB) #8 - TSI(Time Series Index) 세부 정보 (0) | 2020.06.11 |
인플럭스DB(InfluxDB) #7 - TSI(Time Series Index) 개요 (0) | 2020.06.11 |
댓글