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ù chemin 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 lequeltable_namesera 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 formatauxiliary_zookeeper_cluster_name:/some/pathest également pris en charge, oùauxiliary_zookeeper_clusterest 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 keydoit être spécifiée et ne peut contenir qu’une seule colonne. La clé primaire sera sérialisée en binaire commenode namedans 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
equalsouinseront optimisées en recherche de plusieurs clés depuisKeeper, 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 keyavec
<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;