Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

LIFETIME을 사용한 딕셔너리 데이터 갱신

ClickHouse는 LIFETIME 태그(초 단위로 정의됨)를 기준으로 주기적으로 딕셔너리를 업데이트합니다. LIFETIME은 전체를 다운로드한 딕셔너리의 업데이트 인터벌이며, 캐시된 딕셔너리의 무효화 인터벌입니다.

업데이트 중에도 이전 버전의 딕셔너리는 계속 쿼리할 수 있습니다. 처음 사용할 때 로드되는 경우를 제외하면 딕셔너리 업데이트가 쿼리를 차단하지는 않습니다. 업데이트 중 오류가 발생하면 해당 오류가 서버 로그에 기록되며, 쿼리는 계속 이전 버전의 딕셔너리를 사용할 수 있습니다. 딕셔너리 업데이트가 성공하면 이전 버전의 딕셔너리는 원자적으로 대체됩니다.

설정 예시:

<dictionary>
    ...
    <lifetime>300</lifetime>
    ...
</dictionary>

또는

CREATE DICTIONARY (...)
...
LIFETIME(300)
...

<lifetime>0</lifetime> (LIFETIME(0))로 설정하면 딕셔너리가 업데이트되지 않습니다.

업데이트 시간 인터벌을 설정할 수 있으며, ClickHouse는 이 범위 안에서 균등한 확률로 임의의 시점을 선택합니다. 이는 많은 수의 서버에서 업데이트할 때 딕셔너리 소스에 걸리는 부하를 분산하기 위해 필요합니다.

설정 예시:

<dictionary>
    ...
    <lifetime>
        <min>300</min>
        <max>360</max>
    </lifetime>
    ...
</dictionary>

또는

LIFETIME(MIN 300 MAX 360)

<min>0</min><max>0</max>인 경우, ClickHouse는 timeout으로 딕셔너리를 다시 로드하지 않습니다. 이 경우 딕셔너리 설정 파일이 변경되었거나 SYSTEM RELOAD DICTIONARY 명령이 실행되면 ClickHouse가 딕셔너리를 더 일찍 다시 로드할 수 있습니다.

딕셔너리를 업데이트할 때 ClickHouse 서버는 소스의 유형에 따라 서로 다른 로직을 적용합니다.

  • 텍스트 파일의 경우 수정 시간을 확인합니다. 이 시간이 이전에 기록된 시간과 다르면 딕셔너리가 업데이트됩니다.
  • 다른 소스의 딕셔너리는 기본적으로 매번 업데이트됩니다.

다른 소스(ODBC, PostgreSQL, ClickHouse 등)의 경우 매번이 아니라 실제로 변경되었을 때만 딕셔너리를 업데이트하도록 쿼리를 구성할 수 있습니다. 이렇게 하려면 다음 단계를 따르십시오.

  • 딕셔너리 테이블에는 원본 데이터가 업데이트될 때마다 항상 변경되는 필드가 있어야 합니다.
  • 소스 설정에는 변경되는 필드를 조회하는 쿼리를 지정해야 합니다. ClickHouse 서버는 쿼리 결과를 하나의 행으로 해석하고, 이 행이 이전 상태와 비교해 변경된 경우 딕셔너리를 업데이트합니다. 쿼리는 소스 설정의 <invalidate_query> 필드에 지정하십시오.

설정 예시:

<dictionary>
    ...
    <odbc>
      ...
      <invalidate_query>SELECT update_time FROM dictionary_source where id = 1</invalidate_query>
    </odbc>
    ...
</dictionary>

또는

...
SOURCE(ODBC(... invalidate_query 'SELECT update_time FROM dictionary_source where id = 1'))
...

Cache, ComplexKeyCache, SSDCache, SSDComplexKeyCache 딕셔너리는 동기식 및 비동기식 업데이트를 모두 지원합니다.

또한 Flat, Hashed, HashedArray, ComplexKeyHashed 딕셔너리는 이전 업데이트 이후 변경된 데이터만 요청하도록 설정할 수도 있습니다. 딕셔너리 소스 구성의 일부로 update_field를 지정하면 이전 업데이트 시각의 초 단위 값이 데이터 요청에 추가됩니다. 소스 유형(Executable, HTTP, MySQL, PostgreSQL, ClickHouse 또는 ODBC)에 따라 외부 소스에 데이터를 요청하기 전에 update_field에 서로 다른 로직이 적용됩니다.

  • 소스가 HTTP이면 update_field가 마지막 업데이트 시간을 값으로 하는 쿼리 매개변수로 추가됩니다.
  • 소스가 실행형이면 update_field가 마지막 업데이트 시간을 값으로 하는 실행형 스크립트 인수로 추가됩니다.
  • 소스가 ClickHouse, MySQL, PostgreSQL, ODBC이면 추가 WHERE 조건이 적용되며, 여기서 update_field는 마지막 업데이트 시간보다 크거나 같은 값으로 비교됩니다.
    • 기본적으로 이 WHERE 조건은 SQL 쿼리의 최상위 수준에서 검사됩니다. 또는 쿼리 내 다른 WHERE 절에서 {condition} 키워드를 사용해 이 조건을 검사할 수도 있습니다. 예시:
      ...
      SOURCE(CLICKHOUSE(...
          update_field 'added_time'
          QUERY '
              SELECT my_arr.1 AS x, my_arr.2 AS y, creation_time
              FROM (
                  SELECT arrayZip(x_arr, y_arr) AS my_arr, creation_time
                  FROM dictionary_source
                  WHERE {condition}
              )'
      ))
      ...

update_field 옵션이 설정되면 추가 옵션 update_lag도 설정할 수 있습니다. update_lag 옵션 값은 업데이트된 데이터를 요청하기 전에 이전 업데이트 시간에서 차감됩니다.

설정 예시:

<dictionary>
    ...
        <clickhouse>
            ...
            <update_field>added_time</update_field>
            <update_lag>15</update_lag>
        </clickhouse>
    ...
</dictionary>

또는

...
SOURCE(CLICKHOUSE(... update_field 'added_time' update_lag 15))
...
Navigation