Passer au contenu principal
Dans cet exemple, vous allez apprendre à mettre en place un cluster ClickHouse simple et évolutif. Cinq serveurs sont configurés. Deux servent à partitionner les données. Les trois autres sont utilisés pour la coordination.
L’architecture du cluster que vous allez mettre en place est illustrée ci-dessous :
Bien qu’il soit possible d’exécuter ClickHouse Server et ClickHouse Keeper sur le même serveur, nous recommandons vivement d’utiliser des hôtes dédiés pour ClickHouse Keeper dans les environnements de production. C’est l’approche que nous allons illustrer dans cet exemple.Les serveurs Keeper peuvent être plus modestes, et 4 Go de RAM suffisent généralement pour chaque serveur Keeper jusqu’à ce que vos serveurs ClickHouse prennent de l’ampleur.

Prérequis

1

Configurer la structure de répertoires et l’environnement de test

Fichiers d’exempleLes étapes suivantes vous guideront dans la configuration du cluster à partir de zéro. Si vous préférez ignorer ces étapes et passer directement à l’exécution du cluster, vous pouvez récupérer les fichiers d’exemple dans le dépôt examples, dans le ‘répertoire docker-compose-recipes’.
Dans ce tutoriel, vous utiliserez Docker compose pour configurer le cluster ClickHouse. Cette configuration peut également être adaptée pour fonctionner sur des machines locales distinctes, des machines virtuelles ou des instances cloud.Exécutez les commandes suivantes pour configurer l’arborescence de répertoires de cet exemple :
Ajoutez le fichier docker-compose.yml suivant dans le répertoire cluster_2S_1R :
docker-compose.yml
Créez les sous-répertoires et fichiers suivants :
  • Le répertoire config.d contient le fichier de configuration du serveur ClickHouse config.xml, dans lequel est définie la configuration personnalisée de chaque nœud ClickHouse. Cette configuration est fusionnée avec le fichier de configuration ClickHouse config.xml par défaut fourni avec chaque installation de ClickHouse.
  • Le répertoire users.d contient le fichier de configuration utilisateur users.xml, dans lequel est définie la configuration personnalisée des utilisateurs. Cette configuration est fusionnée avec le fichier de configuration ClickHouse users.xml par défaut fourni avec chaque installation de ClickHouse.
Répertoires de configuration personnalisésIl est recommandé d’utiliser les répertoires config.d et users.d lors de la rédaction de votre propre configuration, plutôt que de modifier directement la configuration par défaut dans /etc/clickhouse-server/config.xml et etc/clickhouse-server/users.xml.La ligne
garantit que les sections de configuration définies dans les répertoires config.d et users.d remplacent les sections de configuration par défaut définies dans les fichiers config.xml et users.xml.
2

Configurer les nœuds ClickHouse

Configuration du serveur

Modifiez maintenant chaque fichier de configuration vide config.xml situé dans fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. Les lignes surlignées ci-dessous doivent être adaptées à chaque nœud :
Chaque section du fichier de configuration ci-dessus est expliquée plus en détail ci-dessous.

Réseau et journalisation

La communication externe via l’interface réseau est activée en configurant le paramètre listen host. Cela garantit que l’hôte du serveur ClickHouse est accessible depuis d’autres hôtes :
Le port de l’API HTTP est configuré sur 8123 :
Le port TCP utilisé pour la communication via le protocole natif de ClickHouse entre clickhouse-client et d’autres outils natifs de ClickHouse, ainsi qu’entre clickhouse-server et d’autres clickhouse-servers, est défini sur 9000:
La journalisation est définie dans le bloc <logger>. Cet exemple de configuration vous fournit un journal de débogage qui effectuera une rotation à 1000 Mo, trois fois :
Pour plus d’informations sur la configuration de la journalisation, consultez les commentaires inclus dans le fichier de configuration ClickHouse par défaut.

Configuration du cluster

