ClickHouse pour les utilisateurs avancés en questions et réponses

En avril, les ingénieurs d'Avito se sont réunis pour des réunions en ligne avec le développeur principal de ClickHouse, Alexey Milovidov, et Kirill Shvakov, un développeur Golang d'Integros. Nous avons discuté de la maniÚre dont nous utilisons un systÚme de gestion de base de données et des difficultés que nous rencontrons.

Sur la base de la rĂ©union, nous avons compilĂ© un article avec les rĂ©ponses d'experts Ă  nos questions et Ă  celles du public sur les sauvegardes, le repartage des donnĂ©es, les dictionnaires externes, le pilote Golang et la mise Ă  jour des versions de ClickHouse. Cela peut ĂȘtre utile aux dĂ©veloppeurs qui travaillent dĂ©jĂ  activement avec le SGBD Yandex et qui s'intĂ©ressent Ă  son prĂ©sent et Ă  son avenir. Par dĂ©faut, les rĂ©ponses sont d'AlexeĂŻ Milovidov, sauf indication contraire.

Attention, il y a beaucoup de texte sous la coupe. Nous espérons que le contenu avec les questions vous aidera à naviguer.

ClickHouse pour les utilisateurs avancés en questions et réponses

Teneur

Si vous ne souhaitez pas lire le texte, vous pouvez regarder l'enregistrement des rassemblements sur notre chaßne YouTube. Les timecodes sont dans le premier commentaire sous la vidéo.

ClickHouse est constamment mis à jour, mais pas nos données. Que faire à ce sujet ?

ClickHouse est constamment mis à jour et nos données, qui ont été optimisées lors du traitement final, ne sont pas mises à jour et se trouvent dans une copie de sauvegarde.

Disons que nous avons eu un problÚme et que les données ont été perdues. Nous avons décidé de restaurer et il s'est avéré que les anciennes partitions stockées sur les serveurs de sauvegarde sont trÚs différentes de la version actuellement utilisée de ClickHouse. Que faire dans une telle situation, et est-ce possible ?

Une situation dans laquelle vous avez restaurĂ© des donnĂ©es Ă  partir d'une sauvegarde dans un ancien format, mais qui ne se connectent pas Ă  la nouvelle version, est impossible. Nous veillons Ă  ce que le format des donnĂ©es dans ClickHouse reste toujours rĂ©trocompatible. Ceci est beaucoup plus important que la rĂ©trocompatibilitĂ© des fonctionnalitĂ©s si le comportement d'une fonction rarement utilisĂ©e a changĂ©. La nouvelle version de ClickHouse devrait toujours ĂȘtre capable de lire les donnĂ©es stockĂ©es sur le disque. C'est la loi.

Quelles sont les meilleures pratiques actuelles pour sauvegarder les donnĂ©es de ClickHouse ?

Comment faire des sauvegardes, en tenant compte du fait que nous avons optimisé les opérations finales, une énorme base de données de téraoctets et des données qui sont mises à jour, disons, au cours des trois derniers jours, et qu'ensuite aucune procédure ne se produit ?

Nous pouvons crĂ©er notre propre solution et Ă©crire sur bash : collecter ces copies de sauvegarde de telle ou telle maniĂšre. Peut-ĂȘtre qu'il n'est pas nĂ©cessaire d'avoir quoi que ce soit avec des bĂ©quilles et que le vĂ©lo a Ă©tĂ© inventĂ© il y a longtemps ?

Commençons par les meilleures pratiques. Mes collĂšgues conseillent toujours, en rĂ©ponse aux questions sur les sauvegardes, de leur rappeler le service Yandex.Cloud, oĂč ce problĂšme a dĂ©jĂ  Ă©tĂ© rĂ©solu. Alors utilisez-le si possible.

Il n'existe pas de solution complĂšte pour les sauvegardes, intĂ©grĂ©e Ă  cent pour cent Ă  ClickHouse. Certains blancs peuvent ĂȘtre utilisĂ©s. Pour obtenir une solution complĂšte, vous devrez soit bricoler un peu manuellement, soit crĂ©er des wrappers sous forme de scripts.

Je commencerai par les solutions les plus simples et terminerai par les plus sophistiquées, en fonction du volume de données et de la taille du cluster. Plus le cluster est grand, plus la solution devient complexe.

Si la table contenant les donnĂ©es n'occupe que quelques gigaoctets, la sauvegarde peut ĂȘtre effectuĂ©e comme ceci :

  1. Enregistrer la définition de la table, c'est-à-dire les métadonnées - afficher créer un tableau.
  2. Faire un dump Ă  l'aide du client ClickHouse - SĂ©lectionner * de la table dĂ©poser. Par dĂ©faut, vous recevrez un fichier au format TabSeparated. Si vous souhaitez ĂȘtre plus efficace, vous pouvez le faire au format Natif.

Si la quantitĂ© de donnĂ©es est plus importante, la sauvegarde prendra plus de temps et beaucoup d'espace. C'est ce qu'on appelle une sauvegarde logique ; elle n'est pas liĂ©e au format de donnĂ©es ClickHouse. Si tel est le cas, en dernier recours, vous pouvez effectuer une sauvegarde et la tĂ©lĂ©charger sur MySQL pour la rĂ©cupĂ©ration.

Pour les cas plus avancés, ClickHouse dispose d'une capacité intégrée pour créer un instantané des partitions dans le systÚme de fichiers local. Cette fonctionnalité est disponible sur demande modifier la partition de gel de la table. Ou simplement modifier le gel de la table - ceci est un instantané de la table entiÚre.

L'instantanĂ© sera créé de maniĂšre cohĂ©rente pour une table sur une seule partition, c'est-Ă -dire qu'il est impossible de crĂ©er un instantanĂ© cohĂ©rent de l'ensemble du cluster de cette maniĂšre. Mais pour la plupart des tĂąches, ce besoin n'est pas nĂ©cessaire, et il suffit d'exĂ©cuter une requĂȘte sur chaque fragment et d'obtenir un instantanĂ© cohĂ©rent. Il est créé sous forme de liens physiques et ne prend donc pas de place supplĂ©mentaire. Ensuite, vous copiez cet instantanĂ© sur le serveur de sauvegarde ou sur le stockage que vous utilisez pour les sauvegardes.

Restaurer une telle sauvegarde est assez simple. Commencez par crĂ©er des tables Ă  l’aide des dĂ©finitions de table existantes. Ensuite, copiez les instantanĂ©s enregistrĂ©s des partitions dans Directory-Detached pour ces tables et exĂ©cutez la requĂȘte attacher une partition. Cette solution est tout Ă  fait adaptĂ©e aux volumes de donnĂ©es les plus importants.

Parfois, vous avez besoin de quelque chose d'encore plus cool - dans les cas oĂč vous avez des dizaines, voire des centaines de tĂ©raoctets sur chaque serveur et des centaines de serveurs. Il existe ici une solution que j'ai rĂ©cupĂ©rĂ©e auprĂšs de mes collĂšgues de Yandex.Metrica. Je ne le recommanderais pas Ă  tout le monde - lisez-le et dĂ©cidez vous-mĂȘme s'il convient ou non.

Tout d'abord, vous devez crĂ©er plusieurs serveurs dotĂ©s de baies de disques de grande capacitĂ©. Ensuite, sur ces serveurs, installez plusieurs serveurs ClickHouse et configurez-les pour qu'ils servent de rĂ©pliques supplĂ©mentaires pour les mĂȘmes partitions. Enfin, utilisez un systĂšme de fichiers ou un outil permettant la crĂ©ation de snapshots sur ces serveurs. Deux options s'offrent Ă  vous : les snapshots LVM ou ZFS. Linux.

AprĂšs cela, chaque jour, vous devez crĂ©er un instantanĂ©, il mentira et prendra de la place. Naturellement, si les donnĂ©es changent, la quantitĂ© d’espace augmentera avec le temps. Cet instantanĂ© peut ĂȘtre supprimĂ© Ă  tout moment et les donnĂ©es restaurĂ©es, une solution tellement Ă©trange. De plus, nous devons Ă©galement limiter ces rĂ©pliques dans la configuration afin qu'elles n'essaient pas de devenir des leaders.

Sera-t-il possible d'organiser un décalage contrÎlé des répliques dans les puits ?

Cette année, vous envisagez de fabriquer des puits dans ClickHouse. Sera-t-il possible d'y organiser un décalage contrÎlé des répliques ? Nous aimerions l'utiliser pour nous protéger des scénarios négatifs avec des altérations et autres changements.

Est-il possible d'effectuer une sorte de restauration des modifications ? Par exemple, dans un puits existant, prenez et dites que jusqu'Ă  ce moment vous appliquez les modifications, et Ă  partir de ce moment vous arrĂȘtez d'appliquer les modifications ?

Si une commande arrive sur notre cluster et le casse, alors nous avons une rĂ©plique conditionnelle avec un dĂ©calage d'une heure, oĂč nous pouvons dire que nous l'utilisons pour le moment, mais nous n'y appliquerons pas de modifications au cours des dix derniĂšres minutes ?

Tout d’abord, Ă  propos du dĂ©calage contrĂŽlĂ© des rĂ©pliques. Il y a eu une telle demande de la part des utilisateurs, et nous avons créé un problĂšme sur Github avec la demande : « Si quelqu'un a besoin de ça, aimez-le, mettez un cƓur. » Personne n'a livrĂ© et le problĂšme a Ă©tĂ© clos. Cependant, vous pouvez dĂ©jĂ  bĂ©nĂ©ficier de cette opportunitĂ© en crĂ©ant ClickHouse. C'est vrai, seulement Ă  partir de la version 20.3.

ClickHouse effectue constamment une fusion de donnĂ©es en arriĂšre-plan. Lorsqu'une fusion est terminĂ©e, un certain ensemble de donnĂ©es est remplacĂ© par un Ă©lĂ©ment plus volumineux. Dans le mĂȘme temps, les Ă©lĂ©ments de donnĂ©es qui existaient auparavant continuent de rester sur le disque pendant un certain temps.

PremiĂšrement, ils continuent Ă  ĂȘtre stockĂ©s tant que des requĂȘtes de sĂ©lection les utilisent, afin de fournir un fonctionnement non bloquant. Les requĂȘtes sĂ©lectionnĂ©es sont facilement lues Ă  partir d’anciens morceaux.

DeuxiĂšmement, il existe Ă©galement un seuil de temps : les anciennes donnĂ©es restent sur le disque pendant huit minutes. Ces huit minutes peuvent ĂȘtre personnalisĂ©es et mĂȘme transformĂ©es en une seule journĂ©e. Cela coĂ»tera de l'espace disque : en fonction du flux de donnĂ©es, il s'avĂšre qu'au cours du dernier jour, les donnĂ©es non seulement doubleront, mais pourraient devenir cinq fois plus importantes. Mais s'il y a un problĂšme grave, vous pouvez arrĂȘter le serveur ClickHouse et tout rĂ©gler.

La question se pose maintenant de savoir comment cela protÚge contre les altérations. Cela vaut la peine d'examiner de plus prÚs ici, car dans les anciennes versions de ClickHouse, la modification fonctionnait de telle maniÚre qu'elle modifiait simplement les piÚces directement. Il existe une donnée avec certains fichiers, et nous faisons, par exemple, modifier la colonne de dépÎt. Ensuite, cette colonne est physiquement supprimée de tous les morceaux.

Mais Ă  partir de la version 20.3, le mĂ©canisme de modification a Ă©tĂ© complĂštement modifiĂ© et dĂ©sormais les Ă©lĂ©ments de donnĂ©es sont toujours immuables. Ils ne changent pas du tout – les modifications fonctionnent dĂ©sormais de la mĂȘme maniĂšre que les fusions. Au lieu de remplacer une piĂšce sur place, on en crĂ©e une nouvelle. Dans le nouveau morceau, les fichiers qui n'ont pas changĂ© deviennent des liens physiques, et si nous supprimons une colonne, elle manquera simplement dans le nouveau morceau. L'ancienne piĂšce sera supprimĂ©e par dĂ©faut aprĂšs huit minutes, et vous pourrez ici modifier les paramĂštres mentionnĂ©s ci-dessus.

