GraphiteMergeTree 테이블 엔진

GraphiteMergeTree 테이블 엔진

이 엔진은 Graphite 데이터를 얇게 만들고 집계/평균화(rollup)하기 위해 설계됐어요. ClickHouse를 Graphite의 데이터 저장소로 사용하려는 개발자에게 유용할 수 있어요.

rollup이 필요 없다면 어떤 ClickHouse 테이블 엔진으로도 Graphite 데이터를 저장할 수 있어요. 하지만 rollup이 필요하다면 GraphiteMergeTree를 사용해요. 이 엔진은 저장 볼륨을 줄이고 Graphite의 쿼리 효율을 높여줘요.

이 엔진은 MergeTree의 속성을 상속해요.

출처: 문서

본문

테이블 생성하기

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    Path String,
    Time DateTime,
    Value Float64,
    Version <Numeric_type>
    ...
) ENGINE = GraphiteMergeTree(config_section)
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

CREATE TABLE 쿼리에 대한 자세한 설명은 해당 문서를 참고해요. Graphite 데이터용 테이블은 다음 데이터에 대해 다음 컬럼을 가져야 해요.

  • 메트릭 이름 (Graphite 센서). 데이터 타입: String
  • 메트릭 측정 시간. 데이터 타입: DateTime
  • 메트릭 값. 데이터 타입: Float64
  • 메트릭 버전. 데이터 타입: 임의의 숫자 (ClickHouse는 가장 높은 버전 또는 버전이 같으면 마지막으로 쓰인 행을 저장해요. 다른 행은 데이터 파트 병합 중 삭제돼요)

이 컬럼들의 이름은 rollup 구성에서 설정해야 해요.

GraphiteMergeTree 매개변수

  • config_section — rollup 규칙이 있는 구성 파일의 섹션 이름

쿼리 절

GraphiteMergeTree 테이블을 만들 때 MergeTree 테이블을 만들 때와 같은 절들이 필요해요.

Rollup 구성

rollup 설정은 서버 구성의 graphite_rollup 매개변수로 정의돼요. 매개변수 이름은 무엇이든 될 수 있어요. 여러 구성을 만들고 다른 테이블에 사용할 수 있어요.

Rollup 구성 구조:

  • required-columns
  • patterns

Required columns

path_column_name

path_column_name — 메트릭 이름(Graphite 센서)을 저장하는 컬럼 이름. 기본값: Path.

time_column_name

time_column_name — 메트릭 측정 시간을 저장하는 컬럼 이름. 기본값: Time.

value_column_name

value_column_nametime_column_name에 설정된 시점의 메트릭 값을 저장하는 컬럼 이름. 기본값: Value.

version_column_name

version_column_name — 메트릭 버전을 저장하는 컬럼 이름. 기본값: Timestamp.

Patterns

patterns 섹션의 구조:

pattern
    rule_type
    regexp
    function
pattern
    rule_type
    regexp
    age + precision
    ...
pattern
    rule_type
    regexp
    function
    age + precision
    ...
pattern
    ...
default
    function
    age + precision
    ...

패턴은 엄격하게 순서가 정해져야 해요:

  • function이나 retention이 없는 패턴
  • functionretention 둘 다 있는 패턴
  • default 패턴

행을 처리할 때 ClickHouse는 pattern 섹션의 규칙을 확인해요. 각 pattern(기본 default 포함) 섹션은 집계용 function 매개변수, retention 매개변수 또는 둘 다를 포함할 수 있어요. 메트릭 이름이 regexp와 일치하면 pattern 섹션의 규칙이 적용되고, 그렇지 않으면 default 섹션의 규칙이 사용돼요.

patterndefault 섹션의 필드:

  • rule_type - 규칙 유형. 특정 메트릭에만 적용돼요. 엔진은 이를 사용해 일반(plain)과 태그(tagged) 메트릭을 구분해요. 선택 매개변수. 기본값: all. 성능이 중요하지 않거나 일반 메트릭 같은 한 가지 메트릭 유형만 사용할 때는 불필요해요. 기본적으로 한 가지 유형의 규칙 집합만 생성돼요. 그렇지 않으면 특수 유형 중 하나가 정의되면 두 개의 서로 다른 집합이 생성돼요. 하나는 일반 메트릭(root.branch.leaf)용이고 하나는 태그 메트릭(root.branch.leaf;tag1=value1)용이에요. 기본 규칙은 두 집합 모두에 들어가요.

유효한 값:

  • all (기본) - rule_type이 생략될 때 사용되는 범용 규칙
  • plain - 일반 메트릭용 규칙. regexp 필드는 정규식으로 처리돼요
  • tagged - 태그 메트릭용 규칙 (메트릭은 DB에 someName?tag1=value1&tag2=value2&tag3=value3 형식으로 저장돼요). 정규식은 태그 이름별로 정렬되어야 하고, 첫 태그는 존재하면 __name__이어야 해요. regexp 필드는 정규식으로 처리돼요
  • tag_list - 태그 메트릭용 규칙. graphite 형식 someName;tag1=value1;tag2=value2, someName, 또는 tag1=value1;tag2=value2로 메트릭을 더 쉽게 설명하는 단순 DSL. regexp 필드는 tagged 규칙으로 번역돼요. 태그 이름별 정렬은 불필요하며 자동으로 수행돼요. 태그 값(이름은 아님)은 정규식으로 설정할 수 있어요. 예: env=(dev|staging)
  • regexp – 메트릭 이름의 패턴 (정규식 또는 DSL)
  • age – 데이터의 최소 수명(초)
  • precision – 데이터 수명을 정의하는 정확도(초). 86400(하루의 초)의 약수여야 해요
  • function – 수명이 [age, age + precision] 범위에 있는 데이터에 적용할 집계 함수 이름. 허용 함수: min / max / any / avg. 평균은 평균들의 평균처럼 부정확하게 계산돼요

규칙 유형 없는 구성 예시

<graphite_rollup>
    <version_column_name>Version</version_column_name>
    <pattern>
        <regexp>click_cost</regexp>
        <function>any</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <default>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>60</precision>
        </retention>
        <retention>
            <age>3600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>3600</precision>
        </retention>
    </default>
</graphite_rollup>

규칙 유형 있는 구성 예시

<graphite_rollup>
    <version_column_name>Version</version_column_name>
    <pattern>
        <rule_type>plain</rule_type>
        <regexp>click_cost</regexp>
        <function>any</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <pattern>
        <rule_type>tagged</rule_type>
        <regexp>^((.*)|.)min\?</regexp>
        <function>min</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <pattern>
        <rule_type>tagged</rule_type>
        <regexp><![CDATA[^someName\?(.*&)*tag1=value1(&|$)]]></regexp>
        <function>min</function>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <pattern>
        <rule_type>tag_list</rule_type>
        <regexp>someName;tag2=value2</regexp>
        <retention>
            <age>0</age>
            <precision>5</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>60</precision>
        </retention>
    </pattern>
    <default>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>60</precision>
        </retention>
        <retention>
            <age>3600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>86400</age>
            <precision>3600</precision>
        </retention>
    </default>
</graphite_rollup>

데이터 rollup은 병합 중에 수행돼요. 보통 오래된 파티션에 대해서는 병합이 시작되지 않으므로 rollup을 위해 optimize 사용해 예정되지 않은 병합을 트리거해야 해요. 또는 graphite-ch-optimizer 같은 추가 도구를 사용해요.

더 알아보기 (Learn more)