跳至主要内容
跳至主要内容

KeeperMap 表引擎

此引擎允许您使用 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)

引擎参数

  • 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 - 表内允许的键的数量。
    此限制是一个软限制,在某些边缘情况下,表中最终可能包含更多的键。
  • primary_key_name – 列列表中任何列的名称。
  • 必须指定 primary key,它仅支持主键中的一列。主键将以二进制形式序列化为 ZooKeeper 内的 node name
  • 主键以外的列将按相应顺序序列化为二进制,并存储为由序列化的键定义的结果节点的 值。
  • 使用键 equalsin 过滤的查询将被优化为从 Keeper 多键查找,否则将提取所有值。

示例

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 路径上,则只要至少有一个表使用它,这些值就会被持久化。
因此,可以在创建表时使用 ON CLUSTER 子句,并从多个 ClickHouse 实例共享数据。
当然,也可以手动在不相关的 ClickHouse 实例上运行 CREATE TABLE,使用相同的路径,以达到相同的数据共享效果。

支持的操作

插入

当将新行插入到 KeeperMap 时,如果键不存在,则为该键创建一个新条目。如果键存在,并且设置了 keeper_map_strict_modetrue,则会抛出异常,否则,该键的值将被覆盖。

示例

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

删除

可以使用 DELETE 查询或 TRUNCATE 删除行。如果键存在,并且设置了 keeper_map_strict_modetrue,则只有在可以原子地执行时,才能成功获取和删除数据。

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;
    © . This site is unofficial and not affiliated with ClickHouse, Inc.