La mĂȘme chose s'applique aux modifications telles que les mutations. Quand tu fais modifier supprimer ou modifier la mise Ă  jour, cela ne change pas la piĂšce, mais en crĂ©e une nouvelle. Et puis supprime l'ancien.

Et si la structure du tableau avait changé ?

Comment restaurer une sauvegarde effectuĂ©e avec l'ancien systĂšme ? Ma deuxiĂšme question concerne les instantanĂ©s et les ressources du systĂšme de fichiers. Btrfs est-il plus adaptĂ© que ZFS ? Linux LVM ?

Si tu fais attacher une partition partitions avec une structure diffĂ©rente, alors ClickHouse vous dira que ce n'est pas possible. C'est la solution. La premiĂšre consiste Ă  crĂ©er une table temporaire de type MergeTree avec l'ancienne structure, Ă  y attacher des donnĂ©es Ă  l'aide de attach et Ă  effectuer une requĂȘte de modification. Ensuite, vous pouvez soit copier ou transfĂ©rer ces donnĂ©es et les joindre Ă  nouveau, soit utiliser une demande modifier la table dĂ©placer la partition.

Maintenant, la deuxiĂšme question est de savoir si les Btrfs peuvent ĂȘtre utilisĂ©s. Pour commencer, si vous disposez de LVM, les instantanĂ©s LVM suffisent et le systĂšme de fichiers peut ĂȘtre ext4, cela n'a pas d'importance. Avec Btrts, tout dĂ©pend de votre expĂ©rience d'utilisation. Il s'agit d'un systĂšme de fichiers mature, mais des soupçons subsistent quant Ă  la maniĂšre dont tout se dĂ©roulera dans la pratique dans un scĂ©nario particulier. Je ne recommanderais pas de l'utiliser Ă  moins que vous n'ayez Btrfs en production.

Quelles sont les meilleures pratiques actuelles en matiĂšre de repartitionnement des donnĂ©es ?

La question du reharding est complexe et multiforme. Il y a plusieurs rĂ©ponses possibles ici. Vous pouvez passer d'un cĂŽtĂ© et dire ceci : ClickHouse n'a pas de fonctionnalitĂ© de repartitionnement intĂ©grĂ©e. Mais je crains que cette rĂ©ponse ne convienne Ă  personne. Par consĂ©quent, vous pouvez passer de l’autre cĂŽtĂ© et dire que ClickHouse propose de nombreuses façons de repartir les donnĂ©es.

Si le cluster manque d'espace ou s'il ne peut pas gérer la charge, vous ajoutez de nouveaux serveurs. Mais ces serveurs sont vides par défaut, il n'y a aucune donnée dessus, il n'y a pas de charge. Vous devez réorganiser les données afin qu'elles soient réparties uniformément sur le nouveau cluster plus grand.

La premiĂšre façon de procĂ©der consiste Ă  copier une partie des partitions sur de nouveaux serveurs Ă  l'aide d'une requĂȘte. modifier la partition de rĂ©cupĂ©ration de table. Par exemple, vous aviez des partitions par mois, et vous prenez le premier mois de 2017 et le copiez sur un nouveau serveur, puis copiez le troisiĂšme mois sur un autre nouveau serveur. Et vous faites cela jusqu'Ă  ce que cela devienne plus ou moins uniforme.

Le transfert ne peut ĂȘtre effectuĂ© que pour les partitions qui ne changent pas pendant l'enregistrement. Pour les nouvelles partitions, l'enregistrement devra ĂȘtre dĂ©sactivĂ©, car leur transfert n'est pas atomique. Sinon, vous vous retrouverez avec des doublons ou des lacunes dans les donnĂ©es. Cependant, cette mĂ©thode est pratique et fonctionne assez efficacement. Les partitions compressĂ©es prĂȘtes Ă  l'emploi sont transmises sur le rĂ©seau, c'est-Ă -dire que les donnĂ©es ne sont ni compressĂ©es ni rĂ©encodĂ©es.

Cette mĂ©thode prĂ©sente un inconvĂ©nient, et cela dĂ©pend du schĂ©ma de partitionnement, si vous vous ĂȘtes engagĂ© Ă  suivre ce schĂ©ma de partitionnement, quelle clĂ© de partitionnement vous aviez. Dans votre exemple pour le cas des mĂ©triques, la clĂ© de partitionnement est le hachage du chemin. Lorsque vous sĂ©lectionnez une table distribuĂ©e, elle accĂšde Ă  toutes les partitions du cluster en mĂȘme temps et en extrait les donnĂ©es.

Cela signifie que peu importe quelles donnĂ©es ont abouti sur quel fragment. L'essentiel est que les donnĂ©es empruntant un chemin se retrouvent sur un seul fragment, mais lequel n'a pas d'importance. Dans ce cas, le transfert de partitions prĂȘtes Ă  l'emploi est parfait, car avec les requĂȘtes sĂ©lectionnĂ©es, vous recevrez Ă©galement des donnĂ©es complĂštes - que ce soit avant ou aprĂšs le repartitionnement, le schĂ©ma n'a pas vraiment d'importance.

Mais il existe des cas plus complexes. Si au niveau de la logique applicative vous comptez sur un schĂ©ma de partitionnement particulier, que ce client se trouve sur tel ou tel fragment, et que la requĂȘte peut y ĂȘtre envoyĂ©e directement, et non Ă  la table DistribuĂ©e. Soit vous utilisez une version assez rĂ©cente de ClickHouse et avez activĂ© le paramĂštre optimiser ignorer les fragments inutilisĂ©s. Dans ce cas, lors de la requĂȘte de sĂ©lection, l'expression dans la section Where sera analysĂ©e et il sera calculĂ© quelles partitions doivent ĂȘtre utilisĂ©es selon le schĂ©ma de partitionnement. Cela fonctionne Ă  condition que les donnĂ©es soient partitionnĂ©es exactement selon ce schĂ©ma de partitionnement. Si vous les avez rĂ©organisĂ©s manuellement, la correspondance peut changer.

C'est donc la méthode numéro un. Et j'attends votre réponse, si la méthode est adaptée, ou passons à autre chose.

Vladimir Kolobaev, administrateur systĂšme principal chez Avito: Alexey, la mĂ©thode que vous avez mentionnĂ©e ne fonctionne pas trĂšs bien lorsqu'il faut rĂ©partir la charge, y compris la lecture. Nous pouvons prendre une partition mensuelle et transfĂ©rer le mois prĂ©cĂ©dent vers un autre nƓud, mais lorsqu'une demande arrive pour ces donnĂ©es, nous la chargerons uniquement. Mais nous aimerions charger l'intĂ©gralitĂ© du cluster, car sinon, pendant un certain temps, la totalitĂ© de la charge de lecture sera traitĂ©e par deux fragments.

AlexeĂŻ Milovidov : La rĂ©ponse ici est Ă©trange : oui, c’est mauvais, mais cela pourrait fonctionner. Je vais vous expliquer exactement comment. Cela vaut la peine d'examiner le scĂ©nario de charge qui se cache derriĂšre vos donnĂ©es. S’il s’agit de donnĂ©es de surveillance, nous pouvons presque certainement affirmer que la grande majoritĂ© des demandes concernent des donnĂ©es rĂ©centes.

Vous avez installĂ© de nouveaux serveurs, migrĂ© d'anciennes partitions, mais Ă©galement modifiĂ© la façon dont les nouvelles donnĂ©es sont enregistrĂ©es. Et de nouvelles donnĂ©es seront rĂ©parties dans tout le cluster. Ainsi, aprĂšs seulement cinq minutes, les requĂȘtes des cinq derniĂšres minutes chargeront le cluster de maniĂšre uniforme ; aprĂšs une journĂ©e, les requĂȘtes de XNUMX heures chargeront le cluster de maniĂšre uniforme. Et les demandes du mois prĂ©cĂ©dent ne iront malheureusement qu'Ă  une partie des serveurs du cluster.

Mais souvent vous n’aurez pas de demandes spĂ©cifiquement pour fĂ©vrier 2019. TrĂšs probablement, si les demandes portent sur 2019, elles concerneront toute l'annĂ©e 2019 - sur une longue pĂ©riode de temps, et non sur une petite plage. Et de telles requĂȘtes pourront Ă©galement charger le cluster de maniĂšre uniforme. Mais en gĂ©nĂ©ral, votre remarque est tout Ă  fait correcte : il s'agit d'une solution ad hoc qui ne rĂ©partit pas les donnĂ©es de maniĂšre totalement uniforme.

J'ai encore quelques points pour rĂ©pondre Ă  la question. L’un d’eux concerne la maniĂšre de concevoir initialement un schĂ©ma de partitionnement afin que le re-partitionnement soit moins pĂ©nible. Ce n'est pas toujours possible.

Par exemple, vous disposez de donnĂ©es de surveillance. Les donnĂ©es de surveillance augmentent pour trois raisons. Le premier est l’accumulation de donnĂ©es historiques. Le deuxiĂšme est la croissance du trafic. Et le troisiĂšme est l’augmentation du nombre de choses soumises Ă  surveillance. De nouveaux microservices et mĂ©triques doivent ĂȘtre sauvegardĂ©s.

Il est possible que parmi ceux-ci, la plus forte augmentation soit associĂ©e Ă  la troisiĂšme raison : l’augmentation du recours Ă  la surveillance. Et dans ce cas, cela vaut la peine d'examiner la nature de la charge, quelles sont les principales requĂȘtes de sĂ©lection. Les requĂȘtes de sĂ©lection de base seront trĂšs probablement basĂ©es sur un sous-ensemble de mĂ©triques.

Par exemple, l'utilisation du processeur sur certains serveurs par un service. Il s'avĂšre qu'il existe un certain sous-ensemble de clĂ©s grĂące auxquelles vous obtenez ces donnĂ©es. Et la demande elle-mĂȘme de ces donnĂ©es est probablement assez simple et s'effectue en quelques dizaines de millisecondes. UtilisĂ© pour surveiller les services et les tableaux de bord. J'espĂšre avoir bien compris.

Vladimir Kolobaev : Le fait est que nous faisons trĂšs souvent appel Ă  des donnĂ©es historiques, puisque nous comparons en temps rĂ©el la situation actuelle avec la situation historique. Et il est important pour nous d’avoir un accĂšs rapide Ă  une grande quantitĂ© de donnĂ©es, et ClickHouse fait un excellent travail dans ce domaine.

Vous avez tout Ă  fait raison, nous recevons la plupart des demandes de lecture au cours du dernier jour, comme tout systĂšme de surveillance. Mais en mĂȘme temps, la charge sur les donnĂ©es historiques est Ă©galement assez importante. Il s'agit essentiellement d'un systĂšme d'alerte qui circule toutes les trente secondes et dit Ă  ClickHouse : « Donnez-moi les donnĂ©es des six derniĂšres semaines. Maintenant, construisez-moi une sorte de moyenne mobile Ă  partir d’eux, et comparons la valeur actuelle avec la valeur historique.

Je voudrais dire que pour des requĂȘtes aussi rĂ©centes, nous avons une autre petite table dans laquelle nous stockons seulement deux jours de donnĂ©es, et les requĂȘtes principales y atterrissent. Nous envoyons uniquement les requĂȘtes historiques volumineuses Ă  la grande table partitionnĂ©e.

AlexeĂŻ Milovidov : Malheureusement, cela s'avĂšre peu applicable Ă  votre scĂ©nario, mais je vais vous dĂ©crire deux schĂ©mas de partitionnement mauvais et complexes qui n'ont pas besoin d'ĂȘtre utilisĂ©s, mais qui sont utilisĂ©s dans le service de mes amis.

Il existe un cluster principal avec les événements Yandex.Metrica. Les événements sont des pages vues, des clics et des conversions. La plupart des demandes sont dirigées vers un site Web spécifique. Vous ouvrez le service Yandex.Metrica, vous avez un site Web - avito.ru, accédez au rapport et une demande est faite pour votre site Web.

Mais il existe d’autres demandes – analytiques et globales – qui Ă©manent des analystes internes. Juste au cas oĂč, je note que les analystes internes font des demandes uniquement pour les services Yandex. NĂ©anmoins, mĂȘme les services Yandex occupent une part importante de toutes les donnĂ©es. Il ne s’agit pas de demandes de compteurs spĂ©cifiques, mais d’un filtrage plus large.

