ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [공식 문서 정리] InfluxDB와 SQL 데이터베이스의 비교
    24년 11월 이전/레거시-influxdb 2020. 5. 30. 11:44
    반응형

    InfluxDB 공식 문서를 토대로 만든 문서입니다. 아직 설치가 되지 않았다면, 여기를 클릭해서 설치를 먼저 진행해주세요.

    Contents

    1. 개요
    2. Timing is everything
    3. Terminology
    4. Query Languages
    5. InfluxDB is not CRUD
    6. 결론

    개요

    이번 장에서는 InfluxDB와 SQL 데이터베이스가 무엇이 다른지 알아봅니다. 자세한 내용은 여기를 참고해주세요. 이번 장은 이전 장과 마찬가지로, 공식 문서를 단순 번역하기 때문에, What, Why, How는 없습니다. 시작해봅시다.

     

    InfluxDB는 SQL 데이터베이스와 유사하지만 많은 차이점이 있습니다. InfluxDB는 시계열 데이터를 다루기 위한 목적으로 만들어졌습니다. 관계형 데이터베이스는 시계열 데이터를 다룰 수 있지만, 시계열 데이터를 조작하는데 최적화되어 있지 않습니다. InfluxDB는 거대한 크기의 시계열 데이터를 저장하고, 그 데이터를 실 시간에 준하는 속도로 분석하기 위하여 설계되었습니다.

    Timing is everything

    InfluxDB에서는 어떤 주어진 데이터 시리즈 안에서, 한 포인트는 "timestamp"로 식별합니다. 이것은 항상 시간이 시스템에 의해 미리 설정된 Primary Key를 갖는 SQL 데이터베이스 테이블과 유사합니다.

     

    InfluxDB는 또한, 시간이 지남에 따라 스키마 선호도가 변할 수 있음을 인식한다. InfluxDB에서는 먼저 스키마들을 정의할 필요는 없습니다. 데이터 포인트들은 하나 이상의 필드를 갖는 메저먼트이기만 하면 됩니다. 메저먼트에 새로운 필드를 추가하기 위해서는 단순히 포인트를 저장할 때 새 필드에 대한 부분을 명시하기만 하면 됩니다. 당신이, 메저먼트, 태그, 필드에 대한 용어 설명이 필요하다면, 용어집과 다음 장을 함께 살펴보세요.

    Terminology

    다음 테이블은, foodships라고 불리우는 간단한 예제 테이블입니다. 이 테이블은 SQL 데이터베이스의 테이블이며, #_foodships는 인덱싱되지 않는 Column이며, park_id, planet, time은 인덱싱되는 Column입니다.

    +---------+---------+---------------------+--------------+
    | park_id | planet  | time                | #_foodships  |
    +---------+---------+---------------------+--------------+
    |       1 | Earth   | 1429185600000000000 |            0 |
    |       1 | Earth   | 1429185601000000000 |            3 |
    |       1 | Earth   | 1429185602000000000 |           15 |
    |       1 | Earth   | 1429185603000000000 |           15 |
    |       2 | Saturn  | 1429185600000000000 |            5 |
    |       2 | Saturn  | 1429185601000000000 |            9 |
    |       2 | Saturn  | 1429185602000000000 |           10 |
    |       2 | Saturn  | 1429185603000000000 |           14 |
    |       3 | Jupiter | 1429185600000000000 |           20 |
    |       3 | Jupiter | 1429185601000000000 |           21 |
    |       3 | Jupiter | 1429185602000000000 |           21 |
    |       3 | Jupiter | 1429185603000000000 |           20 |
    |       4 | Saturn  | 1429185600000000000 |            5 |
    |       4 | Saturn  | 1429185601000000000 |            5 |
    |       4 | Saturn  | 1429185602000000000 |            6 |
    |       4 | Saturn  | 1429185603000000000 |            5 |
    +---------+---------+---------------------+--------------+

     

     

    위 데이터는 InfluxDB에서 다음과 같이 나타낼 수 있습니다.

    name: foodships
    tags: park_id=1, planet=Earth
    time                     #_foodships
    ----                     ------------
    2015-04-16T12:00:00Z     0
    2015-04-16T12:00:01Z     3
    2015-04-16T12:00:02Z     15
    2015-04-16T12:00:03Z     15
    
    name: foodships
    tags: park_id=2, planet=Saturn
    time                     #_foodships
    ----                     ------------
    2015-04-16T12:00:00Z     5
    2015-04-16T12:00:01Z     9
    2015-04-16T12:00:02Z     10
    2015-04-16T12:00:03Z     14
    
    name: foodships
    tags: park_id=3, planet=Jupiter
    time                     #_foodships
    ----                     ------------
    2015-04-16T12:00:00Z     20
    2015-04-16T12:00:01Z     21
    2015-04-16T12:00:02Z     21
    2015-04-16T12:00:03Z     20
    
    name: foodships
    tags: park_id=4, planet=Saturn
    time                     #_foodships
    ----                     ------------
    2015-04-16T12:00:00Z     5
    2015-04-16T12:00:01Z     5
    2015-04-16T12:00:02Z     6
    2015-04-16T12:00:03Z     5

     

     

    위의 예제에서 우리는 다음 점을 알 수 있습니다.

    • InfluxDB에서 measurement foodships는 SQL의 테이블 foodships과 유사합니다.
    • InfluxDB에서 태그들(park_id, planet)은 SQL에서 인덱싱되는 Column과 같습니다.
    • InfluxDB에서 필드들(#_foodships)은 SQL에서 인덱싱되지 않는 Column과 같습니다.
    • InfluxDB에서 한 포이트는 SQL에서 하나의 열과 같습니다.

    더 비교를 해보자면, InfluxDB의 continuous queries retention policies는 SQL 데이터베이스에서 저장된 프로시저와 유사합니다. 그들은 한 번 정의되면, 정기적이고 자동적으로 계속 수행됩니다.

     

    물론 SQL 데이터베이스와 InfluxDB 사이에는 몇 가지 주요한 차이점이 있습니다. SQL의 JOIN이란 개념은 InfluxDB에 존재하지 않습니다. 당신은 이 차이점을 반영하여, 스키마를 정의해야 합니다. 그리고 위에 언급했지만, 메저먼트는, 항상 미리 설정된 시간이 primary key인 SQL 테이블과 같습니다. InfluxDB의 timestamp들은 UNIX 혹은 RFC3339 규약에 맞는 시간 문자열 형식이어야 합니다.

     

    InfluxDB의 용어에 대해 더 자세한 설명을 듣고 싶다면 용어집을 참고하세요.

    Query Languages

    Flux

    Flux는 시계열 데이터를 쿼리하고, 분석하고, 실행시키기 위해 설계된, 데이터 스크립트 언어입니다. InfluxDB 1.8.0 이상부터, InfluxQL과 별도로 Flux를 사용할 수 있습니다.

     

    Flux는 InfluxDB 1.0이 도입 된 이후로, InfluxQL을 많이 사용하는 사람들로부터 요청된 부족한 기능들을 처리하기 위해서 만들어졌습니다. InfluxQL과 차이점을 비교하고 싶다면 이곳을 참고하세요.

     

    Flux는 InfluxDB 2.0과 InfluxDB Cloud 2.0의 주 스크립트 언어입니다. InfluxDB 2.0, InfluxDB Cloud 2.0은 일반적으로 PaaS로써, 여러 클라우드 서비스 프로바이더를 통해서 이용할 수 있습니다. InfluxDB 1.8 이상부터는 2.0으로의 더 쉬운 마이그레이션을 위하여 Flux 사용을 권장하고 있습니다.

    InfluxQL

    InfluxQL은 InfluxDB에서 상호 작용하는 SQL같은 쿼리 언어입니다. SQL 혹은 SQL 비슷한 환경에 익숙하다면, InfluxQL도 금방 적응할 수 있습니다. 참고할 점은 InfluxQL은 시계열 데이터를 저장하고 분석하는 데 초점을 두고 있다는 것입니다. 한 가지 분명한 점은 InfluxQL은 SQL이 아닙니다. SQL에 익숙한 사용자가 주로 사용하는 UNION, JOIN, HAVING 같은 SQL의 고급 작업에 대한 지원이 부족합니다. 이 기능은 Flux로 할 수 있습니다.

     

    다음은 InfluxQL의 SELECT 구문입니다. SQL처럼 WHERE 절은 선택적으로 사용할 수 있습니다.

    SELECT <stuff> FROM <measurement_name> WHERE <some_conditions>

     

    이전 절에 이 구문을 대입하자면, 이렇게 쓸 수 있습니다.

    SELECT * FROM "foodships"

     

    행성 Saturn만 추려서 데이터 목록을 보고 싶다면 이런 WHERE절을 넣으면 됩니다.

    SELECT * FROM "foodships" WHERE "planet" = "Saturn"

     

    UTC 시간으로 2015.04.15 12:00:01 이후, 행성 Saturn인 데이터 목록을 보고 싶다면 이렇게 사용하면 됩니다.

    SELECT * FROM "foodships" WHERE "planet" = 'Saturn' AND time > '2015-04-16 12:00:01'

     

    위 구문에서 알 수 있듯이 InfluxQL은 WHERE 절에 시간 범위에 조건을 주어서 데이터를 쿼리할 수 있습니다. 당신은 작은 따옴표(')로 감싼 'YYYY-MM-DD HH:MM:SS.mmm' 포맷의 문자열을 시간으로써 쓸 수 있습니다. 또한, now()를 이용하여 상대적인 시간 값을 사용할 수 있습니다.

    SELECT * FROM "foodships" WHERE time > now() - 1h

     

    위 쿼리는 현재 시간으로부터 1시간 전의 데이터 목록들을 보여줍니다. now() 와 함께 쓸 수 있는 옵션들은 다음과 같습니다.

    Letter Meaning
    ns nanoseconds
    u microseconds
    ms milliseconds
    s seconds
    m minutes
    h hours
    d days
    w weeks

     

    InfluxQL은 정규표현식, 산술식, SHOW 구문, 그리고 GROUP BY 구문을 지원합니다. 이곳을 살펴보시면, 이 주제에 관한 더 깊은 내용을 확인할 수 있습니다. InfluxQL의 함수들은 COUNT, MIN, MAX, MEDIAN, DERIVATIVE 등등이 있습니다. InfluxQL 함수들의 모든 목록은 이곳에서 확인할 수 있습니다.

     

    일반적인 사용법을 간단히 알고 싶다면, 이곳을 참고하세요.

    InfluxDB is not CRUD

    InfluxDB는 시계열 데이터에 특화된 데이터베이스입니다. 시계열 데이터는 일반적으로 분산된 센서 그룹, 웹사이트의 클릭 정보들, 금융 거래 목록과 같은 곳에서 확인할 수 있습니다.

     

    InfluxDB는 이러한 데이터들을 집계하는데 있어 일반적으로 더 좋은 성능을 가지고 있습니다. 예를 들어, 화요일 12:38:35 UTC에서 컴퓨터 CPU가 12%의 사용률을 보이고 있다는 판독치는 결론을 내리기 어렵습니다. 시리즈의 나머지 부분과 결합하여 시각화하면 더욱 유용해지는데, 이것이 시간 경과에 따른 추세가 나타나기 시작하고, 데이터로부터 실행 가능한 통찰력을 끌어낼 수 있는 부분이기 때문입니다. 또한, 시계열 데이터는 일반적으로 한 번 작성되며 거의 업데이트되지 않습니다.

     

    그 결과, InfluxDB는 완전한 CRUD 데이터베이스라기 보단, CR-ud에 가깝습니다. 업데이트/삭제 하는 것보다 생성하고, 읽는것이 우선 순위를 가지고 있으며 일부 업데이트 및 삭제 동작을 막아 더 많은 생성하고 읽는데, 더 많은 성능을 낼 수 있게 동작합니다.

     

    • 포인트를 업데이트하려면, 메저먼트, 태그 셋, 타임스탬프가 동일해야 합니다.
    • 시리즈를 삭제할 수 있지만, 필드 값을 기반으로 하는 개별 포인트는 삭제할 수 없습니다. 해결 방법으로 필드 값을 검색하고 시간을 검색한 다음 시간 필드 기준으로 삭제할 수 있습니다.
    • 태그는 업데이트하거나 이름을 바꿀 수 없습니다. 시리즈 안의 포인트에서 태그를 수정하려면, 해당 태그 값이 있는 포인트를 찾아서 원하는 값으로 변경하고 포인트를 다시 쓴 다음 이전 태그 값으로 시리즈를 삭제해야 합니다.
    • 태그 키로는 태그를 삭제할 수 없습니다.

    결론

    이번 장에서는 시계열 데이터베이스인 InfluxDB와 일반적인 SQL과 비교하여 유사점과 차이점에 대해서 공부해보았습니다.

    728x90
Designed by Tistory.