La configuration du cluster est définie dans le bloc <remote_servers>. Le nom du cluster cluster_2S_1R y est déclaré.Le bloc <cluster_2S_1R></cluster_2S_1R> définit la disposition du cluster, à l’aide des paramètres <shard></shard> et <replica></replica>, et sert de modèle pour les requêtes DDL distribuées, c’est-à-dire les requêtes qui s’exécutent sur l’ensemble du cluster via la clause ON CLUSTER. Par défaut, les requêtes DDL distribuées sont autorisées, mais peuvent également être désactivées avec le paramètre allow_distributed_ddl_queries.internal_replication est laissé à false par défaut, car il n’y a qu’un seul réplica par segment.
Pour chaque serveur, les paramètres suivants sont définis :

Configuration de Keeper

La section <ZooKeeper> indique à ClickHouse où ClickHouse Keeper (ou ZooKeeper) est en cours d’exécution. Comme nous utilisons un cluster ClickHouse Keeper, chaque <node> du cluster doit être spécifié, avec son hostname et son numéro de port via les tags <host> et <port> respectivement.La configuration de ClickHouse Keeper est présentée à l’étape suivante du tutoriel.
Bien qu’il soit possible d’exécuter ClickHouse Keeper sur le même serveur que ClickHouse Server, dans les environnements de production, nous recommandons vivement d’exécuter ClickHouse Keeper sur des hôtes dédiés.

Configuration des macros

Par ailleurs, la section <macros> permet de définir des substitutions de paramètres pour les tables répliquées. Celles-ci sont répertoriées dans system.macros et permettent d’utiliser des substitutions telles que {shard} et {replica} dans les requêtes.
Ils seront définis en fonction de la topologie du cluster.

Configuration utilisateur

Modifiez maintenant chaque fichier de configuration vide users.xml situé dans fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d en y ajoutant le contenu suivant :
/users.d/users.xml
Dans cet exemple, le default user est configuré sans password par souci de simplicité. En pratique, cette pratique est déconseillée.
Dans cet exemple, le fichier users.xml est identique sur tous les nœuds du cluster.
3

Configurer ClickHouse Keeper

Configuration de ClickHouse Keeper

Pour que la réplication fonctionne, un cluster ClickHouse Keeper doit être mis en place et configuré. ClickHouse Keeper fournit le système de coordination pour la réplication des données, et remplace ZooKeeper, qui peut également être utilisé. ClickHouse Keeper est toutefois recommandé, car il offre de meilleures garanties, une meilleure fiabilité et utilise moins de ressources que ZooKeeper. Pour assurer une haute disponibilité et maintenir le quorum, il est recommandé d’exécuter au moins trois nœuds ClickHouse Keeper.
ClickHouse Keeper peut s’exécuter sur n’importe quel nœud du cluster aux côtés de ClickHouse, mais il est recommandé de l’exécuter sur un nœud dédié, ce qui permet de faire évoluer et de gérer le cluster ClickHouse Keeper indépendamment du cluster de base de données.
Créez les fichiers keeper_config.xml pour chaque nœud ClickHouse Keeper à l’aide de la commande suivante depuis la racine du dossier d’exemple :
Modifiez les fichiers de configuration vides créés dans chaque répertoire de nœud fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper. Les lignes mises en évidence ci-dessous doivent être adaptées à chaque nœud :
/clickhouse-keeper/keeper_config.xml
Chaque fichier de configuration contient la configuration unique suivante (illustrée ci-dessous). Le server_id utilisé doit être unique pour ce nœud ClickHouse Keeper dans le cluster et correspondre à l’<id> du serveur défini dans la section <raft_configuration>. tcp_port est le port utilisé par les clients de ClickHouse Keeper.
La section suivante permet de configurer les serveurs qui participent au quorum de l’algorithme de consensus Raft :
ClickHouse Cloud simplifie la gestionClickHouse Cloud allège la charge opérationnelle liée à la gestion des shards et des réplicas. La plateforme gère automatiquement la haute disponibilité, la réplication et les ajustements de capacité. La puissance de calcul et le stockage sont dissociés et s’adaptent à la demande sans nécessiter de configuration manuelle ni de maintenance continue.En savoir plus
4