Comment organiser les donnĂ©es de maniĂšre Ă  ce que tout fonctionne efficacement pour un seul compteur, ainsi que pour les requĂȘtes globales ? Une autre difficultĂ© est que le nombre de requĂȘtes dans ClickHouse pour le cluster Metrics est de plusieurs milliers par seconde. Dans le mĂȘme temps, un serveur ClickHouse ne peut pas gĂ©rer des requĂȘtes non triviales, par exemple plusieurs milliers par seconde.

La taille du cluster est de six cents serveurs. Si vous extrayez simplement une table distribuĂ©e sur ce cluster et y envoyez plusieurs milliers de requĂȘtes, cela deviendra encore pire que de les envoyer Ă  un seul serveur. En revanche, l'option selon laquelle les donnĂ©es seraient rĂ©parties uniformĂ©ment et que nous allions demander Ă  tous les serveurs est immĂ©diatement Ă©cartĂ©e.

Il existe une option diamĂ©tralement opposĂ©e. Imaginez si nous partageons les donnĂ©es sur plusieurs sites et qu'une demande pour un site est dirigĂ©e vers une seule partition. DĂ©sormais, le cluster sera capable de gĂ©rer dix mille requĂȘtes par seconde, mais sur un seul fragment, toute requĂȘte fonctionnera trop lentement. Il ne sera plus Ă©volutif en termes de dĂ©bit. Surtout s'il s'agit du site avito.ru. Je ne rĂ©vĂ©lerai pas le secret si je dis qu'Avito est l'un des sites les plus visitĂ©s de RuNet. Et le traiter sur un seul fragment serait une folie.

Par conséquent, le schéma de partitionnement est conçu de maniÚre plus astucieuse. L'ensemble du cluster est divisé en un certain nombre de clusters, que nous appelons couches. Chaque cluster contient d'une douzaine à plusieurs dizaines de fragments. Il existe au total trente-neuf clusters de ce type.

Comment tout cela Ă©volue-t-il ? Le nombre de clusters ne change pas : comme il Ă©tait de trente-neuf il y a quelques annĂ©es, il le reste. Mais au sein de chacun d’eux, nous augmentons progressivement le nombre de fragments Ă  mesure que nous accumulons des donnĂ©es. Et le schĂ©ma de partitionnement dans son ensemble est le suivant : ces clusters sont divisĂ©s en sites Web, et afin de comprendre quel site Web se trouve sur quel cluster, une mĂ©tabase distincte dans MySQL est utilisĂ©e. Un site - sur un cluster. Et Ă  l’intĂ©rieur, le partitionnement se produit en fonction des identifiants des visiteurs.

Lors de l'enregistrement, nous les divisons par le reste de la division de l'identifiant du visiteur. Mais lors de l'ajout d'un nouveau fragment, le schĂ©ma de partitionnement change : nous continuons Ă  diviser, mais avec un reste de division par un autre nombre. Cela signifie qu'un visiteur se trouve dĂ©jĂ  sur plusieurs serveurs et vous ne pouvez pas vous y fier. Ceci est fait uniquement pour garantir que les donnĂ©es sont mieux compressĂ©es. Et lors des requĂȘtes, nous accĂ©dons Ă  la table DistribuĂ©e, qui examine le cluster et accĂšde Ă  des dizaines de serveurs. C'est un plan tellement stupide.

Mais mon histoire serait incomplÚte si je ne disais pas que nous avons abandonné ce projet. Dans le nouveau schéma, nous avons tout changé et copié toutes les données à l'aide de Clickhouse-copier.

Dans le nouveau schĂ©ma, tous les sites sont divisĂ©s en deux catĂ©gories : grands et petits. Je ne sais pas comment le seuil a Ă©tĂ© choisi, mais le rĂ©sultat est que les grands sites sont enregistrĂ©s sur un seul cluster, oĂč se trouvent 120 fragments avec trois rĂ©pliques chacun, soit 360 serveurs. Et le schĂ©ma de partitionnement est tel que toute demande est adressĂ©e Ă  toutes les partitions Ă  la fois. Si vous ouvrez maintenant une page de rapport pour avito.ru dans Yandex.Metrica, la demande sera envoyĂ©e Ă  120 serveurs. Il existe peu de grands sites sur RuNet. Et les requĂȘtes ne sont pas de mille par seconde, mais mĂȘme de moins d'une centaine. Tout cela est tranquillement mĂąchĂ© par la table DistribuĂ©e, que chacun d'eux traite avec 120 serveurs.

Et le deuxiÚme cluster concerne les petits sites. Voici un schéma de partitionnement basé sur l'ID du site, et chaque demande est adressée à exactement une partition.

ClickHouse dispose d'un utilitaire de copie Clickhouse. Pouvez-vous nous parler d'elle ?

Je dirai tout de suite que cette solution est plus lourde et un peu moins productive. L'avantage est qu'il étale complÚtement les données selon le modÚle que vous spécifiez. Mais l'inconvénient de l'utilitaire est qu'il ne redémarre pas du tout. Il copie les données d'un schéma de cluster vers un autre schéma de cluster.

Cela signifie que pour que cela fonctionne, vous devez disposer de deux clusters. Ils peuvent ĂȘtre situĂ©s sur les mĂȘmes serveurs, mais nĂ©anmoins les donnĂ©es ne seront pas dĂ©placĂ©es progressivement, mais seront copiĂ©es.

Par exemple, il y avait quatre serveurs, maintenant il y en a huit. Vous crĂ©ez une nouvelle table distribuĂ©e sur tous les serveurs, de nouvelles tables locales et lancez Clickhouse-copier, en y indiquant le schĂ©ma de travail qu'il doit lire Ă  partir de lĂ , acceptez le nouveau schĂ©ma de partitionnement et transfĂ©rez-y les donnĂ©es. Et sur les anciens serveurs, vous aurez besoin d'une fois et demie plus d'espace qu'aujourd'hui, car les anciennes donnĂ©es doivent y rester, et la moitiĂ© des mĂȘmes anciennes donnĂ©es arriveront par-dessus. Si vous pensiez Ă  l'avance que les donnĂ©es devaient ĂȘtre reparties et qu'il y avait de l'espace, cette mĂ©thode convient.

Comment fonctionne le copieur Clickhouse Ă  l'intĂ©rieur ? Il divise tout le travail en un ensemble de tĂąches pour traiter une partition d'une table sur un fragment. Toutes ces tĂąches peuvent ĂȘtre exĂ©cutĂ©es en parallĂšle et clickhouse-copier peut ĂȘtre exĂ©cutĂ© sur diffĂ©rentes machines dans plusieurs instances, mais ce qu'il fait pour une partition n'est rien de plus qu'une sĂ©lection d'insertion. Les donnĂ©es sont lues, dĂ©compressĂ©es, repartitionnĂ©es, puis Ă  nouveau compressĂ©es, Ă©crites quelque part et triĂ©es Ă  nouveau. C'est une dĂ©cision plus difficile.

Vous aviez un projet pilote appelé reharding. Et avec elle ?

En 2017, vous aviez un projet pilote appelĂ© reharding. Il existe mĂȘme une option dans ClickHouse. Si je comprends bien, cela n'a pas dĂ©collĂ©. Pouvez-vous me dire pourquoi cela s'est produit ? Cela semble trĂšs pertinent.

Tout le problĂšme est que s’il est nĂ©cessaire de repartir les donnĂ©es sur place, une synchronisation trĂšs complexe est nĂ©cessaire pour le faire de maniĂšre atomique. Lorsque nous avons commencĂ© Ă  examiner le fonctionnement de cette synchronisation, il est devenu Ă©vident qu’il existait des problĂšmes fondamentaux. Et ces problĂšmes fondamentaux ne sont pas seulement thĂ©oriques, mais ont immĂ©diatement commencĂ© Ă  se manifester dans la pratique sous la forme de quelque chose qui peut ĂȘtre expliquĂ© trĂšs simplement : rien ne fonctionne.

Est-il possible de fusionner toutes les donnĂ©es avant de les dĂ©placer vers des disques lents ?

Question sur le TTL avec l'option de passage au disque lent dans le cadre de fusions. Existe-t-il un moyen, autre que via cron, de fusionner toutes les parties en une seule avant de les déplacer vers des disques lents ?

La rĂ©ponse Ă  la question est-il possible de coller automatiquement toutes les piĂšces en une seule avant de les transfĂ©rer - non. Je ne pense pas que ce soit nĂ©cessaire. Vous n'ĂȘtes pas obligĂ© de fusionner toutes les piĂšces en une seule, mais comptez simplement sur le fait qu'elles seront automatiquement transfĂ©rĂ©es sur des disques lents.

Nous avons deux critÚres pour les rÚgles de transfert. Le premier est tel qu'il est rempli. Si le niveau de stockage actuel dispose de moins d'un certain pourcentage d'espace libre, nous sélectionnons un morceau et le déplaçons vers un stockage plus lent. Ou plutÎt, pas plus lentement, mais le suivant - comme vous le configurez.

Le deuxiÚme critÚre est la taille. Il s'agit de déplacer de gros morceaux. Vous pouvez ajuster le seuil en fonction de l'espace libre sur le disque rapide, et les données seront transférées automatiquement.

Comment migrer vers de nouvelles versions de ClickHouse s'il n'y a aucun moyen de vérifier la compatibilité à l'avance ?

Ce sujet est abordé réguliÚrement dans le chat par télégramme ClickHouse en tenant compte des différentes versions, et toujours. Dans quelle mesure est-il sûr de passer de la version 19.11 à la version 19.16 et, par exemple, de la version 19.16 à la version 20.3 ? Quelle est la meilleure façon de migrer vers de nouvelles versions sans pouvoir vérifier au préalable la compatibilité dans le sandbox ?

Il existe ici plusieurs rĂšgles « d’or ». D'abord - lire le journal des modifications. Il est volumineux, mais il contient des paragraphes sĂ©parĂ©s sur les modifications rĂ©trocompatibles. Ne traitez pas ces points comme un signal d’alarme. Il s’agit gĂ©nĂ©ralement d’incompatibilitĂ©s mineures impliquant certaines fonctionnalitĂ©s de pointe que vous n’utilisez probablement pas.

DeuxiĂšmement, s’il n’existe aucun moyen de vĂ©rifier la compatibilitĂ© dans le bac Ă  sable et que vous souhaitez effectuer la mise Ă  jour immĂ©diatement en production, il est recommandĂ© de ne pas le faire. CrĂ©ez d’abord un bac Ă  sable et testez. S'il n'y a pas d'environnement de test, vous n'avez probablement pas une trĂšs grande entreprise, ce qui signifie que vous pouvez copier certaines donnĂ©es sur votre ordinateur portable et vous assurer que tout fonctionne correctement dessus. Vous pouvez mĂȘme crĂ©er plusieurs rĂ©pliques localement sur votre machine. Ou vous pouvez rĂ©cupĂ©rer une nouvelle version quelque part Ă  proximitĂ© et y tĂ©lĂ©charger certaines donnĂ©es, c'est-Ă -dire crĂ©er un environnement de test improvisĂ©.

Une autre rÚgle est de ne pas mettre à jour pendant une semaine aprÚs la sortie de la version en raison de bugs détectés en production et de correctifs rapides ultérieurs. Voyons la numérotation des versions de ClickHouse afin de ne pas nous tromper.

Il existe la version 20.3.4. Le chiffre 20 indique l'annĂ©e de fabrication - 2020. Du point de vue de ce qu'il y a Ă  l'intĂ©rieur, cela n'a pas d'importance, nous n'y prĂȘterons donc pas attention. Suivant - 20.3. Nous augmentons le deuxiĂšme chiffre - dans ce cas 3 - chaque fois que nous publions une version avec de nouvelles fonctionnalitĂ©s. Si nous voulons ajouter des fonctionnalitĂ©s Ă  ClickHouse, nous devons augmenter ce nombre. Autrement dit, dans la version 20.4, ClickHouse fonctionnera encore mieux. Le troisiĂšme chiffre est 20.3.4. Ici 4 est le nombre de versions de correctifs dans lesquelles nous n'avons pas ajoutĂ© de nouvelles fonctionnalitĂ©s, mais corrigĂ© quelques bugs. Et 4 signifie que nous l’avons fait quatre fois.

