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 ondetable_nameserá armazenado. Esse caminho não deve conter o prefixo definido na config<keeper_map_path_prefix>, porque o prefixo será anexado automaticamente aroot_path. Além disso, o formatoauxiliary_zookeeper_cluster_name:/some/pathtambém é compatível, em queauxiliary_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 keydeve ser especificada; ela aceita apenas uma coluna. A chave primária será serializada em binário como umnode nameno 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
equalsouinserão otimizadas para busca de múltiplas chaves noKeeper; 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 keycom
<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 não rígido 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;