Passer au contenu principal
Le moteur est basé sur le moteur Atomic. Il prend en charge la réplication des métadonnées via un journal DDL écrit dans ZooKeeper et exécuté sur toutes les répliques d’une base de données donnée. Un serveur ClickHouse peut exécuter plusieurs bases de données répliquées et les mettre à jour simultanément. En revanche, il ne peut pas y avoir plusieurs répliques d’une même base de données répliquée.

Créer une base de données

Paramètres du moteur
  • zoo_path — chemin ZooKeeper. Un même chemin ZooKeeper correspond à une même base de données.
  • shard_name — nom du shard. Les répliques de la base de données sont regroupées en shards selon shard_name.
  • replica_name — nom de la réplique. Les noms de réplique doivent être différents pour toutes les répliques d’un même shard.
Les paramètres peuvent être omis ; dans ce cas, les paramètres manquants sont remplacés par les valeurs par défaut. Si zoo_path contient la macro {uuid}, il est nécessaire de spécifier un UUID explicite ou d’ajouter ON CLUSTER à l’instruction CREATE afin de garantir que toutes les répliques utilisent le même UUID pour cette base de données. Pour les tables ReplicatedMergeTree, si aucun argument n’est fourni, les arguments par défaut suivants sont utilisés : /clickhouse/tables/{uuid}/{shard} et {replica}. Ils peuvent être modifiés dans les paramètres du serveur default_replica_path et default_replica_name. La macro {uuid} est remplacée par l’uuid de la table, tandis que {shard} et {replica} sont remplacés par les valeurs issues de la configuration du serveur, et non des arguments du moteur de base de données. Mais à l’avenir, il sera possible d’utiliser shard_name et replica_name de la base de données Replicated. Un cluster ZooKeeper auxiliaire est également pris en charge pour stocker les métadonnées d’une base de données répliquée au lieu d’utiliser le cluster ZooKeeper par défaut. Vous pouvez utiliser SQL pour créer la base de données répliquée avec un cluster ZooKeeper auxiliaire, comme suit :

Spécificités et recommandations

Les requêtes DDL avec une base de données Replicated fonctionnent de manière similaire aux requêtes ON CLUSTER, avec toutefois quelques différences mineures. Tout d’abord, la requête DDL tente de s’exécuter sur l’initiateur (l’hôte qui a initialement reçu la requête de l’utilisateur). Si la requête échoue, l’utilisateur reçoit immédiatement une erreur et les autres hôtes ne tentent pas de l’exécuter. Si la requête a été exécutée avec succès sur l’initiateur, tous les autres hôtes la retenteront automatiquement jusqu’à ce qu’elle aboutisse. L’initiateur essaiera d’attendre que la requête soit terminée sur les autres hôtes (pas plus longtemps que distributed_ddl_task_timeout) et renverra une table contenant les statuts d’exécution de la requête sur chaque hôte. Le comportement en cas d’erreur est régi par le paramètre distributed_ddl_output_mode ; pour une base de données Replicated, il est préférable de le définir sur null_status_on_timeout — c.-à-d. que si certains hôtes n’ont pas eu le temps d’exécuter la requête dans le délai de distributed_ddl_task_timeout, il ne faut pas lever d’exception, mais afficher le statut NULL pour ces hôtes dans la table. La table système system.clusters contient un cluster portant le même nom que la base de données répliquée, qui se compose de toutes les répliques de la base de données. Ce cluster est mis à jour automatiquement lors de la création ou de la suppression de répliques, et il peut être utilisé pour les tables Distributed. Lors de la création d’une nouvelle réplique de la base de données, cette réplique crée elle-même les tables. Si la réplique a été indisponible pendant longtemps et a pris du retard sur le journal de réplication, elle compare ses métadonnées locales aux métadonnées actuelles dans ZooKeeper, déplace les tables supplémentaires avec leurs données vers une base de données séparée non répliquée (afin de ne pas supprimer accidentellement des éléments superflus), crée les tables manquantes et met à jour les noms des tables si elles ont été renommées. Les données sont répliquées au niveau de ReplicatedMergeTree, c.-à-d. que si la table n’est pas répliquée, les données ne le seront pas non plus (la base de données n’est responsable que des métadonnées). Les requêtes ALTER TABLE FREEZE|ATTACH|FETCH|DROP|DROP DETACHED|DETACH PARTITION|PART sont autorisées, mais ne sont pas répliquées. Le moteur de base de données ajoutera/récupérera/supprimera uniquement la partition/la partie sur la réplique actuelle. Cependant, si la table elle-même utilise un moteur de table Replicated, les données seront répliquées après l’utilisation de ATTACH. Si vous avez seulement besoin de configurer un cluster sans maintenir la réplication des tables, reportez-vous à la fonctionnalité Cluster Discovery.

Exemple d’utilisation

Création d’un cluster de trois hôtes :
Création d’une base de données sur un cluster avec des paramètres implicites :
Exécution de la requête DDL :
Affichage de la table système :
Créer une table distribuée et insérer les données :
Ajout d’une réplique sur un hôte supplémentaire :
Ajout d’une réplique sur un hôte supplémentaire si la macro {uuid} est utilisée dans zoo_path :
La configuration du cluster ressemblera à ceci :
La table distribuée récupérera également les données du nouvel hôte :

Paramètres

Les paramètres suivants sont pris en charge : Les valeurs par défaut peuvent être remplacées dans le fichier de configuration
Dernière modification le 2 juillet 2026