Ne pensez pas que c'est quelque chose de terrible. Habituellement, l'utilisateur peut installer la derniÚre version et celle-ci fonctionnera sans aucun problÚme de disponibilité par an. Mais imaginez que dans certaines fonctions de traitement des bitmaps, ajoutées par nos camarades chinois, le serveur plante lors du passage d'arguments incorrects. Nous avons la responsabilité de résoudre ce problÚme. Nous publierons une nouvelle version du correctif et ClickHouse deviendra plus stable.

Si ClickHouse est en production et qu'une nouvelle version de ClickHouse sort avec des fonctionnalitĂ©s supplĂ©mentaires - par exemple, 20.4.1 est la toute premiĂšre, ne vous prĂ©cipitez pas pour la mettre en production dĂšs le premier jour. Pourquoi est-ce mĂȘme nĂ©cessaire ? Si vous n'utilisez pas dĂ©jĂ  ClickHouse, vous pouvez l'installer et tout ira probablement bien. Mais si ClickHouse fonctionne dĂ©jĂ  de maniĂšre stable, gardez un Ɠil sur les correctifs et les mises Ă  jour pour voir quels problĂšmes nous rĂ©solvons.

Kirill Chvakov : Je voudrais ajouter un peu sur les environnements de test. Tout le monde a trĂšs peur des environnements de test et, pour une raison quelconque, pense que si vous disposez d'un trĂšs grand cluster ClickHouse, l'environnement de test ne devrait pas ĂȘtre moins ou au moins dix fois plus petit. Ce n'est pas du tout comme ça.

Je peux vous le dire Ă  partir de mon propre exemple. J'ai un projet et il y a ClickHouse. Notre environnement de test est rien que pour lui - il s'agit d'une petite machine virtuelle chez Hetzner pour vingt euros, oĂč absolument tout est dĂ©ployĂ©. Pour ce faire, nous disposons d'une automatisation complĂšte dans Ansible et, par consĂ©quent, en principe, peu importe oĂč aller - sur des serveurs matĂ©riels ou simplement dĂ©ployer sur des machines virtuelles.

Ce qui peut ĂȘtre fait? Ce serait bien de fournir un exemple dans la documentation ClickHouse sur la façon de dĂ©ployer un petit cluster dans votre propre maison - dans Docker, dans LXC, crĂ©ez peut-ĂȘtre un playbook Ansible, car diffĂ©rentes personnes ont des dĂ©ploiements diffĂ©rents. Cela simplifiera beaucoup. Lorsque vous prenez et dĂ©ployez un cluster en cinq minutes, il est beaucoup plus facile d’essayer de comprendre quelque chose. C’est beaucoup plus pratique, car passer Ă  une version de production que vous n’avez pas testĂ©e ne mĂšne nulle part. Parfois ça marche et parfois non. Et donc espĂ©rer rĂ©ussir est une mauvaise chose.

Maxim Kotyakov, ingĂ©nieur backend senior Avito : J'ajouterai un peu sur les environnements de test Ă  partir d'une sĂ©rie de problĂšmes rencontrĂ©s par les grandes entreprises. Nous disposons d'un cluster d'acceptation ClickHouse Ă  part entiĂšre ; en termes de schĂ©mas de donnĂ©es et de paramĂštres, il s'agit d'une copie exacte de ce qui est en production. Ce cluster est dĂ©ployĂ© dans des conteneurs assez dĂ©gradĂ©s avec un minimum de ressources. Nous y Ă©crivons un certain pourcentage des donnĂ©es de production, heureusement il est possible de rĂ©pliquer le flux dans Kafka. Tout y est synchronisĂ© et Ă©volutif - tant en termes de capacitĂ© que de flux, et, en thĂ©orie, toutes choses Ă©gales par ailleurs, cela devrait se comporter comme une production en termes de mĂ©triques. Tout ce qui est potentiellement explosif est d'abord roulĂ© sur ce stand et y est laissĂ© pendant plusieurs jours jusqu'Ă  ce qu'il soit prĂȘt. Mais bien entendu, cette solution est coĂ»teuse, difficile et entraĂźne des coĂ»ts de support non nuls.

AlexeĂŻ Milovidov : Je vais vous dire Ă  quoi ressemble l'environnement de test de nos amis de Yandex.Metrica. Un cluster comptait environ 600 serveurs, un autre 360, et il existe un troisiĂšme et plusieurs clusters. L’environnement de test pour l’un d’eux est simplement constituĂ© de deux fragments contenant chacun deux rĂ©pliques. Pourquoi deux fragments ? Pour que vous ne soyez pas seul. Et il devrait aussi y avoir des rĂ©pliques. Juste un certain montant minimum que vous pouvez vous permettre.

Cet environnement de test vous permet de vĂ©rifier si vos requĂȘtes fonctionnent et si quelque chose de majeur est cassĂ©. Mais souvent, des problĂšmes surviennent d'une nature complĂštement diffĂ©rente, lorsque tout fonctionne, mais qu'il y a quelques petits changements dans la charge.

Laisse moi te donner un exemple. Nous avons dĂ©cidĂ© d'installer une nouvelle version de ClickHouse. Il a Ă©tĂ© publiĂ© sur un environnement de test, des tests automatisĂ©s ont Ă©tĂ© effectuĂ©s dans Yandex.Metrica lui-mĂȘme, qui comparent les donnĂ©es de l'ancienne version et de la nouvelle, exĂ©cutant l'ensemble du pipeline. Et bien sĂ»r, des tests verts de notre CI. Sinon nous n'aurions mĂȘme pas proposĂ© cette version.

Tout va bien. Nous commençons Ă  passer Ă  la production. Je reçois un message indiquant que la charge sur les graphiques a augmentĂ© plusieurs fois. Nous annulons la version. Je regarde le graphique et vois : la charge a en fait augmentĂ© plusieurs fois pendant le dĂ©ploiement, et a diminuĂ© lors du dĂ©ploiement. Ensuite, nous avons commencĂ© Ă  restaurer la version. Et la charge a augmentĂ© de la mĂȘme maniĂšre et est retombĂ©e de la mĂȘme maniĂšre. La conclusion est donc la suivante : la charge a augmentĂ© Ă  cause de l'amĂ©nagement, rien d'Ă©tonnant.

Il a ensuite Ă©tĂ© difficile de convaincre les collĂšgues d’installer la nouvelle version. Je dis : « C’est bon, lancez-vous. Croisons les doigts, tout fonctionnera. Maintenant, la charge sur les graphiques a augmentĂ©, mais tout va bien. Accrochez-vous. » En gĂ©nĂ©ral, nous avons fait cela, et c'est tout - la version est sortie pour la production. Mais presque avec chaque mise en page, des problĂšmes similaires surviennent.

La requĂȘte Kill est censĂ©e tuer les requĂȘtes, mais ce n'est pas le cas. Pourquoi?

Un utilisateur, une sorte d'analyste, est venu vers moi et a créé une requĂȘte qui a mis mon cluster ClickHouse. Un nƓud ou un cluster entier, en fonction de la rĂ©plique ou de la partition Ă  laquelle la requĂȘte a Ă©tĂ© adressĂ©e. Je vois que toutes les ressources CPU de ce serveur sont dans une Ă©tagĂšre, tout est rouge. Dans le mĂȘme temps, ClickHouse rĂ©pond lui-mĂȘme aux demandes. Et j’écris : « S’il vous plaĂźt, montrez-moi, liste des processus, quelle demande a gĂ©nĂ©rĂ© cette folie. »

Je trouve cette requĂȘte et j'y Ă©cris kill. Et je vois qu'il ne se passe rien. Mon serveur est dans une Ă©tagĂšre, ClickHouse me donne alors quelques commandes, montre que le serveur est vivant, et tout va bien. Mais j'ai une dĂ©gradation dans toutes les demandes des utilisateurs, la dĂ©gradation commence par les enregistrements dans ClickHouse et ma requĂȘte kill ne fonctionne pas. Pourquoi? Je pensais que kill query Ă©tait censĂ© tuer les requĂȘtes, mais ce n'est pas le cas.

Il y aura maintenant une rĂ©ponse plutĂŽt Ă©trange. Le fait est que la requĂȘte kill ne tue pas les requĂȘtes.

Kill query coche une petite case intitulĂ©e "Je veux que cette requĂȘte soit tuĂ©e". Et la requĂȘte elle-mĂȘme examine cet indicateur lors du traitement de chaque bloc. S'il est dĂ©fini, la requĂȘte cesse de fonctionner. Il s'avĂšre que personne ne tue la demande, il doit lui-mĂȘme tout vĂ©rifier et s'arrĂȘter. Et cela devrait fonctionner dans tous les cas oĂč la requĂȘte est en train de traiter des blocs de donnĂ©es. Il traitera le bloc de donnĂ©es suivant, vĂ©rifiera le drapeau et s'arrĂȘtera.

Cela ne fonctionne pas dans les cas oĂč la demande est bloquĂ©e sur une opĂ©ration. Certes, ce n'est probablement pas votre cas, car, selon vous, cela utilise une tonne de ressources du serveur. Il est possible que cela ne fonctionne pas dans le cas d'un tri externe et dans certains autres dĂ©tails. Mais en gĂ©nĂ©ral, cela ne devrait pas arriver, c’est un bug. Et la seule chose que je peux recommander est de mettre Ă  jour ClickHouse.

Comment calculer le temps de réponse sous charge de lecture ?

Il existe un tableau qui stocke les agrĂ©gats d'articles - divers compteurs. Le nombre de lignes est d'environ cent millions. Est-il possible de compter sur un temps de rĂ©ponse prĂ©visible si vous versez 1 1 RPS pour XNUMX XNUMX Ă©lĂ©ments ?

À en juger par le contexte, nous parlons de charge de lecture, car il n'y a aucun problĂšme d'Ă©criture - mĂȘme mille, voire cent mille, et parfois plusieurs millions de lignes peuvent ĂȘtre insĂ©rĂ©es.

Les demandes de lecture sont trĂšs diffĂ©rentes. Dans Select 1, ClickHouse peut effectuer environ des dizaines de milliers de requĂȘtes par seconde, de sorte que mĂȘme les requĂȘtes pour une clĂ© nĂ©cessiteront dĂ©jĂ  des ressources. Et de telles requĂȘtes ponctuelles seront plus difficiles que dans certaines bases de donnĂ©es clĂ©-valeur, car pour chaque lecture, il est nĂ©cessaire de lire un bloc de donnĂ©es par index. Notre index ne traite pas chaque enregistrement, mais chaque plage. Autrement dit, vous devrez lire toute la plage - il s'agit de 8192 64 lignes par dĂ©faut. Et vous devrez dĂ©compresser le bloc de donnĂ©es compressĂ© de 1 Ko Ă  XNUMX Mo. En rĂšgle gĂ©nĂ©rale, ces requĂȘtes ciblĂ©es prennent quelques millisecondes. Mais c'est l'option la plus simple.

Essayons quelques calculs simples. Si vous multipliez quelques millisecondes par mille, vous obtenez quelques secondes. C’est comme s’il Ă©tait impossible de rĂ©pondre Ă  mille requĂȘtes par seconde, mais en fait c’est possible, car nous avons plusieurs cƓurs de processeur. Ainsi, en principe, ClickHouse peut parfois dĂ©tenir 1000 RPS, mais pour des demandes courtes, spĂ©cifiquement ciblĂ©es.

Si vous devez faire Ă©voluer un cluster ClickHouse en fonction du nombre de requĂȘtes simples, je recommande la chose la plus simple : augmenter le nombre de rĂ©pliques et envoyer des requĂȘtes Ă  une rĂ©plique alĂ©atoire. Si une rĂ©plique contient cinq cents requĂȘtes par seconde, ce qui est tout Ă  fait rĂ©aliste, alors trois rĂ©pliques en traiteront mille cinq cents.

