KeeperMap 테이블 엔진

KeeperMap 테이블 엔진

KeeperMap 엔진은 Keeper/ZooKeeper 클러스터를 선형화 가능한 쓰기(linearizable writes)와 순차 일관된 읽기(sequentially consistent reads)를 가진 일관된 키-값 저장소로 사용할 수 있게 해줘요. 테이블을 활성화하려면 <keeper_map_path_prefix> 설정으로 테이블이 저장될 ZooKeeper 경로를 정의해야 합니다.

출처: 문서

본문

이 엔진을 사용하면 Keeper/ZooKeeper 클러스터를 선형화 가능한 쓰기와 순차 일관된 읽기를 가진 일관된 키-값 저장소로 사용할 수 있어요.

KeeperMap 스토리지 엔진을 활성화하려면 <keeper_map_path_prefix> 설정을 사용하여 테이블이 저장될 ZooKeeper 경로를 정의해야 합니다.

예를 들어:

<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>

여기서 경로는 다른 유효한 ZooKeeper 경로일 수도 있어요.

테이블 생성 (Creating a table)

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)

엔진 매개변수:

  • root_path - table_name이 저장될 ZooKeeper 경로. 이 경로에는 <keeper_map_path_prefix> 설정으로 정의된 접두사가 포함되어서는 안 됩니다. 그 접두사는 root_path에 자동으로 추가되기 때문입니다. 또한 auxiliary_zookeeper_cluster_name:/some/path 형식도 지원되는데, 여기서 auxiliary_zookeeper_cluster<auxiliary_zookeepers> 설정 안에 정의된 ZooKeeper 클러스터입니다. 기본적으로 <zookeeper> 설정 안에 정의된 ZooKeeper 클러스터가 사용됩니다.
  • keys_limit - 테이블 안에 허용되는 키의 수. 이 제한은 소프트(soft) 제한이며, 일부 경계 사례에서는 더 많은 키가 테이블에 들어갈 수 있습니다.
  • primary_key_name – 컬럼 목록에 있는 임의의 컬럼 이름.
  • primary key는 지정해야 하며, 기본 키에 단 하나의 컬럼만 지원됩니다. 기본 키는 ZooKeeper 안에서 node name으로 이진 직렬화됩니다.
  • 기본 키가 아닌 컬럼들은 해당 순서대로 이진 직렬화되어 직렬화된 키로 정의된 결과 노드의 값으로 저장됩니다.
  • key equals 또는 in 필터링이 있는 쿼리는 Keeper에서 다중 키 조회로 최적화되고, 그렇지 않으면 모든 값이 가져와집니다.

예시:

CREATE TABLE keeper_map_table
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = KeeperMap('/keeper_map_table', 4)
PRIMARY KEY key

다음과 함께:

<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을 수동으로 실행하여 동일한 데이터 공유 효과를 얻을 수도 있어요.

지원되는 연산 (Supported operations)

삽입 (Inserts)

KeeperMap에 새 행이 삽입되면, 키가 존재하지 않을 경우 키에 대한 새 항목이 생성됩니다. 키가 존재하고 keeper_map_strict_mode 설정이 true로 설정되어 있으면 예외가 발생하고, 그렇지 않으면 키의 값이 덮어써집니다.

예시:

INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2);

삭제 (Deletes)

행은 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;

업데이트 (Updates)

값은 ALTER TABLE 쿼리로 업데이트할 수 있어요. 기본 키는 업데이트할 수 없습니다. keeper_map_strict_mode 설정이 true로 설정되어 있으면, 데이터 가져오기와 업데이트가 원자적으로 실행될 때만 성공합니다.

ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

더 알아보기 (Learn more)