메인 콘텐츠로 건너뛰기

ClickHouse의 딕셔너리

ClickHouse Cloud에서 생성된 딕셔너리는 초기 생성 단계에서 일시적으로 일관성이 보장되지 않을 수 있습니다. 즉, 생성 직후에는 딕셔너리에 데이터가 보이지 않을 수 있습니다. 하지만 여러 차례 재시도하면 생성 쿼리가 다른 레플리카에 전달될 수 있으며, 그러면 데이터가 표시됩니다. 이는 part가 server에 도달하기 전에 딕셔너리가 생성되어 발생하는 경우가 있기 때문입니다. 예시는 다음과 같습니다:
2024-01-25 13:38:25.615837 - CREATE DICTIONARY received
2024-01-25 13:38:25.626468 - CREATE DICTIONARY finished
2024-01-25 13:38:25.733008 - Part all_0_0_0 downloaded
보시다시피 딕셔너리가 생성된 후에야 part가 도착했습니다. LIFETIME(MIN 0 MAX 0)을 사용하는 경우 이는 더 큰 문제가 될 수 있는데, 이 설정은 딕셔너리가 자동으로 갱신되지 않음을 의미하기 때문입니다. 따라서 RELOAD DICTIONARIES 명령을 실행하기 전까지 딕셔너리는 비어 있는 상태로 유지됩니다. 이 문제를 해결하려면 딕셔너리를 생성할 때 원본 테이블을 지정하는 대신 SELECT 쿼리를 사용하고, select_sequential_consistency=1 설정을 활성화해야 합니다. 원본 테이블을 지정하는 대신:
SOURCE(CLICKHOUSE(
    table 'test.temp_title_table_1706189903924'
    user default password 'PASSWORD'))
select_sequential_consistency=1을 설정한 SELECT 쿼리를 사용하십시오:
SOURCE(CLICKHOUSE(QUERY
    'SELECT songTitle, mappedTitle
    FROM test.temp_title_table_1706189903924
    SETTINGS select_sequential_consistency=1' USER default PASSWORD ''))

왜 이 문제가 발생하나요?

데이터를 삽입한 후 딕셔너리를 생성하거나 다시 로드하면, DDL이 데이터(또는 새 데이터)보다 먼저 레플리카에 도달할 수 있습니다. 그러면 레플리카 간 딕셔너리 상태가 일치하지 않게 됩니다. 이후 어느 레플리카가 쿼리를 받는지에 따라 결과가 달라질 수 있습니다. 테이블에 데이터를 삽입한 직후 읽는 경우에도 같은 현상이 발생한다는 점에 유의하십시오. 아직 데이터가 복제되지 않은 레플리카에서 읽으면 새로 삽입된 데이터를 볼 수 없습니다. 성능 저하를 감수하더라도 순차 일관성이 필요하다면(이 때문에 일반적으로는 사용이 권장되지 않음) select_sequential_consistency를 활성화할 수 있습니다. 딕셔너리의 경우에는 조금 더 까다롭습니다. 딕셔너리는 쿼리 설정이 아니라 서버 설정을 사용하기 때문입니다. 따라서 딕셔너리에 데이터를 로드할 때 SET select_sequential_consistency=1을 사용하더라도, 데이터가 레플리카 간에 일관되지 않게 로드될 수 있습니다. 딕셔너리 소스 쿼리에 select_sequential_consistency=1을 지정하면, 서버 설정으로 전역 활성화되어 있지 않더라도 딕셔너리가 이 설정을 따르도록 할 수 있습니다.
마지막 수정일 2026년 6월 10일