Parfois, bien sĂ»r, vous pouvez configurer ClickHouse pour le nombre maximum de lectures de points. Que faut-il pour cela ? La premiĂšre consiste Ă  rĂ©duire la granularitĂ© de l’index. Dans ce cas, il ne faut pas le rĂ©duire Ă  un, mais partir du principe que le nombre d'entrĂ©es dans l'index sera de plusieurs millions ou dizaines de millions par serveur. Si la table comporte cent millions de lignes, la granularitĂ© peut ĂȘtre dĂ©finie sur 64.

Vous pouvez rĂ©duire la taille du bloc compressĂ©. Il y a des paramĂštres pour cela taille minimale du bloc de compression, taille maximale du bloc de compression. Ils peuvent ĂȘtre rĂ©duits, remplis de donnĂ©es, et les requĂȘtes ciblĂ©es seront alors plus rapides. Mais ClickHouse n’est pas une base de donnĂ©es clĂ©-valeur. Un grand nombre de petites requĂȘtes constituent un anti-modĂšle de charge.

Kirill Chvakov : Je donnerai des conseils au cas oĂč il y aurait des comptes ordinaires lĂ -bas. Il s'agit d'une situation assez courante lorsque ClickHouse stocke une sorte de compteur. J'ai un utilisateur, il vient de tel ou tel pays, et d'un troisiĂšme domaine, et j'ai besoin d'augmenter quelque chose progressivement. Prenez MySQL, crĂ©ez une clĂ© unique - dans MySQL, c'est une clĂ© en double et dans PostgreSQL, c'est un conflit - et ajoutez un signe plus. Cela fonctionnera beaucoup mieux.

Lorsque vous ne disposez pas de beaucoup de donnĂ©es, cela ne sert Ă  rien d’utiliser ClickHouse. Il existe des bases de donnĂ©es rĂ©guliĂšres et elles le font bien.

Que puis-je modifier dans ClickHouse pour que plus de donnĂ©es soient dans le cache ?

Imaginons une situation - les serveurs ont 256 Go de RAM, dans la routine quotidienne ClickHouse prend environ 60 Ă  80 Go, au maximum - jusqu'Ă  130. Ce qui peut ĂȘtre activĂ© et modifiĂ© pour que plus de donnĂ©es soient dans le cache et, en consĂ©quence, il y a moins de dĂ©placements sur le disque ?

En rĂšgle gĂ©nĂ©rale, le cache de pages du systĂšme d'exploitation fait du bon travail. Si vous ouvrez simplement le haut, regardez lĂ -bas en cache ou libre - cela indique Ă©galement combien est mis en cache - alors vous remarquerez que toute la mĂ©moire libre est utilisĂ©e pour le cache. Et lors de la lecture de ces donnĂ©es, elles ne seront pas lues Ă  partir du disque, mais Ă  partir de la RAM. En mĂȘme temps, je peux dire que le cache est utilisĂ© efficacement car ce sont les donnĂ©es compressĂ©es qui sont mises en cache.

Cependant, si vous souhaitez accĂ©lĂ©rer encore plus certaines requĂȘtes simples, il est possible d'activer un cache dans les donnĂ©es dĂ©compressĂ©es dans ClickHouse. On l'appelle cache non compressĂ©. Dans le fichier de configuration config.xml, dĂ©finissez la taille du cache non compressĂ© sur la valeur dont vous avez besoin - je recommande de ne pas dĂ©passer la moitiĂ© de la RAM libre, car le reste ira sous le cache des pages.

De plus, il existe deux paramĂštres de niveau de demande. Premier rĂ©glage - utiliser un cache non compressĂ© - inclut son utilisation. Il est recommandĂ© de l'activer pour toutes les requĂȘtes, sauf les requĂȘtes lourdes, qui permettent de lire toutes les donnĂ©es et de vider le cache. Et le deuxiĂšme paramĂštre est quelque chose comme le nombre maximum de lignes pour utiliser le cache. Il limite automatiquement les requĂȘtes volumineuses afin qu'elles contournent le cache.

Comment puis-je configurer storage_configuration pour le stockage dans la RAM ?

Dans la nouvelle documentation ClickHouse, j'ai lu la section relative avec stockage de données. La description contient un exemple avec un SSD rapide.

Je me demande comment la mĂȘme chose peut ĂȘtre configurĂ©e avec la mĂ©moire chaude du volume. Et encore une question. Comment Select fonctionne-t-il avec cette organisation de donnĂ©es, lira-t-il l'ensemble complet ou uniquement celui qui se trouve sur le disque, et ces donnĂ©es sont-elles compressĂ©es en mĂ©moire ? Et comment la section prewhere fonctionne-t-elle avec une telle organisation de donnĂ©es ?

Ce paramÚtre affecte le stockage des blocs de données et leur format ne change en rien.
Regardons de plus prĂšs.

Vous pouvez configurer le stockage des donnĂ©es dans la RAM. Tout ce qui est configurĂ© pour le disque est son chemin. Vous crĂ©ez une partition tmpfs montĂ©e sur un chemin du systĂšme de fichiers. Vous spĂ©cifiez ce chemin comme chemin de stockage des donnĂ©es pour la partition la plus chaude, des morceaux de donnĂ©es commencent Ă  arriver et Ă  y ĂȘtre Ă©crits, tout va bien.

Mais je ne recommande pas de le faire en raison de sa faible fiabilitĂ©, mĂȘme si si vous disposez d'au moins trois rĂ©pliques dans diffĂ©rents centres de donnĂ©es, c'est possible. Si quelque chose arrive, les donnĂ©es seront restaurĂ©es. Imaginons que le serveur soit soudainement Ă©teint puis rallumĂ©. La partition a Ă©tĂ© remontĂ©e, mais il n'y avait rien. Lorsque le serveur ClickHouse dĂ©marre, il constate qu'il ne dispose pas de ces Ă©lĂ©ments, mĂȘme si, selon les mĂ©tadonnĂ©es de ZooKeeper, ils devraient ĂȘtre lĂ . Il regarde quelles rĂ©pliques en possĂšdent, les demande et les tĂ©lĂ©charge. De cette façon, les donnĂ©es seront restaurĂ©es.

En ce sens, le stockage des donnĂ©es dans la RAM n'est pas fondamentalement diffĂ©rent du stockage sur disque, car lorsque les donnĂ©es sont Ă©crites sur le disque, elles finissent Ă©galement d'abord dans le cache des pages et sont Ă©crites physiquement ultĂ©rieurement. Cela dĂ©pend de l'option de montage du systĂšme de fichiers. Mais juste au cas oĂč, je dirai que ClickHouse ne se synchronise pas lors de l'insertion.

Dans ce cas, les donnĂ©es de la RAM sont stockĂ©es exactement dans le mĂȘme format que sur le disque. De la mĂȘme maniĂšre, la requĂȘte de sĂ©lection sĂ©lectionne les Ă©lĂ©ments qui doivent ĂȘtre lus, sĂ©lectionne les plages de donnĂ©es nĂ©cessaires dans les Ă©lĂ©ments et les lit. Et prewhere fonctionne exactement de la mĂȘme maniĂšre, que les donnĂ©es se trouvent dans la RAM ou sur le disque.

Jusqu’à quel nombre de valeurs uniques la Low CardinalitĂ© est-elle efficace ?

La faible cardinalitĂ© est intelligemment conçue. Il compile des dictionnaires de donnĂ©es, mais ils sont locaux. PremiĂšrement, il existe diffĂ©rents dictionnaires pour chaque morceau, et deuxiĂšmement, mĂȘme au sein d'un mĂȘme morceau, ils peuvent ĂȘtre diffĂ©rents pour chaque gamme. Lorsque le nombre de valeurs uniques atteint un seuil – un million, je pense – le dictionnaire est simplement mis de cĂŽtĂ© et un nouveau est créé.

La rĂ©ponse est gĂ©nĂ©rale : pour chaque plage locale - disons, pour chaque jour - quelque part jusqu'Ă  un million de valeurs uniques. Une faible cardinalitĂ© est efficace. Ensuite, il y aura simplement une solution de secours, dans laquelle de nombreux dictionnaires diffĂ©rents seront utilisĂ©s, et non un seul. Cela fonctionnera Ă  peu prĂšs de la mĂȘme maniĂšre qu'une colonne de chaĂźnes ordinaire, peut-ĂȘtre un peu moins efficace, mais il n'y aura pas de dĂ©gradation sĂ©rieuse des performances.

Quelles sont les meilleures pratiques pour effectuer une recherche en texte intĂ©gral dans un tableau de cinq milliards de lignes ?

Il existe diffĂ©rentes rĂ©ponses. La premiĂšre est de dire que ClickHouse n’est pas un moteur de recherche en texte intĂ©gral. Il existe des systĂšmes spĂ©ciaux pour cela, par exemple ElasticSearch Đž Sphinx. Cependant, je vois de plus en plus de gens dire qu'ils passent d'Elasticsearch Ă  ClickHouse.

Pourquoi cela arrive-t-il? Ils expliquent cela par le fait qu'Elasticsearch cesse de faire face Ă  la charge sur certains volumes, Ă  commencer par la construction des index. Les index deviennent trop encombrants et si vous transfĂ©rez simplement les donnĂ©es vers ClickHouse, il s'avĂšre qu'elles sont stockĂ©es plusieurs fois plus efficacement en termes de volume. Dans le mĂȘme temps, les requĂȘtes de recherche n'Ă©taient souvent pas telles qu'il Ă©tait nĂ©cessaire de trouver une expression dans l'ensemble du volume de donnĂ©es, en tenant compte de la morphologie, mais complĂštement diffĂ©rente. Par exemple, recherchez une sous-sĂ©quence d'octets dans les journaux des derniĂšres heures.

Dans ce cas, vous crĂ©ez un index dans ClickHouse dont le premier champ sera la date et l'heure. Et la plus grande limite de donnĂ©es sera basĂ©e sur la plage de dates. En rĂšgle gĂ©nĂ©rale, dans la plage de dates sĂ©lectionnĂ©e, il est dĂ©jĂ  possible d'effectuer une recherche en texte intĂ©gral, mĂȘme en utilisant la mĂ©thode de force brute en utilisant like. L'opĂ©rateur similaire dans ClickHouse est l'opĂ©rateur similaire le plus efficace que vous puissiez trouver. Si vous trouvez quelque chose de mieux, dites-le-moi.

Mais quand mĂȘme, c’est comme une analyse complĂšte. Et l'analyse complĂšte peut ĂȘtre lente non seulement sur le processeur, mais Ă©galement sur le disque. Si du coup vous disposez d'un tĂ©raoctet de donnĂ©es par jour et que vous recherchez un mot pendant la journĂ©e, vous devrez alors scanner le tĂ©raoctet. Et c'est probablement sur des disques durs ordinaires, et Ă  la fin, ils seront chargĂ©s de telle maniĂšre que vous ne pourrez pas accĂ©der Ă  ce serveur via SSH.

Dans ce cas, je suis prĂȘt Ă  proposer encore une petite astuce. C'est expĂ©rimental – cela pourrait fonctionner, ou non. ClickHouse dispose d'index de texte intĂ©gral sous la forme de filtres trigrammes Bloom. Nos collĂšgues d'Arenadata ont dĂ©jĂ  essayĂ© ces index, et ils fonctionnent souvent exactement comme prĂ©vu.

Afin de les utiliser correctement, vous devez bien comprendre exactement leur fonctionnement : ce qu'est un filtre trigramme Bloom et comment choisir sa taille. Je peux dire qu'ils aideront pour les requĂȘtes sur certaines phrases rares, sous-chaĂźnes rarement trouvĂ©es dans les donnĂ©es. Dans ce cas, les sous-plages seront sĂ©lectionnĂ©es par index et moins de donnĂ©es seront lues.

Récemment, ClickHouse a ajouté des fonctions encore plus avancées pour la recherche en texte intégral. Il s'agit, tout d'abord, d'une recherche d'un groupe de sous-chaßnes à la fois en un seul passage, y compris des options sensibles à la casse, insensibles à la casse, avec prise en charge d'UTF-8 ou uniquement d'ASCII. Choisissez celui le plus efficace dont vous avez besoin.

La recherche de plusieurs expressions réguliÚres en un seul passage est également apparue. Vous n'avez pas besoin d'écrire X comme une sous-chaßne ou X comme une autre sous-chaßne. Vous écrivez tout de suite et tout se fait le plus efficacement possible.

