본문으로 바로가기
본문으로 바로가기

Atomic

Atomic 엔진은 블로킹이 발생하지 않는 DROP TABLERENAME TABLE 쿼리와 원자적인 EXCHANGE TABLES 쿼리를 지원합니다. Atomic 데이터베이스 엔진은 오픈 소스 ClickHouse에서 기본값으로 사용됩니다.

참고

ClickHouse Cloud에서는 Shared 데이터베이스 엔진이 기본값으로 사용되며, 위에서 언급한 연산도 지원합니다.

데이터베이스 생성

CREATE DATABASE test [ENGINE = Atomic] [SETTINGS disk=...];

세부 사항 및 권장 사항

테이블 UUID

Atomic 데이터베이스의 각 테이블에는 영구적인 UUID가 있으며, 데이터는 다음 디렉터리에 저장됩니다:

/clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/

여기서 xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy는 테이블의 UUID입니다.

기본적으로 UUID는 자동으로 생성됩니다. 그러나 테이블을 생성할 때 UUID를 직접 지정할 수도 있으나, 이는 권장되지 않습니다.

예를 들어:

CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE = ...;
참고

SHOW CREATE 쿼리에서 UUID를 표시하려면 show_table_uuid_in_table_create_query_if_not_nil 설정을 사용할 수 있습니다.

RENAME TABLE

RENAME 쿼리는 UUID를 변경하거나 테이블 데이터를 이동하지 않습니다. 이 쿼리는 즉시 실행되며, 테이블을 사용 중인 다른 쿼리가 완료될 때까지 기다리지 않습니다.

DROP/DETACH TABLE

DROP TABLE을 사용할 때는 즉시 데이터가 제거되지 않습니다. Atomic 엔진은 메타데이터를 /clickhouse_path/metadata_dropped/로 이동하여 테이블이 삭제된 것으로 표시하고 백그라운드 스레드에 알립니다. 최종적으로 테이블 데이터가 삭제되기까지의 지연 시간은 database_atomic_delay_before_drop_table_sec 설정으로 지정됩니다. SYNC 수정자를 사용하여 동기식 모드를 지정할 수 있습니다. 이를 위해 database_atomic_wait_for_drop_and_detach_synchronously 설정을 사용하십시오. 이 경우 DROP은 테이블을 사용 중인 실행 중인 SELECT, INSERT 및 기타 쿼리가 완료될 때까지 기다립니다. 테이블은 사용 중이 아닐 때 제거됩니다.

EXCHANGE TABLES/DICTIONARIES

EXCHANGE 쿼리는 테이블 또는 딕셔너리를 원자적으로 교환합니다. 예를 들어, 다음과 같은 비원자적 연산 대신:

RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table;

Atomic 엔진을 사용할 수 있습니다:

EXCHANGE TABLES new_table AND old_table;

atomic 데이터베이스에서 ReplicatedMergeTree 사용

ReplicatedMergeTree 테이블에서는 ZooKeeper 경로와 레플리카 이름에 대한 엔진 매개변수를 지정하지 않는 것이 좋습니다. 이 경우 구성 매개변수 default_replica_pathdefault_replica_name이 사용됩니다. 엔진 매개변수를 명시적으로 지정하려면 {uuid} 매크로를 사용하는 것이 좋습니다. 이렇게 하면 ZooKeeper에서 각 테이블마다 고유한 경로가 자동으로 생성됩니다.

메타데이터 디스크

SETTINGS에서 disk를 지정하면, 해당 디스크가 테이블 메타데이터 파일을 저장하는 데 사용됩니다. 예를 들면 다음과 같습니다:

CREATE TABLE db (n UInt64) ENGINE = Atomic SETTINGS disk=disk(type='local', path='/var/lib/clickhouse-disks/db_disk');

지정하지 않으면 database_disk.disk에 정의된 디스크가 기본적으로 사용됩니다.

참고