Pular para o conteúdo principal
Este motor permite usar um cluster Keeper/ZooKeeper como armazenamento chave-valor consistente, com gravações linearizáveis e leituras sequencialmente consistentes. Para habilitar o motor de armazenamento KeeperMap, você precisa definir um caminho do ZooKeeper onde as tabelas serão armazenadas usando a configuração <keeper_map_path_prefix>. Por exemplo:
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
em que path pode ser qualquer outro caminho válido do ZooKeeper.

Criando uma tabela

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)
Parâmetros do motor:
  • root_path - caminho no ZooKeeper onde table_name será armazenado. Esse caminho não deve conter o prefixo definido na config <keeper_map_path_prefix>, porque o prefixo será anexado automaticamente a root_path. Além disso, o formato auxiliary_zookeeper_cluster_name:/some/path também é compatível, em que auxiliary_zookeeper_cluster é um cluster ZooKeeper definido na config <auxiliary_zookeepers>. Por padrão, é usado o cluster ZooKeeper definido na config <zookeeper>.
  • keys_limit - número de chaves permitidas na tabela. Esse é um limite não rígido, e em alguns casos excepcionais pode acontecer de mais chaves acabarem na tabela.
  • primary_key_name – qualquer nome de coluna na lista de colunas.
  • a primary key deve ser especificada; ela aceita apenas uma coluna. A chave primária será serializada em binário como um node name no ZooKeeper.
  • colunas diferentes da chave primária serão serializadas em binário na ordem correspondente e armazenadas como o valor do nó resultante definido pela chave serializada.
  • consultas com filtragem por chave equals ou in serão otimizadas para busca de múltiplas chaves no Keeper; caso contrário, todos os valores serão obtidos.
Exemplo:
CREATE TABLE keeper_map_table
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = KeeperMap('/keeper_map_table', 4)
PRIMARY KEY key
com
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
Cada valor, que é a serialização binária de (v1, v2, v3), será armazenado em /keeper_map_tables/keeper_map_table/data/serialized_key no Keeper. Além disso, o número de chaves terá um limite soft de 4. Se várias tabelas forem criadas no mesmo caminho do ZooKeeper, os valores serão persistidos enquanto houver pelo menos 1 tabela usando esse caminho. Como resultado, é possível usar a cláusula ON CLUSTER ao criar a tabela e compartilhar os dados entre várias instâncias do ClickHouse. É claro que também é possível executar manualmente CREATE TABLE com o mesmo caminho em instâncias não relacionadas do ClickHouse para obter o mesmo efeito de compartilhamento de dados.

Operações suportadas

Inserções

Quando novas linhas são inseridas em KeeperMap, se a chave não existir, uma nova entrada é criada para ela. Se a chave existir e a configuração keeper_map_strict_mode estiver definida como true, uma exceção será lançada; caso contrário, o valor associado à chave será sobrescrito. Exemplo:
INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2);

Exclusões

As linhas podem ser excluídas usando a consulta DELETE ou TRUNCATE. Se a chave existir e a configuração keeper_map_strict_mode estiver definida como true, a recuperação e a exclusão dos dados só serão bem-sucedidas se puderem ser executadas atomicamente.
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;

Atualizações

Os valores podem ser atualizados usando a consulta ALTER TABLE. A chave primária não pode ser atualizada. Se a configuração keeper_map_strict_mode estiver definida como true, a recuperação e a atualização de dados só serão bem-sucedidas se forem executadas atomicamente.
ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
Última modificação em 10 de junho de 2026