TroisiÚmement, il existe désormais une recherche approximative des expressions rationnelles et une recherche approximative des sous-chaßnes. Si quelqu'un a mal orthographié un mot, la correspondance maximale sera recherchée.

Quelle est la meilleure façon d’organiser l’accùs à ClickHouse pour un grand nombre d’utilisateurs ?

Dites-nous comment organiser au mieux l'accĂšs pour un grand nombre de consommateurs et d'analystes. Comment former une file d'attente, prioriser le maximum de requĂȘtes simultanĂ©es et avec quels outils ?

Si le cluster est suffisamment grand, alors une bonne solution serait d'augmenter deux serveurs supplĂ©mentaires, qui deviendront un point d'entrĂ©e pour les analystes. Autrement dit, n'autorisez pas les analystes Ă  accĂ©der Ă  des fragments spĂ©cifiques du cluster, mais crĂ©ez simplement deux serveurs vides, sans donnĂ©es, et configurez les droits d'accĂšs sur ceux-ci. Dans ce cas, les paramĂštres utilisateur pour les requĂȘtes distribuĂ©es sont transfĂ©rĂ©s vers des serveurs distants. Autrement dit, vous configurez tout sur ces deux serveurs et les paramĂštres ont un effet sur l'ensemble du cluster.

En principe, ces serveurs ne disposent pas de donnĂ©es, mais la quantitĂ© de RAM qu'ils contiennent est trĂšs importante pour exĂ©cuter les requĂȘtes. Le disque peut Ă©galement ĂȘtre utilisĂ© pour des donnĂ©es temporaires si l'agrĂ©gation externe ou le tri externe est activĂ©.

Il est important d'examiner les paramÚtres associés à toutes les limites possibles. Si je vais maintenant sur le cluster Yandex.Metrica en tant qu'analyste et pose une demande sélectionner le nombre de hits, alors je recevrai immédiatement une exception indiquant que je ne peux pas exécuter la demande. Le nombre maximum de lignes que je suis autorisé à analyser est de cent milliards, et au total il y en a cinquante mille milliards dans une table du cluster. C'est la premiÚre limite.

Disons que je supprime la limite de lignes et que je rĂ©exĂ©cute la requĂȘte. Ensuite, je verrai l'exception suivante : paramĂštre activĂ© indice de force par date. Je ne peux pas terminer la requĂȘte si je n'ai pas spĂ©cifiĂ© de plage de dates. Vous n'avez pas besoin de compter sur des analystes pour le spĂ©cifier manuellement. Un cas typique est celui oĂč une plage de dates est Ă©crite oĂč la date de l'Ă©vĂ©nement se situe entre la semaine. Et puis ils ont simplement spĂ©cifiĂ© une parenthĂšse au mauvais endroit, et au lieu de et, il s'est avĂ©rĂ© ĂȘtre ou - ou une correspondance d'URL. S'il n'y a pas de limite, il explorera la colonne URL et gaspillera simplement une tonne de ressources.

De plus, ClickHouse dispose de deux paramĂštres de prioritĂ©. Malheureusement, ils sont trĂšs primitifs. L'un s'appelle simplement prioritĂ©. Si la prioritĂ© ≠ 0 et que des requĂȘtes avec une certaine prioritĂ© sont en cours d'exĂ©cution, mais qu'une requĂȘte avec une valeur de prioritĂ© infĂ©rieure Ă , ce qui signifie une prioritĂ© plus Ă©levĂ©e, est en cours d'exĂ©cution, alors une requĂȘte avec une valeur de prioritĂ© supĂ©rieure, ce qui signifie une prioritĂ© plus faible. , est simplement suspendu et ne fonctionnera pas du tout pendant cette pĂ©riode.

Il s'agit d'un paramĂštre trĂšs rudimentaire qui ne convient pas aux cas oĂč le cluster a une charge constante. Mais si vous avez des requĂȘtes courtes et en rafale qui sont importantes et que le cluster est pour la plupart inactif, cette configuration est adaptĂ©e.

Le prochain paramĂštre de prioritĂ© est appelĂ© PrioritĂ© du thread du systĂšme d'exploitationCela permet simplement de dĂ©finir la valeur optimale pour le planificateur pour tous les threads d'exĂ©cution des requĂȘtes. LinuxC'est un peu bancal, mais ça fonctionne. Si vous dĂ©finissez la valeur « nice » Ă  sa valeur minimale (la plus Ă©levĂ©e, donc la prioritĂ© la plus basse) et que vous dĂ©finissez les requĂȘtes Ă  haute prioritĂ© Ă  -19, les requĂȘtes Ă  basse prioritĂ© consommeront environ quatre fois moins de ressources CPU que celles Ă  haute prioritĂ©.

Vous devez Ă©galement configurer la durĂ©e maximale d'exĂ©cution de la requĂȘte, par exemple cinq minutes. La vitesse minimale d'exĂ©cution des requĂȘtes est la chose la plus cool. Ce paramĂštre existe depuis longtemps, et il faut non seulement affirmer que ClickHouse ne ralentit pas, mais aussi le forcer.

Imaginez, vous configurez : si une requĂȘte traite moins d'un million de lignes par seconde, vous ne pouvez pas le faire. Cela dĂ©shonore notre rĂ©putation, notre bonne base de donnĂ©es. Interdisons simplement cela. Il existe en fait deux paramĂštres. L'un s'appelle vitesse d'exĂ©cution minimale - en lignes par seconde, et la seconde est appelĂ©e timeout avant de vĂ©rifier la vitesse d'exĂ©cution min - quinze secondes par dĂ©faut. Autrement dit, quinze secondes sont possibles, puis, si c'est lent, lancez simplement une exception et abandonnez la demande.

Vous devez Ă©galement mettre en place des quotas. ClickHouse dispose d'une fonction de quota intĂ©grĂ©e qui compte la consommation de ressources. Mais, malheureusement, pas de ressources matĂ©rielles telles que le processeur, les disques, mais logiques - le nombre de requĂȘtes traitĂ©es, de lignes et d'octets lus. Et vous pouvez configurer, par exemple, un maximum de cent requĂȘtes en cinq minutes et mille requĂȘtes par heure.

Pourquoi c'est important? Parce que certaines requĂȘtes d'analyse seront effectuĂ©es manuellement directement Ă  partir du client ClickHouse. Et tout ira bien. Mais si vous avez des analystes avancĂ©s dans votre entreprise, ils Ă©criront un script, et il peut y avoir une erreur dans le script. Et cette erreur entraĂźnera l’exĂ©cution de la requĂȘte dans une boucle infinie. C’est contre cela que nous devons nous protĂ©ger.

Est-il possible de donner les rĂ©sultats d’une requĂȘte Ă  dix clients ?

Nous avons plusieurs utilisateurs qui aiment soumettre des demandes trĂšs volumineuses au mĂȘme moment. La demande est volumineuse et, en principe, exĂ©cutĂ©e rapidement, mais du fait qu'il existe de nombreuses demandes de ce type en mĂȘme temps, cela devient trĂšs pĂ©nible. Est-il possible d'exĂ©cuter une seule fois la mĂȘme requĂȘte, arrivĂ©e dix fois de suite, et de donner le rĂ©sultat Ă  dix clients ?

Le problĂšme est que nous n’avons pas les rĂ©sultats du cache ou du cache des donnĂ©es intermĂ©diaires. Il existe un cache de pages du systĂšme d'exploitation, qui vous empĂȘchera de lire Ă  nouveau les donnĂ©es du disque, mais, malheureusement, les donnĂ©es seront toujours dĂ©compressĂ©es, dĂ©sĂ©rialisĂ©es et retraitĂ©es.

Je voudrais d'une maniĂšre ou d'une autre Ă©viter cela, soit en mettant en cache les donnĂ©es intermĂ©diaires, soit en alignant des requĂȘtes similaires dans une sorte de file d'attente et en ajoutant un cache de rĂ©sultats. Nous avons actuellement une pull request en dĂ©veloppement qui ajoute un cache de requĂȘtes, mais uniquement pour les sous-requĂȘtes dans les sections in et join - c'est-Ă -dire que la solution est incomplĂšte.

Cependant, nous sommes Ă©galement confrontĂ©s Ă  une telle situation. Un exemple particuliĂšrement canonique est celui des requĂȘtes paginĂ©es. Il y a un rapport, il a plusieurs pages, et il y a une demande de limite Ă  10. Puis la mĂȘme chose, mais une limite Ă  10,10. Puis une autre page suivante. Et la question est : pourquoi compte-t-on tout cela Ă  chaque fois ? Mais il n’y a dĂ©sormais aucune solution, et il n’y a aucun moyen de l’éviter.

Il existe une solution alternative qui est placée comme side-car à cÎté de ClickHouse - Proxy ClickHouse.

Kirill Chvakov : ClickHouse Proxy dispose d'un limiteur de dĂ©bit intĂ©grĂ© et d'un cache de rĂ©sultats intĂ©grĂ©. De nombreux rĂ©glages y ont Ă©tĂ© effectuĂ©s car un problĂšme similaire Ă©tait en cours de rĂ©solution. Le proxy vous permet de limiter les requĂȘtes en les mettant en file d'attente et de configurer la durĂ©e de vie du cache des requĂȘtes. Si les demandes Ă©taient vraiment les mĂȘmes, Proxy les enverra plusieurs fois, mais ne sera envoyĂ© Ă  ClickHouse qu'une seule fois.

Nginx dispose Ă©galement d'un cache dans la version gratuite, et cela fonctionnera Ă©galement. Nginx a mĂȘme des paramĂštres selon lesquels si les demandes arrivent en mĂȘme temps, il en ralentira les autres jusqu'Ă  ce qu'une soit terminĂ©e. Mais c’est dans ClickHouse Proxy que la configuration se fait bien mieux. Il a Ă©tĂ© conçu spĂ©cifiquement pour ClickHouse, spĂ©cifiquement pour ces demandes, il est donc plus adaptĂ©. Eh bien, c’est facile Ă  installer.

Qu’en est-il des opĂ©rations asynchrones et des vues matĂ©rialisĂ©es ?

Il existe un problÚme car les opérations avec le moteur de relecture sont asynchrones : les données sont d'abord écrites, puis elles s'effondrent. Si une tablette matérialisée avec quelques agrégats vit sous le signe, alors des doublons y seront écrits. Et s'il n'y a pas de logique complexe, alors les données seront dupliquées. Que peux-tu y faire?

Il existe une solution Ă©vidente : implĂ©menter un dĂ©clencheur sur une certaine classe de matviews lors d'une opĂ©ration de rĂ©duction asynchrone. Existe-t-il des solutions miracles ou des plans pour mettre en Ɠuvre des fonctionnalitĂ©s similaires ?

Il est utile de comprendre comment fonctionne la dĂ©duplication. Ce que je vais vous dire maintenant n’est pas pertinent par rapport Ă  la question, mais juste au cas oĂč cela vaut la peine de s’en souvenir.

Lors de l'insertion dans une table rĂ©pliquĂ©e, il y a dĂ©duplication de l'intĂ©gralitĂ© des blocs insĂ©rĂ©s. Si vous rĂ©insĂ©rez le mĂȘme bloc contenant le mĂȘme nombre de mĂȘmes lignes dans le mĂȘme ordre, alors les donnĂ©es sont dĂ©dupliquĂ©es. Vous recevrez « Ok Â» en rĂ©ponse Ă  l'insertion, mais en fait, un paquet de donnĂ©es sera Ă©crit et il ne sera pas dupliquĂ©.

Ceci est nĂ©cessaire pour plus de certitude. Si vous recevez « Ok Â» lors de l'insertion, cela signifie que vos donnĂ©es ont Ă©tĂ© insĂ©rĂ©es. Si vous recevez une erreur de ClickHouse, cela signifie qu'ils n'ont pas Ă©tĂ© insĂ©rĂ©s et que vous devez rĂ©pĂ©ter l'insertion. Mais si la connexion est interrompue lors de l'insertion, vous ne savez pas si les donnĂ©es ont Ă©tĂ© insĂ©rĂ©es ou non. La seule option est de rĂ©pĂ©ter l’insertion. Si les donnĂ©es ont Ă©tĂ© rĂ©ellement insĂ©rĂ©es et que vous les avez rĂ©insĂ©rĂ©es, il y a une dĂ©duplication par bloc. Ceci est nĂ©cessaire pour Ă©viter les doublons.

