Passer au contenu principal
Ce moteur vous permet d’utiliser le cluster Keeper/ZooKeeper comme stockage clé-valeur cohérent, avec des écritures linéarisables et des lectures à cohérence séquentielle. Pour activer le moteur de stockage KeeperMap, vous devez définir un chemin ZooKeeper dans lequel les tables seront stockées à l’aide de la configuration <keeper_map_path_prefix>. Par exemple :
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
où path peut correspondre à n’importe quel autre chemin ZooKeeper valide.

Créer une table

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)
Paramètres du moteur :
  • root_path - chemin ZooKeeper dans lequel table_name sera stocké. Ce chemin ne doit pas contenir le préfixe défini par la config <keeper_map_path_prefix>, car celui-ci sera automatiquement ajouté à root_path. De plus, le format auxiliary_zookeeper_cluster_name:/some/path est également pris en charge, où auxiliary_zookeeper_cluster est un cluster ZooKeeper défini dans la config <auxiliary_zookeepers>. Par défaut, le cluster ZooKeeper défini dans la config <zookeeper> est utilisé.
  • keys_limit - nombre de clés autorisées dans la table. Cette limite est une limite souple, et il est possible que, dans certains cas particuliers, la table contienne davantage de clés.
  • primary_key_name – n’importe quel nom de colonne dans la liste des colonnes.
  • la primary key doit être spécifiée et ne peut contenir qu’une seule colonne. La clé primaire sera sérialisée en binaire comme node name dans ZooKeeper.
  • les colonnes autres que la clé primaire seront sérialisées en binaire dans l’ordre correspondant et stockées comme valeur du nœud résultant défini par la clé sérialisée.
  • les requêtes avec un filtrage sur la clé par equals ou in seront optimisées en recherche de plusieurs clés depuis Keeper, sinon toutes les valeurs seront récupérées.
Exemple :
CREATE TABLE keeper_map_table
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = KeeperMap('/keeper_map_table', 4)
PRIMARY KEY key
avec
<clickhouse>
    <keeper_map_path_prefix>/keeper_map_tables</keeper_map_path_prefix>
</clickhouse>
Chaque valeur, qui correspond à la sérialisation binaire de (v1, v2, v3), sera stockée dans /keeper_map_tables/keeper_map_table/data/serialized_key dans Keeper. De plus, le nombre de clés aura une limite souple fixée à 4. Si plusieurs tables sont créées sur le même chemin ZooKeeper, les valeurs sont conservées tant qu’au moins une table l’utilise. Par conséquent, il est possible d’utiliser la clause ON CLUSTER lors de la création de la table et de partager les données entre plusieurs instances ClickHouse. Bien sûr, il est aussi possible d’exécuter manuellement CREATE TABLE avec le même chemin sur des instances ClickHouse non liées afin d’obtenir le même effet de partage des données.

Opérations prises en charge

Insertions

Lorsque de nouvelles lignes sont insérées dans KeeperMap, si la clé n’existe pas, une nouvelle entrée est créée pour cette clé. Si la clé existe et que le paramètre keeper_map_strict_mode est défini sur true, une exception est levée ; sinon, la valeur associée à la clé est écrasée. Exemple :
INSERT INTO keeper_map_table VALUES ('some key', 1, 'value', 3.2);

Suppressions

Les lignes peuvent être supprimées à l’aide d’une requête DELETE ou de TRUNCATE. Si la clé existe et que le paramètre keeper_map_strict_mode est défini sur true, la récupération et la suppression des données ne peuvent aboutir que si elles sont exécutées de manière atomique.
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;

Mises à jour

Les valeurs peuvent être mises à jour à l’aide d’une requête ALTER TABLE. La clé primaire ne peut pas être mise à jour. Si le paramètre keeper_map_strict_mode est défini sur true, la récupération et la mise à jour des données ne réussiront que si elles sont exécutées de façon atomique.
ALTER TABLE keeper_map_table UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
Dernière modification le 29 juin 2026