> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Este motor permite usar um cluster Keeper/ZooKeeper como armazenamento chave-valor consistente, com gravações linearizáveis e leituras sequencialmente consistentes.

# Motor de tabela KeeperMap

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:

```xml theme={null}
<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.

<div id="creating-a-table">
  ## Criando uma tabela
</div>

```sql theme={null}
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:

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

com

```xml theme={null}
<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.

<div id="supported-operations">
  ## Operações suportadas
</div>

<div id="inserts">
  ### Inserções
</div>

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:

```sql theme={null}
INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2);
```

<div id="deletes">
  ### Exclusões
</div>

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.

```sql theme={null}
DELETE FROM keeper_map_table WHERE key LIKE 'some%' AND v1 > 1;
```

```sql theme={null}
ALTER TABLE keeper_map_table DELETE WHERE key LIKE 'some%' AND v1 > 1;
```

```sql theme={null}
TRUNCATE TABLE keeper_map_table;
```

<div id="updates">
  ### Atualizações
</div>

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.

```sql theme={null}
ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
```

<div id="related-content">
  ## Conteúdo relacionado
</div>

* Blog: [Como criar aplicações de analytics em tempo real com ClickHouse e Hex](https://clickhouse.com/blog/building-real-time-applications-with-clickhouse-and-hex-notebook-keeper-engine)