Et la maniÚre dont cela fonctionne pour les vues matérialisées est également importante. Si les données ont été dédupliquées lors de leur insertion dans la table principale, elles n'iront pas non plus dans la vue matérialisée.

Maintenant à propos de la question. Votre situation est plus compliquée car vous enregistrez des doublons de lignes individuelles. Autrement dit, ce n'est pas l'intégralité du pack qui est dupliquée, mais des lignes spécifiques, et elles s'effondrent en arriÚre-plan. En effet, les données seront réduites dans la table principale, mais les données non réduites iront dans la vue matérialisée, et lors des fusions il n'arrivera rien aux vues matérialisées. Parce qu'une vue matérialisée n'est rien de plus qu'un déclencheur d'insertion. Lors d'autres opérations, il ne lui arrive rien de plus.

Et je ne peux pas te rendre heureux ici. Il vous suffit de rechercher une solution spĂ©cifique pour ce cas. Par exemple, est-il possible de le relire dans une vue matĂ©rialisĂ©e, et la mĂ©thode de dĂ©duplication pourrait fonctionner de la mĂȘme maniĂšre. Mais malheureusement, pas toujours. S’il s’agit d’une agrĂ©gation, cela ne fonctionnera pas.

Kirill Chvakov : À l’époque, nous construisions Ă©galement des bĂ©quilles. Il y a eu un problĂšme avec les impressions publicitaires, et il existe certaines donnĂ©es que nous pouvons afficher en temps rĂ©el - ce ne sont que des impressions. Ils sont rarement dupliquĂ©s, mais si cela se produit, nous les rĂ©duirons de toute façon plus tard. Et il y avait des choses qui ne pouvaient pas ĂȘtre reproduites : les clics et toute cette histoire. Mais je voulais aussi les montrer presque immĂ©diatement.

Comment ont Ă©tĂ© rĂ©alisĂ©es les vues matĂ©rialisĂ©es ? Il y avait des vues oĂč cela Ă©tait Ă©crit directement - il Ă©tait Ă©crit dans des donnĂ©es brutes et Ă©crit dans des vues. LĂ , Ă  un moment donnĂ©, les donnĂ©es ne sont pas trĂšs correctes, elles sont dupliquĂ©es, etc. Et il y a une deuxiĂšme partie du tableau, oĂč elles ressemblent exactement aux vues matĂ©rialisĂ©es, c'est-Ă -dire qu'elles ont une structure absolument identique. De temps en temps, nous recalculons les donnĂ©es, comptons les donnĂ©es sans doublons, Ă©crivons dans ces tables.

Nous avons parcouru l'API - cela ne fonctionnera pas manuellement dans ClickHouse. Et l'API regarde : quand j'ai la date du dernier ajout Ă  la table, oĂč il est garanti que les donnĂ©es correctes ont dĂ©jĂ  Ă©tĂ© calculĂ©es, et elle fait une requĂȘte Ă  une table et Ă  une autre table. De l'une, la demande sĂ©lectionne jusqu'Ă  un certain temps et de l'autre, elle obtient ce qui n'a pas encore Ă©tĂ© calculĂ©. Et cela fonctionne, mais pas uniquement via ClickHouse.

Si vous disposez d'une sorte d'API - pour les analystes, pour les utilisateurs - alors, en principe, c'est une option. Vous comptez toujours, vous comptez toujours. Cela peut ĂȘtre fait une fois par jour ou Ă  un autre moment. Vous choisissez vous-mĂȘme une plage dont vous n'avez pas besoin et qui n'est pas critique.

ClickHouse a beaucoup de journaux. Comment puis-je voir tout ce qui arrive au serveur d’un seul coup d’Ɠil ?

ClickHouse possĂšde un trĂšs grand nombre de logs diffĂ©rents, et ce nombre est en augmentation. Dans les nouvelles versions, certains d'entre eux sont mĂȘme activĂ©s par dĂ©faut ; dans les anciennes versions, ils doivent ĂȘtre activĂ©s lors de la mise Ă  jour. Pourtant, ils sont de plus en plus nombreux. En fin de compte, j'aimerais voir ce qui se passe avec mon serveur maintenant, peut-ĂȘtre sur une sorte de tableau de bord rĂ©capitulatif.

Avez-vous une Ă©quipe ClickHouse, ou les Ă©quipes de vos amis, qui prennent en charge certaines fonctionnalitĂ©s de tableaux de bord prĂȘts Ă  l'emploi qui afficheraient ces journaux comme un produit fini ? En fin de compte, il suffit de consulter les journaux dans ClickHouse. Mais ce serait trĂšs cool s'il Ă©tait dĂ©jĂ  prĂ©parĂ© sous la forme d'un tableau de bord. J'en prendrais un coup de pied.

Il existe des tableaux de bord, mĂȘme s'ils ne sont pas standardisĂ©s. Dans notre entreprise, environ 60 Ă©quipes utilisent ClickHouse, et le plus Ă©trange est que beaucoup d'entre elles ont des tableaux de bord qu'elles ont créés elles-mĂȘmes, et lĂ©gĂšrement diffĂ©rents. Certaines Ă©quipes utilisent une installation interne de Yandex.Cloud. Il existe quelques rapports prĂȘts Ă  l'emploi, mais pas tous ceux nĂ©cessaires. D'autres ont le leur.

Mes collĂšgues de Metrica ont leur propre tableau de bord dans Grafana, et j'ai le mien pour leur cluster. Je regarde des choses comme le cache hit pour le cache serif. Et ce qui est encore plus difficile, c'est que nous utilisons des outils diffĂ©rents. J'ai créé mon tableau de bord Ă  l'aide d'un trĂšs ancien outil appelĂ© Graphite-web. Il est complĂštement laid. Et je l'utilise toujours de cette façon, mĂȘme si Grafana serait probablement plus pratique et plus beau.

La base des tableaux de bord est la mĂȘme. Il s'agit de mĂ©triques systĂšme pour le cluster : CPU, mĂ©moire, disque, rĂ©seau. Autres - nombre de requĂȘtes simultanĂ©es, nombre de fusions simultanĂ©es, nombre de requĂȘtes par seconde, nombre maximum de morceaux pour les partitions de table MergeTree, dĂ©lai de rĂ©plication, taille de la file d'attente de rĂ©plication, nombre de lignes insĂ©rĂ©es par seconde, nombre de blocs insĂ©rĂ©s par seconde. C'est tout ce qui est obtenu non pas Ă  partir des journaux, mais Ă  partir des mĂ©triques.

Vladimir Kolobaev : Alexey, je voudrais le corriger un peu. Il y a Grafana. Grafana dispose d'une source de donnĂ©es, qui est ClickHouse. Autrement dit, je peux faire des demandes de Grafana directement Ă  ClickHouse. ClickHouse a un tableau avec les logs, c'est le mĂȘme pour tout le monde. En consĂ©quence, je souhaite accĂ©der Ă  cette table de journal dans Grafana et voir les requĂȘtes effectuĂ©es par mon serveur. Ce serait formidable d'avoir un tableau de bord comme celui-ci.

Je l'ai fait moi-mĂȘme. Mais j'ai une question : si tout est standardisĂ© et que Grafana est utilisĂ© par tout le monde, pourquoi Yandex n'a-t-il pas un tel tableau de bord officiel ?

Kirill Chvakov : En fait, la source de donnĂ©es destinĂ©e Ă  ClickHouse prend dĂ©sormais en charge Altinity. Et je veux juste donner un vecteur indiquant oĂč creuser et qui pousser. Vous pouvez leur demander, car Yandex crĂ©e toujours ClickHouse, et non l'histoire qui l'entoure. Altinity est la principale sociĂ©tĂ© faisant actuellement la promotion de ClickHouse. Ils ne l’abandonneront pas, mais le soutiendront. Car, en principe, pour tĂ©lĂ©charger un tableau de bord sur le site Grafana, il vous suffit de vous inscrire et de le tĂ©lĂ©charger - il n'y a pas de problĂšmes particuliers.

AlexeĂŻ Milovidov : Au cours de la derniĂšre annĂ©e, ClickHouse a ajoutĂ© de nombreuses fonctionnalitĂ©s de profilage de requĂȘtes. Il existe des mĂ©triques pour chaque demande sur l'utilisation des ressources. Et tout rĂ©cemment, nous avons ajoutĂ© un profileur de requĂȘtes de niveau encore plus bas pour voir oĂč passe une requĂȘte chaque milliseconde. Mais pour utiliser cette fonctionnalitĂ©, je dois ouvrir le client console et taper une requĂȘte, que j'oublie toujours. Je l'ai sauvegardĂ© quelque part et j'oublie toujours oĂč exactement.

J'aurais aimĂ© qu'il y ait un outil qui vient de dire, voici vos requĂȘtes lourdes, regroupĂ©es par classe de requĂȘtes. J’en ai appuyĂ© sur un, et ils me disaient que c’est pour ça qu’il est lourd. Une telle solution n’existe pas actuellement. Et c'est vraiment assez Ă©trange que quand les gens me demandent : "Dites-moi, y a-t-il des tableaux de bord prĂȘts Ă  l'emploi pour Grafana ?", je rĂ©ponds : "Allez sur le site Grafana, il y a une communautĂ© "Dashboards", et il y a un tableau de bord de Dimka, il y a un tableau de bord de Kostyan. Je ne sais pas ce que c’est, je ne l’ai pas utilisĂ© moi-mĂȘme.

Comment influencer les fusions pour que le serveur ne crashe pas dans le MOO ?

J'ai une table, il n'y a qu'une seule partition dans la table, c'est ReplaceingMergeTree. J'y écris des données depuis quatre ans. Je devais y apporter une modification et supprimer certaines données.

Je l'ai fait et pendant le traitement de cette demande, toute la mĂ©moire de tous les serveurs du cluster a Ă©tĂ© consommĂ©e et tous les serveurs du cluster sont entrĂ©s dans le MOO. Ensuite, ils se sont tous levĂ©s, ont commencĂ© Ă  fusionner cette mĂȘme opĂ©ration, ce bloc de donnĂ©es, et sont retombĂ©s dans le MOO. Puis ils se relevĂšrent et retombĂšrent. Et cette chose ne s'est pas arrĂȘtĂ©e.

Ensuite, il s’est avĂ©rĂ© qu’il s’agissait en fait d’un bug que les gars ont corrigĂ©. C'est trĂšs cool, merci beaucoup. Mais il restait un rĂ©sidu. Et maintenant, quand je pense Ă  faire une sorte de fusion dans le tableau, j'ai une question : pourquoi ne puis-je pas influencer ces fusions d'une maniĂšre ou d'une autre ? Par exemple, limitez-les par la quantitĂ© de RAM requise ou, en principe, par la quantitĂ© qui traitera cette table particuliĂšre.

J'ai un tableau appelĂ© « MĂ©triques », veuillez le traiter pour moi dans deux fils de discussion. Il n’est pas nĂ©cessaire de crĂ©er dix ou cinq fusions en parallĂšle, faites-le en deux. Je pense que j'ai assez de mĂ©moire pour deux, mais ce n'est peut-ĂȘtre pas suffisant pour en traiter dix. Pourquoi la peur demeure-t-elle ? Parce que la table s'agrandit, et qu'un jour je serai confrontĂ© Ă  une situation qui, en principe, n'est plus due Ă  un bug, mais parce que les donnĂ©es vont changer dans une telle quantitĂ© que je n'aurai tout simplement pas assez de mĂ©moire sur le serveur. Et puis le serveur plantera dans le MOO lors de la fusion. De plus, je peux annuler la mutation, mais Merji n'est plus lĂ .

Vous savez, lors de la fusion, le serveur ne tombera pas dans le MOO, car lors de la fusion, la quantité de RAM n'est utilisée que pour une petite plage de données. Ainsi, tout ira bien quelle que soit la quantité de données.

