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
- Vous avez déjà installé un serveur ClickHouse local
- Vous maîtrisez les concepts de base de la configuration de ClickHouse, comme les fichiers de configuration
- Docker est installé sur votre machine
1
Configurer la structure de répertoires et l’environnement de test
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 :docker-compose.yml suivant dans le répertoire cluster_2S_1R :docker-compose.yml
- Le répertoire
config.dcontient le fichier de configuration du serveur ClickHouseconfig.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 ClickHouseconfig.xmlpar défaut fourni avec chaque installation de ClickHouse. - Le répertoire
users.dcontient le fichier de configuration utilisateurusers.xml, dans lequel est définie la configuration personnalisée des utilisateurs. Cette configuration est fusionnée avec le fichier de configuration ClickHouseusers.xmlpar défaut fourni avec chaque installation de ClickHouse.
2
Configurer les nœuds ClickHouse
Configuration du serveur
Modifiez maintenant chaque fichier de configuration videconfig.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 :8123 :9000:<logger>. Cet exemple de configuration
vous fournit un journal de débogage qui effectuera une rotation à 1000 Mo, trois fois :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.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 videusers.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.
keeper_config.xml pour chaque nœud ClickHouse Keeper
à l’aide de la commande suivante depuis la racine du dossier d’exemple :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.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 commandedocker-compose up depuis la racine du répertoire cluster_2S_1R :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 :Query
Response
Query
Response
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.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 :Response
Response
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 :Query
Response
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 :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 :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
clickhouse-01, exécutez la requête INSERT suivante :clickhouse-02 et exécutez la requête INSERT suivante :Query
clickhouse-01 ou clickhouse-02, exécutez la requête suivante :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 :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 :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 :Query
Response
rand(), les résultats peuvent donc varier) :clickhouse-01 :Response
clickhouse-02, exécutez maintenant la même requête select que précédemment sur la table Distributed :Response