Tester la configuration

Assurez-vous que Docker est en cours d’exécution sur votre machine. Démarrez le cluster à l’aide de la commande docker-compose up depuis la racine du répertoire cluster_2S_1R :
Vous devriez voir Docker commencer à télécharger les images ClickHouse et Keeper, puis démarrer les conteneurs :
Pour vérifier que le cluster fonctionne, connectez-vous à clickhouse-01 ou à clickhouse-02, puis exécutez la requête suivante. La commande pour se connecter au premier nœud est indiquée ci-dessous :
Si l’opération réussit, vous verrez l’invite du client ClickHouse :
Exécutez la requête suivante pour vérifier quelles topologies de cluster sont définies sur quels hôtes :
Query
Response
Exécutez la requête suivante pour vérifier l’état du cluster ClickHouse Keeper :
Query
Response
La commande mntr est également couramment utilisée pour vérifier que ClickHouse Keeper est en cours d’exécution et pour obtenir des informations sur l’état des relations entre les trois nœuds Keeper. Dans la configuration utilisée dans cet exemple, trois nœuds fonctionnent ensemble. Les nœuds éliront un leader, et les nœuds restants seront des followers.La commande mntr fournit des informations relatives aux performances et indique si un nœud donné est un follower ou un leader.
Il peut être nécessaire d’installer netcat afin d’envoyer la commande mntr à Keeper. Veuillez consulter la page nmap.org pour les informations de téléchargement.
Exécutez la commande ci-dessous depuis un shell sur clickhouse-keeper-01, clickhouse-keeper-02 et clickhouse-keeper-03 pour vérifier l’état de chaque nœud Keeper. La commande pour clickhouse-keeper-01 est indiquée ci-dessous :
La réponse ci-dessous présente un exemple de réponse d’un nœud follower :
Response
La réponse ci-dessous montre un exemple de réponse renvoyée par un nœud leader :
Response
Vous avez ainsi configuré avec succès un cluster ClickHouse avec deux shards et une réplique par shard. À l’étape suivante, vous créerez une table dans le cluster.
5

Créer une base de données

Maintenant que vous avez vérifié que le cluster est correctement configuré et en cours d’exécution, vous allez recréer la même table que celle utilisée dans le tutoriel du jeu de données d’exemple sur les prix de l’immobilier au Royaume-Uni. Il contient environ 30 millions de lignes correspondant aux prix d’achat de biens immobiliers en Angleterre et au Pays de Galles depuis 1995.Connectez-vous au client de chacun des hôtes en exécutant chacune des commandes suivantes dans des onglets ou fenêtres de terminal distincts :
Vous pouvez exécuter la requête ci-dessous depuis le clickhouse-client de chaque hôte pour vérifier qu’aucune base de données n’a encore été créée, à l’exception de celles par défaut :
Query
Response
Depuis le client clickhouse-01, exécutez la requête DDL distribuée suivante en utilisant la clause ON CLUSTER afin de créer une nouvelle base de données nommée uk :
Vous pouvez de nouveau exécuter la même requête qu’auparavant depuis le client de chaque hôte afin de vérifier que la base de données a bien été créée sur l’ensemble du cluster, même si la requête n’a été exécutée que sur clickhouse-01 :
6

Créer une table sur le cluster

