메인 콘텐츠로 건너뛰기
이 엔진을 사용하면 Keeper/ZooKeeper 클러스터를 선형화 가능한 쓰기와 순차적으로 일관된 읽기를 지원하는 일관성 있는 키-값 저장소로 사용할 수 있습니다. KeeperMap 스토리지 엔진을 사용하려면 <keeper_map_path_prefix> 구성에서 테이블이 저장될 ZooKeeper 경로를 정의해야 합니다. 예시:
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
여기서 경로는 다른 유효한 ZooKeeper 경로로 지정할 수 있습니다.

테이블 생성하기

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = KeeperMap(root_path, [keys_limit]) PRIMARY KEY(primary_key_name)
Engine 매개변수:
  • root_path - table_name이 저장될 ZooKeeper 경로입니다. 이 경로에는 <keeper_map_path_prefix> 구성에서 정의된 접두사(prefix)를 포함하면 안 됩니다. 이 접두사는 root_path에 자동으로 추가되기 때문입니다. 또한 auxiliary_zookeeper_cluster_name:/some/path 형식도 지원합니다. 여기서 auxiliary_zookeeper_cluster<auxiliary_zookeepers> 구성 내에 정의된 ZooKeeper 클러스터입니다. 기본적으로는 <zookeeper> 구성 내에 정의된 ZooKeeper 클러스터를 사용합니다.
  • keys_limit - 테이블 내에서 허용되는 key 개수입니다. 이 리밋은 소프트 리밋이므로, 일부 예외적인 경우에는 더 많은 key가 테이블에 저장될 수 있습니다.
  • primary_key_name – 컬럼 목록에 있는 임의의 컬럼 이름입니다.
  • primary key는 반드시 지정해야 하며, 프라이머리 키에는 하나의 컬럼만 지원합니다. 프라이머리 키는 ZooKeeper에서 node name으로 바이너리 직렬화됩니다.
  • 프라이머리 키를 제외한 컬럼은 해당 순서대로 바이너리 직렬화되며, 직렬화된 key로 정의된 결과 node의 값으로 저장됩니다.
  • key에 대한 equals 또는 in 필터링이 있는 쿼리는 Keeper에서 여러 key를 lookup하도록 최적화되며, 그렇지 않으면 모든 값을 가져옵니다.
예시:
CREATE TABLE keeper_map_table
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = KeeperMap('/keeper_map_table', 4)
PRIMARY KEY key
with
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
각 값은 (v1, v2, v3)를 이진 직렬화한 것이며, Keeper/keeper_map_tables/keeper_map_table/data/serialized_key 아래에 저장됩니다. 또한 키 개수의 소프트 리밋은 4입니다. 여러 테이블이 동일한 ZooKeeper 경로에 생성되면, 이를 사용하는 테이블이 최소 1개 이상 있는 한 값은 유지됩니다. 따라서 테이블을 생성할 때 ON CLUSTER 절을 사용해 여러 ClickHouse 인스턴스에서 데이터를 공유할 수 있습니다. 물론, 서로 관련 없는 ClickHouse 인스턴스에서 동일한 경로로 CREATE TABLE을 수동으로 실행해 동일한 데이터 공유 효과를 얻는 것도 가능합니다.

지원 작업

삽입

새 행이 KeeperMap에 삽입될 때 키가 존재하지 않으면 해당 키에 대한 새 항목이 생성됩니다. 키가 이미 존재하고 keeper_map_strict_mode 설정이 true로 지정되어 있으면 예외가 발생하고, 그렇지 않으면 해당 키의 값이 덮어써집니다. 예시:
INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2);

삭제

행은 DELETE 쿼리 또는 TRUNCATE를 사용해 삭제할 수 있습니다. 키가 존재하고 keeper_map_strict_mode 설정이 true인 경우, 데이터 조회와 삭제는 원자적으로 실행할 수 있을 때만 성공합니다.
DELETE FROM keeper_map_table WHERE key LIKE 'some%' AND v1 > 1;
ALTER TABLE keeper_map_table DELETE WHERE key LIKE 'some%' AND v1 > 1;
TRUNCATE TABLE keeper_map_table;

업데이트

ALTER TABLE 쿼리를 사용해 값을 업데이트할 수 있습니다. 프라이머리 키는 업데이트할 수 없습니다. keeper_map_strict_modetrue로 설정하면 데이터 조회 및 업데이트는 원자적으로 실행된 경우에만 성공합니다.
ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
마지막 수정일 2026년 6월 10일