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
- ZooKeeper 路径,用于存储table_name
。
此路径不应包含由<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
– 列列表中的任何列名。- 必须指定
主键
,它只支持主键中的一个列。主键将以二进制形式序列化为节点名称
,存储在 ZooKeeper 中。 - 除主键之外的列将按相应顺序序列化为二进制,并存储为由序列化键定义的节点的值。
- 具有键
等于
或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 路径上创建了多个表,则只要存在至少一个使用该路径的表,这些值就会持续存在。
因此,在创建表时可以使用 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_mode
设置为 true
,则仅当可以原子地执行获取和更新数据时,才能成功执行该操作。
ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;