Maintenant que la base de données a été créée, vous allez créer une table. Exécutez la requête suivante depuis n’importe quel client hôte :
Notez qu’elle est identique à la requête utilisée dans l’instruction CREATE initiale du tutoriel sur le jeu de données d’exemple des prix de l’immobilier au Royaume-Uni, à l’exception de la clause ON CLUSTER.La clause ON CLUSTER est conçue pour l’exécution distribuée des requêtes DDL (langage de définition de données) telles que CREATE, DROP, ALTER et RENAME, afin de garantir que ces modifications de schéma sont appliquées sur l’ensemble des nœuds d’un cluster.Vous pouvez exécuter la requête ci-dessous à partir du client de chaque hôte afin de vérifier que la table a bien été créée sur l’ensemble du cluster :
Query
Response
Avant d’insérer les données « UK Price Paid », faisons une petite expérience pour voir ce qui se passe lorsque nous insérons des données dans une table ordinaire depuis l’un ou l’autre hôte.Créez une base de données et une table de test à l’aide de la requête suivante depuis l’un ou l’autre hôte :
Maintenant, depuis clickhouse-01, exécutez la requête INSERT suivante :
Passez sur clickhouse-02 et exécutez la requête INSERT suivante :
Query
À présent, depuis clickhouse-01 ou clickhouse-02, exécutez la requête suivante :
Vous remarquerez que, contrairement à une table ReplicatedMergeTree, seule la ligne insérée dans la table sur cet hôte précis est renvoyée, et non les deux lignes.Pour lire les données sur les deux shards, nous avons besoin d’une interface capable de traiter des requêtes sur l’ensemble des shards, en combinant les données des deux shards lorsque nous exécutons des requêtes SELECT sur celle-ci ou en insérant des données dans les deux shards lorsque nous exécutons des requêtes INSERT.Dans ClickHouse, cette interface est appelée une table distribuée, que nous créons à l’aide du moteur de table Distributed. Voyons comment cela fonctionne.
7

Créer une table distribuée

Créez une table distribuée à l’aide de la requête suivante :
Dans cet exemple, la fonction rand() est choisie comme clé de sharding afin que les insertions soient réparties aléatoirement entre les shards.Interrogez maintenant la table distribuée depuis l’un ou l’autre hôte, et vous obtiendrez les deux lignes qui ont été insérées sur les deux hôtes, contrairement à l’exemple précédent :
Faisons de même pour nos données sur les prix de l’immobilier au Royaume-Uni. Depuis n’importe quel client hôte, exécutez la query suivante pour créer une table distribuée à l’aide de la table existante que nous avons créée précédemment avec ON CLUSTER :
8

Insérer des données dans une table distribuée

Connectez-vous maintenant à l’un des hôtes et insérez les données :
Une fois les données insérées, vous pouvez vérifier le nombre de lignes à l’aide de la table distribuée :
Query
Response
Si vous exécutez la requête suivante sur l’un ou l’autre des hôtes, vous constaterez que les données ont été réparties de manière plus ou moins équitable entre les shards (notez que le choix du shard cible a été déterminé par rand(), les résultats peuvent donc varier) :
Que se passe-t-il si l’un des hôtes tombe en panne ? Simulons cela en arrêtant clickhouse-01 :
Vérifiez que l’hôte est hors ligne en exécutant :
Response
Depuis clickhouse-02, exécutez maintenant la même requête select que précédemment sur la table Distributed :
Response
Malheureusement, notre cluster n’est pas tolérant aux pannes. Si l’un des hôtes tombe en panne, le cluster est considéré comme défaillant et la requête échoue — contrairement à la table répliquée que nous avons vue dans l’exemple précédent, pour laquelle nous pouvions insérer des données même lorsque l’un des hôtes était défaillant.

Conclusion

L’avantage de cette topologie de cluster est que les données sont réparties sur des hôtes distincts et n’utilisent que la moitié du stockage par nœud. Plus important encore, les requêtes sont traitées sur les deux shards, ce qui optimise l’utilisation de la mémoire et réduit les E/S par hôte. Le principal inconvénient de cette topologie de cluster est, bien sûr, que la perte de l’un des hôtes nous empêche d’exécuter des requêtes. Dans l’exemple suivant, nous verrons comment configurer un cluster avec deux shards et deux répliques, offrant à la fois évolutivité et tolérance aux pannes.
Dernière modification le 2 juillet 2026