Vladimir Kolobaev : Bien. Ici, le moment est tel qu'aprĂšs la correction du bug, j'ai tĂ©lĂ©chargĂ© une nouvelle version pour moi-mĂȘme, et sur une autre table, plus petite, oĂč il y a de nombreuses partitions, j'ai effectuĂ© une opĂ©ration similaire. Et lors de la fusion, environ 100 Go de RAM ont Ă©tĂ© brĂ»lĂ©s sur le serveur. J’en avais 150 occupĂ©s, 100 mangĂ©s et il me restait une fenĂȘtre de 50 Go, donc je ne suis pas tombĂ© dans le MOO.

Qu'est-ce qui me protÚge actuellement de tomber dans le MOO s'il consomme réellement 100 Go de RAM ? Que faire si soudainement la RAM sur les fusions s'épuise ?

AlexeĂŻ Milovidov : Il existe un tel problĂšme que la consommation de RAM spĂ©cifiquement pour la fusion n'est pas limitĂ©e. Et le deuxiĂšme problĂšme est que si une sorte de fusion a Ă©tĂ© assignĂ©e, elle doit alors ĂȘtre exĂ©cutĂ©e car elle est enregistrĂ©e dans le journal de rĂ©plication. Le journal de rĂ©plication contient les actions nĂ©cessaires pour amener la rĂ©plique dans un Ă©tat cohĂ©rent. Si vous n'effectuez pas de manipulations manuelles qui annuleraient ce journal de rĂ©plication, la fusion devra ĂȘtre effectuĂ©e d'une maniĂšre ou d'une autre.

Bien sĂ»r, il ne serait pas superflu d'avoir une limitation de RAM qui protĂšge « au cas oĂč » contre le MOO. Cela n'aidera pas la fusion Ă  se terminer, elle recommencera, atteindra un certain seuil, lancera une exception, puis recommencera - rien de bon n'en sortira. Mais en principe, il serait utile d’introduire cette restriction.

Comment le pilote Golang pour ClickHouse sera-t-il dĂ©veloppĂ© ?

Le pilote Golang, écrit par Kirill Shvakov, est désormais officiellement pris en charge par l'équipe ClickHouse. Il dans le référentiel ClickHouse, il est désormais grand et réel.

Une petite remarque. Il existe un rĂ©fĂ©rentiel merveilleux et bien-aimĂ© de formes normales d’ordre infini : c’est Vertica. Ils disposent Ă©galement de leur propre pilote Python officiel, pris en charge par les dĂ©veloppeurs Vertica. Et Ă  plusieurs reprises, il est arrivĂ© que les versions de stockage et les versions de pilote divergent de maniĂšre assez spectaculaire, et le pilote Ă  un moment donnĂ© a cessĂ© de fonctionner. Et le deuxiĂšme point. Il me semble que la prise en charge de ce pilote officiel est assurĂ©e par le systĂšme "mamelon" - vous leur Ă©crivez un problĂšme, et il se bloque pour toujours.

J'ai deux questions. DĂ©sormais, le pilote Golang de Kirill est presque le moyen par dĂ©faut de communiquer depuis Golang avec ClickHouse. A moins que quelqu'un communique encore via l'interface http parce qu'il aime ça. Comment se dĂ©roulera le dĂ©veloppement de ce pilote ? Sera-t-il synchronisĂ© avec les modifications importantes apportĂ©es au rĂ©fĂ©rentiel lui-mĂȘme ? Et quelle est la procĂ©dure Ă  suivre pour examiner une question ?

Kirill Chvakov : La premiÚre est la maniÚre dont tout est organisé bureaucratiquement. Ce point n'a pas été abordé, je n'ai donc rien à répondre.

Pour rĂ©pondre Ă  la question sur le problĂšme, nous avons besoin d’un petit historique du conducteur. J'ai travaillĂ© pour une entreprise qui disposait de beaucoup de donnĂ©es. Il s’agissait d’un outil publicitaire comportant un grand nombre d’évĂ©nements qui devaient ĂȘtre stockĂ©s quelque part. Et Ă  un moment donnĂ©, ClickHouse est apparu. Nous l'avons rempli de donnĂ©es, et au dĂ©but tout allait bien, mais ClickHouse s'est ensuite Ă©crasĂ©. À ce moment-lĂ , nous avons dĂ©cidĂ© que nous n’en avions pas besoin.

Un an plus tard, nous sommes revenus à l'idée d'utiliser ClickHouse, et nous devions y écrire des données d'une maniÚre ou d'une autre. Le message d'introduction était le suivant : le matériel est trÚs faible, il y a peu de ressources. Mais nous avons toujours travaillé de cette façon et nous nous sommes donc tournés vers le protocole natif.

Puisque nous travaillions chez Go, il Ă©tait clair que nous avions besoin d’un pilote Go. Je le faisais presque Ă  temps plein – c'Ă©tait ma tĂąche professionnelle. Nous l'avons amenĂ© Ă  un certain point et, en principe, personne ne pensait que quelqu'un d'autre que nous l'utiliserait. Ensuite, CloudFlare a rencontrĂ© exactement le mĂȘme problĂšme et pendant un certain temps, nous avons travaillĂ© avec eux de maniĂšre trĂšs fluide, car ils avaient les mĂȘmes tĂąches. De plus, nous l'avons fait nous-mĂȘmes dans ClickHouse et dans le pilote.

À un moment donnĂ©, j'ai tout simplement arrĂȘtĂ© de le faire, car mon activitĂ© en termes de ClickHouse et de travail a un peu changĂ©. Les questions ne sont donc pas closes. PĂ©riodiquement, les personnes qui ont elles-mĂȘmes besoin de quelque chose s’engagent dans le rĂ©fĂ©rentiel. Ensuite, je regarde la pull request et parfois je modifie mĂȘme quelque chose moi-mĂȘme, mais cela arrive rarement.

Je veux retourner auprÚs du chauffeur. Il y a plusieurs années, lorsque tout cela a commencé, ClickHouse était également différent et doté de capacités différentes. Nous comprenons maintenant comment refaire le pilote pour qu'il fonctionne correctement. Si cela se produit, alors la version 2 sera de toute façon incompatible en raison des béquilles accumulées.

Je ne sais pas comment organiser cette affaire. Je n'ai pas beaucoup de temps moi-mĂȘme. Si certaines personnes terminent le driver, je peux les aider et leur dire quoi faire. Mais la participation active de Yandex au dĂ©veloppement du projet n'a pas encore Ă©tĂ© discutĂ©e.

AlexeĂŻ Milovidov : En fait, il n’existe pas encore de bureaucratie concernant ces conducteurs. La seule chose est qu'ils sont soumis Ă  une organisation officielle, c'est-Ă -dire que ce pilote est reconnu comme la solution officielle par dĂ©faut pour Go. Il existe d'autres pilotes, mais ils viennent sĂ©parĂ©ment.

Nous n'avons aucun développement interne pour ces pilotes. La question est de savoir si nous pouvons embaucher une personne individuelle, non pas pour ce conducteur en particulier, mais pour le développement de tous les conducteurs communautaires, ou pouvons-nous trouver quelqu'un de l'extérieur.

Le dictionnaire externe ne se charge pas aprÚs un redémarrage avec le paramÚtre lazy_load activé. Ce qu'il faut faire?

Le paramĂštre lazy_load est activĂ© et aprĂšs le redĂ©marrage du serveur, le dictionnaire ne se charge pas tout seul. Il n'est gĂ©nĂ©rĂ© qu'aprĂšs que l'utilisateur accĂšde Ă  ce dictionnaire. Et la premiĂšre fois que j'y accĂšde, cela donne une erreur. Est-il possible de charger automatiquement des dictionnaires Ă  l'aide de ClickHouse, ou devez-vous toujours contrĂŽler vous-mĂȘme leur Ă©tat de prĂ©paration afin que les utilisateurs ne reçoivent pas d'erreurs ?

Peut-ĂȘtre avons-nous une ancienne version de ClickHouse, donc le dictionnaire ne s'est pas chargĂ© automatiquement. Est-ce que cela pourrait ĂȘtre le cas ?

PremiĂšrement, les dictionnaires peuvent ĂȘtre chargĂ©s de force Ă  l'aide d'une requĂȘte dictionnaires de rechargement du systĂšme. DeuxiĂšmement, concernant l'erreur : si le dictionnaire est dĂ©jĂ  chargĂ©, les requĂȘtes fonctionneront en fonction des donnĂ©es chargĂ©es. Si le dictionnaire n'a pas encore Ă©tĂ© chargĂ©, il le sera directement lors de la requĂȘte.

Ce n’est pas trĂšs pratique pour les dictionnaires lourds. Par exemple, vous devez extraire un million de lignes de MySQL. Quelqu'un effectue une sĂ©lection simple, mais cette sĂ©lection attendra le mĂȘme million de lignes. Il y a deux solutions ici. La premiĂšre consiste Ă  dĂ©sactiver lazy_load. DeuxiĂšmement, lorsque le serveur est opĂ©rationnel, avant de lui mettre la charge, faites dictionnaire de rechargement du systĂšme ou faites simplement une requĂȘte qui utilise un dictionnaire. Ensuite, le dictionnaire sera chargĂ©. Vous devez contrĂŽler la disponibilitĂ© des dictionnaires avec le paramĂštre lazy_load activĂ©, car ClickHouse ne les charge pas automatiquement.

La rĂ©ponse Ă  la derniĂšre question est soit la version est ancienne, soit elle doit ĂȘtre dĂ©boguĂ©e.

Que faire du fait que les dictionnaires de rechargement du systĂšme ne chargent aucun des nombreux dictionnaires si au moins l'un d'entre eux plante avec une erreur ?

Il y a une autre question concernant le rechargement des dictionnaires du systĂšme. Nous avons deux dictionnaires : l'un n'est pas chargĂ©, le second est chargĂ©. Dans ce cas, les dictionnaires de rechargement du systĂšme ne chargent aucun dictionnaire et vous devez en charger un spĂ©cifique point par point par son nom Ă  l'aide du dictionnaire de rechargement du systĂšme. Est-ce Ă©galement liĂ© Ă  la version ClickHouse ?

Je veux vous rendre heureux. Ce comportement Ă©tait en train de changer. Cela signifie que si vous mettez Ă  jour ClickHouse, cela changera Ă©galement. Si vous n'ĂȘtes pas satisfait de votre comportement actuel dictionnaires de rechargement du systĂšme, mettez Ă  jour et espĂ©rons que cela changera pour le mieux.

Existe-t-il un moyen de configurer les dĂ©tails dans la configuration ClickHouse, mais de ne pas les afficher en cas d'erreurs ?

La question suivante concerne les erreurs liées au dictionnaire, à savoir les détails. Nous avons spécifié les détails de connexion dans la configuration ClickHouse pour le dictionnaire, et s'il y a une erreur, nous recevons ces détails et le mot de passe en réponse.

Nous avons rĂ©solu cette erreur en ajoutant des dĂ©tails Ă  la configuration du pilote ODBC. Existe-t-il un moyen de configurer les dĂ©tails dans la configuration ClickHouse, mais de ne pas afficher ces dĂ©tails en cas d'erreurs ?

La vraie solution ici consiste Ă  spĂ©cifier ces informations d'identification dans odbc.ini et dans ClickHouse lui-mĂȘme, Ă  spĂ©cifier uniquement le nom de la source de donnĂ©es ODBC. Cela n'arrivera pas pour les autres sources de dictionnaires - ni pour le dictionnaire avec MySQL, ni pour les autres, vous ne devriez pas voir le mot de passe lorsque vous recevez un message d'erreur. Pour ODBC, je regarderai aussi - s'il existe, il vous suffit de le supprimer.

Bonus : arriĂšre-plans pour Zoom lors de rassemblements

En cliquant sur l'image, des fonds bonus des rassemblements s'ouvriront pour les lecteurs les plus persistants. Nous éteignons le feu avec les mascottes technologiques Avito, nous discutons avec des collÚgues de la salle de l'administrateur systÚme ou du club informatique de la vieille école et nous organisons des réunions quotidiennes sous le pont sur fond de graffitis.

ClickHouse pour les utilisateurs avancés en questions et réponses

Source: habr.com

Achetez un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Achetez un hĂ©bergement web fiable avec protection DDoS, serveurs VPS et VDS | ProHoster