Créer une base de données
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 selonshard_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.
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
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
{uuid} est utilisée dans zoo_path :
Paramètres
Les valeurs par défaut peuvent être remplacées dans le fichier de configuration