HighLoad++ Moscou 2018, Salle des CongrĂšs. 9 novembre, 15h00
Résumés et présentation :
Yuri Nasretdinov (VKontakte) : le rapport parlera de l'expĂ©rience de mise en Ćuvre de ClickHouse dans notre entreprise - pourquoi nous en avons besoin, combien de donnĂ©es nous stockons, comment nous les Ă©crivons, etc.

Matériaux supplémentaires:
Youri Nasretdinov : - Salut tout le monde! Je m'appelle Yuri Nasretdinov, comme je l'ai déjà présenté. Je travaille chez VKontakte. Je parlerai de la façon dont nous insérons les données dans ClickHouse à partir de notre flotte de serveurs (des dizaines de milliers).
Que sont les journaux et pourquoi les collecter ?
Ce que nous vous dirons : ce que nous avons fait, pourquoi nous avions besoin de « ClickHouse », respectivement, pourquoi nous l'avons choisi, quel type de performances vous pouvez obtenir approximativement sans rien configurer spécialement. Je vais vous parler plus en détail des tables tampons, des problÚmes que nous avons rencontrés avec elles et de nos solutions que nous avons développées à partir de l'open source - KittenHouse et Lighthouse.

Pourquoi avions-nous besoin de faire quoi que ce soit (tout va toujours bien sur VKontakte, n'est-ce pas ?). Nous voulions collecter des journaux de dĂ©bogage (et il y avait des centaines de tĂ©raoctets de donnĂ©es), peut-ĂȘtre qu'il serait plus pratique de calculer des statistiques ; et nous disposons d'une flotte de dizaines de milliers de serveurs Ă partir desquels tout cela doit ĂȘtre fait.

Pourquoi avons-nous dĂ©cidĂ© ? Nous avions probablement des solutions pour stocker les journaux. Ici â il existe un tel « Backend VK » public. Je recommande fortement de s'y abonner.

Que sont les journaux ? Il s'agit d'un moteur qui renvoie des tableaux vides. Les moteurs de VK sont ce que d'autres appellent des microservices. Et voici un sticker souriant (pas mal de likes). Comment ça? Eh bien, écoutez plus loin !

Que peut-on utiliser pour stocker les journaux ? Il est impossible de ne pas mentionner Hadup. Puis, par exemple, Rsyslog (stockage de ces journaux dans des fichiers). LSD. Qui sait ce qu'est le LSD ? Non, pas ce LSD. Stockez également les fichiers, respectivement. Eh bien, ClickHouse est une option étrange.
Clickhouse et concurrents : exigences et opportunités
Que voulons-nous? Nous voulons nous assurer que nous nâavons pas trop Ă nous soucier du fonctionnement, afin quâil fonctionne immĂ©diatement, de prĂ©fĂ©rence avec une configuration minimale. Nous voulons Ă©crire beaucoup et Ă©crire vite. Et nous voulons le conserver pendant toutes sortes de mois, d'annĂ©es, c'est-Ă -dire pendant longtemps. Nous voudrons peut-ĂȘtre comprendre un problĂšme avec lequel ils sont venus nous voir et nous ont dit : « Quelque chose ne fonctionne pas ici », et c'Ă©tait il y a 3 mois), et nous voulons pouvoir voir ce qui s'est passĂ© il y a 3 mois. " La compression des donnĂ©es â ce serait clairement un avantage â car elle rĂ©duit la quantitĂ© dâespace quâelle occupe.

Et nous avons une exigence tellement intéressante : nous écrivons parfois le résultat de certaines commandes (par exemple, les journaux), cela peut faire plus de 4 kilo-octets assez facilement. Et si cette chose fonctionne via UDP, alors elle n'a pas besoin de dépenser... elle n'aura pas de « surcharge » pour la connexion, et pour un grand nombre de serveurs, ce sera un plus.

Voyons ce que l'open source nous offre. PremiĂšrement, nous avons le moteur de journaux - c'est notre moteur ; En principe, il peut tout faire, il peut mĂȘme Ă©crire de longues lignes. Eh bien, il ne compresse pas les donnĂ©es de maniĂšre transparente - nous pouvons compresser nous-mĂȘmes de grandes colonnes si nous le voulons... nous ne voulons bien sĂ»r pas le faire (si possible). Le seul problĂšme est quâil ne peut donner que ce qui correspond Ă sa mĂ©moire ; Pour lire le reste, vous devez rĂ©cupĂ©rer le binlog de ce moteur et, par consĂ©quent, cela prend beaucoup de temps.

Quelles sont les autres options ? Par exemple, "Hadup". FacilitĂ© d'utilisation... Qui pense que Hadup est facile Ă mettre en place ? Bien entendu, il nây a aucun problĂšme avec lâenregistrement. Lors de la lecture, des questions se posent parfois. En principe, je dirais probablement non, surtout pour les logs. Stockage Ă long terme - bien sĂ»r, oui, compression des donnĂ©es - oui, longues chaĂźnes - il est clair que vous pouvez enregistrer. Mais enregistrer depuis un grand nombre de serveurs... Encore faut-il faire quelque chose soi-mĂȘme !
Rsyslog. En fait, nous l'avons utilisĂ© comme option de sauvegarde pour pouvoir le lire sans vider le binlog, mais il ne peut pas Ă©crire de longues lignes ; en principe, il ne peut pas Ă©crire plus de 4 kilo-octets. Vous devez effectuer vous-mĂȘme la compression des donnĂ©es de la mĂȘme maniĂšre. La lecture viendra des fichiers.

Ensuite, il y a le dĂ©veloppement « badushka » du LSD. Essentiellement identique à « Rsyslog » : il prend en charge les chaĂźnes longues, mais il ne peut pas fonctionner sur UDP et, en fait, Ă cause de cela, malheureusement, il y a pas mal de choses qui doivent ĂȘtre réécrites. LSD doit ĂȘtre repensĂ© pour pouvoir enregistrer Ă partir de dizaines de milliers de serveurs.

Et ici! Une option amusante est ElasticSearch. Comment dire? Il rĂ©ussit bien en lecture, c'est-Ă -dire qu'il lit vite, mais pas trĂšs bien en Ă©criture. PremiĂšrement, sâil compresse les donnĂ©es, il est trĂšs faible. TrĂšs probablement, une recherche complĂšte nĂ©cessite des structures de donnĂ©es plus volumineuses que le volume d'origine. Son fonctionnement est difficile et des problĂšmes surviennent souvent. Et encore une fois, pour enregistrer dans Elastic, nous devons tout faire nous-mĂȘmes.

Ici, ClickHouse est bien sĂ»r une option idĂ©ale. Le seul problĂšme est que lâenregistrement Ă partir de dizaines de milliers de serveurs pose problĂšme. Mais il y a au moins un problĂšme que nous pouvons essayer de rĂ©soudre dâune maniĂšre ou dâune autre. Et le reste du rapport porte sur ce problĂšme. Quel type de performances pouvez-vous attendre de ClickHouse ?
Comment allons-nous l'insérer ? Fusionner l'arbre
Qui dâentre vous nâa pas entendu parler ou ne connaĂźt pas « ClickHouse » ? Je dois te le dire, n'est-ce pas ? TrĂšs vite. L'insertion lĂ -bas - 1 Ă 2 gigabits par seconde, des rafales allant jusqu'Ă 10 gigabits par seconde peuvent en fait supporter cette configuration - il y a deux Xeon Ă 6 cĆurs (c'est-Ă -dire mĂȘme pas le plus puissant), 256 gigaoctets de RAM, 20 tĂ©raoctets en RAID (personne configurĂ©, paramĂštres par dĂ©faut). Alexey Milovidov, dĂ©veloppeur de ClickHouse, est probablement assis lĂ Ă pleurer parce que nous n'avons rien configurĂ© (tout a fonctionnĂ© comme ça pour nous). En consĂ©quence, une vitesse de balayage d'environ 6 milliards de lignes par seconde peut ĂȘtre obtenue si les donnĂ©es sont bien compressĂ©es. Si vous aimez % sur une chaĂźne de texte - 100 millions de lignes par seconde, cela semble assez rapide.

Comment allons-nous l'insĂ©rer ? Eh bien, vous savez que VK utilise PHP. Nous insĂ©rerons chaque travailleur PHP via HTTP dans « ClickHouse », dans la table MergeTree pour chaque enregistrement. Qui voit un problĂšme dans ce systĂšme ? Pour une raison quelconque, tout le monde nâa pas levĂ© la main. Laisse moi te dire.
PremiÚrement, il y a beaucoup de serveurs - par conséquent, il y aura beaucoup de (mauvaises) connexions. Ensuite, il est préférable d'insérer des données dans MergeTree pas plus d'une fois par seconde. Et qui sait pourquoi ? OK OK. Je vais vous en dire un peu plus à ce sujet. Une autre question intéressante est que nous ne faisons pas d'analyse, nous n'avons pas besoin d'enrichir les données, nous n'avons pas besoin de serveurs intermédiaires, nous voulons les insérer directement dans "ClickHouse" (de préférence - plus directement, mieux c'est).

Par consĂ©quent, comment se fait lâinsertion dans MergeTree ? Pourquoi est-il prĂ©fĂ©rable de ne pas l'insĂ©rer plus d'une fois par seconde ou moins souvent ? Le fait est que "ClickHouse" est une base de donnĂ©es en colonnes et trie les donnĂ©es par ordre croissant de clĂ© primaire, et lorsque vous effectuez une insertion, un nombre de fichiers est créé au moins Ă©gal au nombre de colonnes dans lesquelles les donnĂ©es sont triĂ©es. par ordre croissant de la clĂ© primaire (un rĂ©pertoire sĂ©parĂ© est créé, un ensemble de fichiers sur le disque pour chaque insertion). Ensuite, l'insertion suivante arrive, et en arriĂšre-plan, elles sont combinĂ©es en « partitions » plus grandes. Puisque les donnĂ©es sont triĂ©es, il est possible de « fusionner » deux fichiers triĂ©s sans consommer beaucoup de mĂ©moire.
Mais, comme vous pouvez le deviner, si vous Ă©crivez 10 fichiers pour chaque insertion, ClickHouse (ou votre serveur) se terminera rapidement, il est donc recommandĂ© d'insĂ©rer de gros lots. En consĂ©quence, nous nâavons jamais lancĂ© le premier projet en production. Nous en avons immĂ©diatement lancĂ© un, qui ici n°2 prĂ©sente :

Imaginez ici qu'il y ait environ un millier de serveurs sur lesquels nous avons lancé, il n'y a que PHP. Et sur chaque serveur se trouve notre agent local, que nous appelons « Kittenhouse », qui maintient une connexion avec « ClickHouse » et insÚre des données toutes les quelques secondes. InsÚre les données non pas dans MergeTree, mais dans une table tampon, qui sert précisément à éviter de les insérer directement dans MergeTree.

Travailler avec des tables tampon
Ce que c'est? Les tables tampons sont un morceau de mĂ©moire fragmentĂ©e (c'est-Ă -dire qu'elle peut y ĂȘtre insĂ©rĂ©e frĂ©quemment). Ils sont constituĂ©s de plusieurs morceaux, et chacun des morceaux fonctionne comme un tampon indĂ©pendant, et ils sont vidĂ©s indĂ©pendamment (si vous avez plusieurs morceaux dans le tampon, il y aura alors plusieurs insertions par seconde). Il est possible de lire Ă partir de ces tables - vous lisez ensuite l'union du contenu du tampon et de la table parent, mais Ă ce moment l'Ă©criture est bloquĂ©e, il est donc prĂ©fĂ©rable de ne pas lire Ă partir de lĂ . Et les tableaux de tampons affichent de trĂšs bons QPS, c'est-Ă -dire que jusqu'Ă 3 XNUMX QPS, vous n'aurez aucun problĂšme lors de l'insertion. Il est clair que si le serveur tombe en panne de courant, les donnĂ©es peuvent ĂȘtre perdues, car elles n'Ă©taient stockĂ©es qu'en mĂ©moire.

Dans le mĂȘme temps, le schĂ©ma avec un tampon complique ALTER, car vous devez d'abord supprimer l'ancienne table tampon avec l'ancien schĂ©ma (les donnĂ©es ne disparaĂźtront nulle part, car elles seront vidĂ©es avant que la table ne soit supprimĂ©e). Ensuite, vous « modifiez » la table dont vous avez besoin et crĂ©ez Ă nouveau la table tampon. Par consĂ©quent, mĂȘme s'il n'y a pas de table tampon, vos donnĂ©es ne circuleront nulle part, mais vous pouvez les avoir sur le disque au moins localement.

Quâest-ce que Kittenhouse et comment ça marche ?
Quâest-ce que KittenHouse ? Ceci est un proxy. Devinez quelle langue ? J'ai rassemblĂ© les sujets les plus en vogue dans mon rapport - "Clickhouse", Go, peut-ĂȘtre que je me souviendrai d'autre chose. Oui, câest Ă©crit en Go, parce que je ne sais pas trop Ă©crire en C, je ne veux pas.

En consĂ©quence, il maintient une connexion avec chaque serveur et peut Ă©crire en mĂ©moire. Par exemple, si nous Ă©crivons des journaux d'erreurs sur Clickhouse, alors si Clickhouse n'a pas le temps d'insĂ©rer des donnĂ©es (aprĂšs tout, si trop de donnĂ©es sont Ă©crites), alors nous ne gonflons pas la mĂ©moire - nous jetons simplement le reste. Parce que si nous Ă©crivons plusieurs gigabits par seconde dâerreurs, nous pourrons probablement en rejeter. Kittenhouse peut le faire. De plus, il peut effectuer une livraison fiable, c'est-Ă -dire Ă©crire sur le disque de la machine locale et une fois Ă chaque fois (lĂ -bas, toutes les deux secondes), il essaie de fournir les donnĂ©es de ce fichier. Et au dĂ©but, nous avons utilisĂ© le format Values ââstandard - pas un format binaire, un format texte (comme dans le SQL standard).

Mais ensuite, ceci s'est produit. Nous avons utilisĂ© une livraison fiable, Ă©crit des journaux, puis dĂ©cidĂ© (c'Ă©tait un cluster de test conditionnel)... Il a Ă©tĂ© Ă©teint pendant plusieurs heures et relancĂ©, et une insertion a commencĂ© Ă partir d'un millier de serveurs - il s'est avĂ©rĂ© que Clickhouse avait encore un "Thread sur connexion" - en consĂ©quence, dans mille connexions, une insertion active entraĂźne une charge moyenne sur le serveur d'environ un millier et demi. Ătonnamment, le serveur a acceptĂ© les demandes, mais les donnĂ©es ont quand mĂȘme Ă©tĂ© insĂ©rĂ©es aprĂšs un certain temps ; mais c'Ă©tait trĂšs difficile pour le serveur de le servir.
Ajouter nginx
Une telle solution pour le modĂšle Thread par connexion est nginx. Nous avons installĂ© nginx devant Clickhouse, mis en place en mĂȘme temps un Ă©quilibrage pour deux rĂ©pliques (notre vitesse d'insertion a augmentĂ© de 2 fois, mĂȘme si ce n'est pas un fait que cela devrait ĂȘtre le cas) et limitĂ© le nombre de connexions Ă Clickhouse, au en amont et, par consĂ©quent, plus de 50 connexions, il semble inutile d'insĂ©rer.

Ensuite, nous avons rĂ©alisĂ© que ce schĂ©ma prĂ©sentait gĂ©nĂ©ralement des inconvĂ©nients, car nous n'avons ici qu'un seul nginx. En consĂ©quence, si ce nginx plante, malgrĂ© la prĂ©sence de rĂ©pliques, nous perdons des donnĂ©es ou, du moins, n'Ă©crivons nulle part. C'est pourquoi nous avons créé notre propre Ă©quilibrage de charge. Nous avons Ă©galement rĂ©alisĂ© que "Clickhouse" Ă©tait toujours adaptĂ© aux journaux, et le "dĂ©mon" a Ă©galement commencĂ© Ă Ă©crire ses journaux dans "Clickhouse" - trĂšs pratique, pour ĂȘtre honnĂȘte. Nous l'utilisons encore pour d'autres « dĂ©mons ».

Ensuite, nous avons découvert ce problÚme intéressant : si vous utilisez une méthode d'insertion non standard en mode SQL, cela force un analyseur SQL à part entiÚre basé sur AST, ce qui est assez lent. En conséquence, nous avons ajouté des paramÚtres pour garantir que cela ne se produise jamais. Nous avons effectué un équilibrage de charge et des contrÎles de santé, de sorte que si l'un d'eux meurt, nous laissons toujours les données. Nous avons maintenant un grand nombre de tables dont nous avons besoin pour avoir différents clusters Clickhouse. Et nous avons également commencé à réfléchir à d'autres utilisations - par exemple, nous voulions écrire des journaux à partir de modules nginx, mais ils ne savent pas comment communiquer avec notre RPC. Eh bien, j'aimerais leur apprendre à envoyer au moins d'une maniÚre ou d'une autre - par exemple, recevoir des événements sur localhost via UDP, puis les transmettre à Clickhouse.
Ă un pas de la solution
Le schĂ©ma final a commencĂ© Ă ressembler Ă ceci (la quatriĂšme version de ce schĂ©ma) : sur chaque serveur devant Clickhouse il y a nginx (sur le mĂȘme serveur) et il transmet simplement les requĂȘtes Ă localhost avec une limite sur le nombre de connexions de 50 piĂšces. Et ce systĂšme fonctionnait dĂ©jĂ assez bien, tout allait plutĂŽt bien avec.

Nous avons vĂ©cu ainsi pendant environ un mois. Tout le monde Ă©tait content, ils ont ajoutĂ© des tables, ils ont ajoutĂ©, ils ont ajoutĂ©... En gĂ©nĂ©ral, il s'est avĂ©rĂ© que la façon dont nous avons ajoutĂ© les tables tampons n'Ă©tait pas trĂšs optimale (disons-le ainsi). Nous avons rĂ©alisĂ© 16 piĂšces dans chaque tableau et un intervalle de flash de quelques secondes ; nous avions 20 tables et chaque table recevait 8 insertions par seconde - et c'est Ă ce moment-lĂ que « Clickhouse » a commencĂ©... les enregistrements ont commencĂ© Ă ralentir. Ils ne sont mĂȘme pas passĂ©s par lĂ ... Nginx par dĂ©faut avait une chose tellement intĂ©ressante que si les connexions se terminaient en amont, alors il renvoyait simplement « 502 » Ă toutes les nouvelles requĂȘtes.

Et ici nous avons (je viens de regarder les journaux dans Clickhouse lui-mĂȘme) environ un demi pour cent des demandes ont Ă©chouĂ©. En consĂ©quence, l'utilisation du disque Ă©tait Ă©levĂ©e et de nombreuses fusions ont eu lieu. Eh bien, qu'est-ce que j'ai fait ? Naturellement, je nâai pas pris la peine de comprendre pourquoi exactement la connexion et lâamont se sont terminĂ©s.
Remplacer nginx par un proxy inverse
J'ai dĂ©cidĂ© que nous devions gĂ©rer cela nous-mĂȘmes, nous n'avions pas besoin de laisser nginx s'en charger - nginx ne sait pas quelles tables il y a dans Clickhouse, et j'ai remplacĂ© nginx par un proxy inverse, que j'ai Ă©galement Ă©crit moi-mĂȘme.

Que fait-il? Il fonctionne sur la base de la bibliothĂšque fasthttp « goshnoy », c'est-Ă -dire rapide, presque aussi rapide que nginx. DĂ©solĂ©, Igor, si vous ĂȘtes prĂ©sent ici (note : Igor Sysoev est un programmeur russe qui a créé le serveur web nginx). Il peut comprendre de quel type de requĂȘtes il s'agit â INSERT ou SELECT â en consĂ©quence, il contient diffĂ©rents pools de connexions pour diffĂ©rents types de requĂȘtes.

Ainsi, mĂȘme si nous n'avons pas le temps de terminer les demandes d'insertion, les « sĂ©lections » passeront, et vice versa. Et il regroupe les donnĂ©es dans des tables tampon - avec un petit tampon : s'il y avait des erreurs, des erreurs de syntaxe, etc. - afin qu'elles n'affectent pas beaucoup le reste des donnĂ©es, car lorsque nous les insĂ©rons simplement dans des tables tampon, nous il y avait un petit "bachi", et toutes les erreurs de syntaxe seulement affectaient ce petit morceau; et ici, ils affecteront dĂ©jĂ un grand tampon. Petit correspond Ă 1 mĂ©gaoctet, c'est-Ă -dire pas si petit.

L'insertion d'une synchronisation et le remplacement essentiellement de nginx font essentiellement la mĂȘme chose que nginx faisait auparavant - vous n'avez pas besoin de changer le "Kittenhouse" local pour cela. Et comme il utilise fasthttp, il est trĂšs rapide : vous pouvez effectuer plus de 100 XNUMX requĂȘtes par seconde pour des insertions uniques via un proxy inverse. ThĂ©oriquement, vous pouvez insĂ©rer une ligne Ă la fois dans le proxy inverse Kittenhouse, mais bien sĂ»r, nous ne le faisons pas.

Le schĂ©ma a commencĂ© Ă ressembler Ă ceci : « Kittenhouse », le proxy inverse regroupe de nombreuses requĂȘtes dans des tables et, Ă leur tour, les tables tampon les insĂšrent dans les principales.
Killer est une solution temporaire, Kitten est permanent
C'est un problĂšme intĂ©ressant... L'un d'entre vous a-t-il utilisĂ© fasthttp ? Qui a utilisĂ© fasthttp avec les requĂȘtes POST ? Cela n'aurait probablement pas dĂ» ĂȘtre fait, car cela met en mĂ©moire tampon le corps de la requĂȘte par dĂ©faut et la taille de notre tampon a Ă©tĂ© dĂ©finie sur 16 mĂ©gaoctets. L'insertion a cessĂ© de suivre Ă un moment donnĂ© et des morceaux de 16 mĂ©gaoctets ont commencĂ© Ă arriver des dizaines de milliers de serveurs, et ils ont tous Ă©tĂ© mis en mĂ©moire tampon avant d'ĂȘtre envoyĂ©s Ă Clickhouse. En consĂ©quence, la mĂ©moire s'est Ă©puisĂ©e, le Out-Of-Memory Killer est venu et a tuĂ© le proxy inverse (ou « Clickhouse », qui pourrait thĂ©oriquement « manger » plus que le proxy inverse). Le cycle s'est rĂ©pĂ©tĂ©. Ce nâest pas un problĂšme trĂšs agrĂ©able. Bien que nous ne soyons tombĂ©s dessus qu'aprĂšs plusieurs mois de fonctionnement.
Ce que j'ai fait? Encore une fois, je n'aime pas vraiment comprendre ce qui s'est passĂ© exactement. Je pense qu'il est assez Ă©vident que vous ne devriez pas mettre en mĂ©moire tampon. Je n'ai pas pu patcher fasthttp, mĂȘme si j'ai essayĂ©. Mais j'ai trouvĂ© un moyen de faire en sorte qu'il n'y ait pas besoin de patcher quoi que ce soit, et j'ai trouvĂ© ma propre mĂ©thode en HTTP - je l'ai appelĂ©e KITTEN. Eh bien, c'est logique - "VK", "Chaton"... Quoi d'autre ?..

Si une requĂȘte parvient au serveur avec la mĂ©thode Kitten, alors le serveur doit rĂ©pondre « miaou » - logiquement. S'il rĂ©pond Ă cela, alors on considĂšre qu'il comprend ce protocole, puis j'intercepte la connexion (fasthttp a une telle mĂ©thode), et la connexion passe en mode « brut ». Pourquoi en ai-je besoin ? Je souhaite contrĂŽler la maniĂšre dont la lecture Ă partir des connexions TCP se produit. TCP a une propriĂ©tĂ© merveilleuse : si personne ne lit de l'autre cĂŽtĂ©, alors l'Ă©criture commence Ă attendre et la mĂ©moire n'est pas particuliĂšrement dĂ©pensĂ©e pour cela.
Et donc j'ai lu environ 50 clients Ă la fois (sur cinquante car cinquante devraient certainement suffire, mĂȘme si le tarif vient d'un autre DC)... La consommation a diminuĂ© avec cette approche au moins 20 fois, mais moi, pour ĂȘtre honnĂȘte , je n'ai pas pu mesurer exactement quelle heure, car c'est dĂ©jĂ inutile (c'est dĂ©jĂ atteint le niveau d'erreur). Le protocole est binaire, c'est-Ă -dire qu'il contient le nom et les donnĂ©es de la table ; il n'y a pas d'en-tĂȘte http, donc je n'ai pas utilisĂ© de socket Web (je n'ai pas besoin de communiquer avec les navigateurs - j'ai créé un protocole qui rĂ©pond Ă nos besoins). Et tout s'est bien passĂ© pour lui.
La table tampon est triste
RĂ©cemment, nous sommes tombĂ©s sur une autre fonctionnalitĂ© intĂ©ressante des tables tampon. Et ce problĂšme est dĂ©jĂ bien plus douloureux que les autres. Imaginons cette situation : vous utilisez dĂ©jĂ activement Clickhouse, vous disposez de dizaines de serveurs Clickhouse, et vous avez des requĂȘtes qui sont trĂšs longues Ă lire (disons, plus de 60 secondes) ; et vous venez faire Alter Ă ce moment-lĂ ... En attendant, les « sĂ©lections » qui ont commencĂ© avant « Alter » ne seront pas incluses dans ce tableau, « Alter » ne dĂ©marrera pas - probablement certaines caractĂ©ristiques du fonctionnement de « Clickhouse » dans cet endroit. Peut-ĂȘtre que cela peut ĂȘtre corrigĂ© ? Ou est-ce impossible ?

En gĂ©nĂ©ral, il est clair qu'en rĂ©alitĂ© ce n'est pas un si gros problĂšme, mais avec les tables tampons, cela devient plus pĂ©nible. Parce que, si, disons, votre « Alter » expire (et il peut expirer sur un autre hĂŽte - pas sur le vĂŽtre, mais sur une rĂ©plique, par exemple), alors... Vous avez supprimĂ© la table tampon, votre « Alter » ( ou un autre hĂŽte) a expirĂ©. puis une erreur « Alter » s'est produite) - vous devez toujours vous assurer que les donnĂ©es continuent d'ĂȘtre Ă©crites : vous recrĂ©ez les tables tampon (selon le mĂȘme schĂ©ma que la table parent), puis « Alter » passe, se termine aprĂšs tout, et le tampon dans lequel la table commence Ă diffĂ©rer du schĂ©ma de celui du parent. Selon ce qu'Ă©tait le "Alter", l'insertion peut ne plus aller dans cette table tampon - c'est trĂšs triste.

Il existe Ă©galement un tel signe (peut-ĂȘtre que quelqu'un l'a remarquĂ©) - il s'appelle query_thread_log dans les nouvelles versions de Clickhouse. Par dĂ©faut, dans certaines versions, il y en avait un. Ici, nous avons accumulĂ© 840 millions d'enregistrements en quelques mois (100 gigaoctets). Cela est dĂ» au fait que des « inserts » y ont Ă©tĂ© Ă©crits (peut-ĂȘtre que maintenant, d'ailleurs, ils ne sont pas Ă©crits). Comme je vous l'ai dit, nos « inserts » sont petits - nous avons eu beaucoup d'« inserts » dans les tables tampons. Il est clair que ceci est dĂ©sactivĂ© - je vous dis juste ce que j'ai vu sur notre serveur. Pourquoi? C'est un autre argument contre l'utilisation de tables tampon ! Spotty est trĂšs triste.

Qui savait que ce type s'appelait Spotty ? Les employés de VK ont levé la main. D'ACCORD.
à propos des projets de « KitttenHouse »
Habituellement, les plans ne sont pas partagĂ©s, n'est-ce pas ? Du coup, vous ne les remplirez pas et vous ne paraĂźtrez plus trĂšs bien aux yeux des autres. Mais je prends le risque ! Nous voulons faire ce qui suit : les tables tampons, me semble-t-il, sont toujours une bĂ©quille et nous devons tamponner nous-mĂȘmes l'insertion. Mais nous ne voulons toujours pas le mettre en mĂ©moire tampon sur le disque, nous allons donc mettre en mĂ©moire tampon l'insertion.

En conséquence, lorsqu'une "insertion" est effectuée, elle ne sera plus synchrone - elle fonctionnera déjà comme une table tampon, s'insérera dans la table parent (enfin, un jour plus tard) et signalera via un canal séparé quelles insertions ont réussi et lesquelles ne pas avoir.

Pourquoi ne puis-je pas quitter l'insertion synchrone ? C'est beaucoup plus pratique. Le fait est que si vous insĂ©rez 10 100 hĂŽtes, tout va bien - vous obtiendrez un peu de chaque hĂŽte, vous y insĂ©rez une fois par seconde, tout va bien. Mais j'aimerais que ce schĂ©ma fonctionne, par exemple, Ă partir de deux machines, afin que vous puissiez tĂ©lĂ©charger Ă grande vitesse - peut-ĂȘtre pas tirer le maximum de Clickhouse, mais Ă©crire au moins XNUMX mĂ©gaoctets par seconde Ă partir d'une machine via un proxy inverse - pour cela, le schĂ©ma doit s'adapter Ă la fois aux grandes et aux petites quantitĂ©s, nous ne pouvons donc pas attendre une seconde pour chaque insertion, il doit donc ĂȘtre asynchrone. Et de la mĂȘme maniĂšre, les confirmations asynchrones devraient intervenir une fois l'insertion terminĂ©e. Nous saurons si cela a Ă©tĂ© adoptĂ© ou non.
Le plus important est que dans ce schĂ©ma, nous sachions avec certitude si l'insertion a eu lieu ou non. Imaginez cette situation : vous avez une table tampon, vous y avez Ă©crit quelque chose, puis, disons, la table est passĂ©e en mode lecture seule et a essayĂ© de vider la mĂ©moire tampon. OĂč iront les donnĂ©es ? Ils resteront dans le tampon. Mais nous ne pouvons pas en ĂȘtre sĂ»rs - et s'il y avait une autre erreur, Ă cause de laquelle les donnĂ©es ne resteront pas dans le tampon... (S'adresse Ă Alexey Milovidov, Yandex, dĂ©veloppeur ClickHouse) Ou restera-t-il ? Toujours? Alexey nous convainc que tout ira bien. Nous n'avons aucune raison de ne pas le croire. Mais quand mĂȘme : si nous nâutilisons pas de tables tampons, elles ne poseront aucun problĂšme. CrĂ©er deux fois plus de tables n'est pas non plus pratique, mĂȘme si en principe il n'y a pas de gros problĂšmes. C'est le plan.
Parlons de lecture
Parlons maintenant de lecture. Nous avons Ă©galement Ă©crit notre propre outil ici. Il semblerait, eh bien, pourquoi Ă©crire votre propre instrument ici ?... Et qui a utilisĂ© Tabix ? D'une maniĂšre ou d'une autre, peu de gens ont levĂ© la main... Et qui est satisfait de la performance de Tabix ? Eh bien, nous nâen sommes pas satisfaits et ce nâest pas trĂšs pratique pour visualiser des donnĂ©es. C'est bien pour l'analyse, mais juste pour la visualisation, ce n'est clairement pas optimisĂ©. J'ai donc Ă©crit ma propre interface.

C'est trÚs simple : il ne peut lire que des données. Il ne sait pas afficher des graphiques, il ne sait rien faire. Mais il peut montrer ce dont nous avons besoin : par exemple, combien de lignes il y a dans le tableau, combien d'espace il occupe (sans le décomposer en colonnes), c'est-à -dire qu'une interface trÚs basique est ce dont nous avons besoin.

Et cela ressemble beaucoup Ă Sequel Pro, mais uniquement rĂ©alisĂ© sur Bootstrap de Twitter et sur la deuxiĂšme version. Vous demandez : « Yuri, pourquoi sur la deuxiĂšme version ? Quelle annĂ©e? 2018 ? En gĂ©nĂ©ral, je l'ai fait il y a assez longtemps pour « Muscle » (MySQL) et j'ai juste modifiĂ© quelques lignes dans les requĂȘtes lĂ -bas, et cela a commencĂ© Ă fonctionner pour « Clickhouse », pour lequel un merci spĂ©cial ! Parce que l'analyseur est trĂšs similaire Ă celui « musculaire », et les requĂȘtes sont trĂšs similaires - trĂšs pratiques, surtout au dĂ©but.

Eh bien, il peut filtrer les tables, afficher la structure et le contenu de la table, vous permet de trier, de filtrer par colonnes, affiche la requĂȘte qui a abouti au rĂ©sultat, les lignes affectĂ©es (combien en consĂ©quence), c'est-Ă -dire le Ă©lĂ©ments de base pour visualiser les donnĂ©es. Assez rapide.

Il y a aussi un Ă©diteur. HonnĂȘtement, j'ai essayĂ© de voler l'intĂ©gralitĂ© de l'Ă©diteur de Tabix, mais je n'ai pas pu. Mais dâune maniĂšre ou dâune autre, ça marche. En principe, c'est tout.
"Clickhouse" convient aux taniĂšres
Je tiens Ă vous dire que Clickhouse, malgrĂ© tous les problĂšmes dĂ©crits, est trĂšs bien adaptĂ© aux bĂ»ches. Plus important encore, cela rĂ©sout notre problĂšme : il est trĂšs rapide et vous permet de filtrer les journaux par colonnes. En principe, les tables tampons ne fonctionnent pas bien, mais gĂ©nĂ©ralement personne ne sait pourquoi... Peut-ĂȘtre que maintenant vous savez mieux oĂč vous rencontrerez des problĂšmes.

TCP ? En gĂ©nĂ©ral, dans VK, il est d'usage d'utiliser UDP. Et quand j'utilisais TCP... Bien sĂ»r, personne ne m'a dit : « Yuri, de quoi tu parles ! Vous ne pouvez pas, vous avez besoin dâUDP. Il s'est avĂ©rĂ© que TCP n'est pas si effrayant. La seule chose est que si vous Ă©crivez des dizaines de milliers de composĂ©s actifs, vous devez les prĂ©parer un peu plus soigneusement ; mais c'est possible et assez facile.
J'ai promis de publier « Kittenhouse » et « Lighthouse » sur HighLoad SibĂ©rie si tout le monde s'abonnait Ă notre « backend VK » public... Et vous savez, tout le monde n'est pas abonnĂ©... Bien sĂ»r, je n'exigerai pas que vous vous abonniez Ă notre publique. Vous ĂȘtes encore trop nombreux, quelqu'un peut mĂȘme ĂȘtre offensĂ©, mais quand mĂȘme, abonnez-vous (et lĂ je dois faire des yeux comme ceux d'un chat). C'est . Merci beaucoup! Github est Ă nous . Avec Clickhouse vos cheveux seront doux et soyeux.

Modérateur - Amis, maintenant pour les questions. Juste aprÚs nous vous présentons le certificat d'appréciation et votre rapport en VHS.
Yuri Nasretdinov (ci-aprĂšs dĂ©nommĂ© YN) : â Comment avez-vous pu enregistrer mon reportage en VHS sâil vient de se terminer ?

ModĂ©rateur â Vous aussi, vous ne pouvez pas dĂ©terminer pleinement comment « Clickhouse » fonctionnera ou non ! Amis, 5 minutes pour les questions !
des questions
Question du public (ci-aprÚs dénommée Q) : - Bon aprÚs-midi. Merci beaucoup pour le rapport. J'ai deux questions. Je vais commencer par quelque chose de frivole : le nombre de lettres t dans le nom "Kittenhouse" dans les schémas (3, 4, 7...) affecte-t-il la satisfaction des chats ?
ON : - Quantité de quoi ?
Z : â Lettre t. Il y a trois t, quelque part autour de trois t.
ON : - Je ne l'ai pas rĂ©parĂ© ? Eh bien, bien sĂ»r que oui ! Ce sont des produits diffĂ©rents â je vous trompais tout ce temps. D'accord, je plaisante, ça n'a pas d'importance. Ah, juste ici ! Non, c'est la mĂȘme chose, j'ai fait une faute de frappe.

Z : - Merci. La deuxiÚme question est sérieuse. D'aprÚs ce que je comprends, dans Clickhouse, les tables tampons vivent exclusivement en mémoire, ne sont pas mises en mémoire tampon sur le disque et, par conséquent, ne sont pas persistantes.
ON : - Oui.
Z : â Et en mĂȘme temps, votre client met en mĂ©moire tampon sur disque, ce qui implique une certaine garantie de livraison de ces mĂȘmes logs. Mais cela n'est en aucun cas garanti chez Clickhouse. Expliquez comment s'effectue la garantie, Ă cause de quoi ?.. Voici ce mĂ©canisme plus en dĂ©tail
ON : â Oui, en thĂ©orie, il nây a pas de contradictions ici, car lorsque Clickhouse tombe, on peut le dĂ©tecter de mille maniĂšres diffĂ©rentes. Si Clickhouse plante (s'il se termine mal), vous pouvez, en gros, rembobiner un peu votre journal que vous avez Ă©crit et recommencer Ă partir du moment oĂč tout allait parfaitement bien. Disons que vous rembobinez une minute, c'est-Ă -dire que l'on considĂšre que vous avez tout vidĂ© en une minute.
Z : â Autrement dit, « Kittenhouse » tient la fenĂȘtre plus longtemps et, en cas de chute, peut la reconnaĂźtre et la rembobiner ?
ON : â Mais câest en thĂ©orie. Dans la pratique, nous ne le faisons pas, et une livraison fiable va de zĂ©ro Ă l'infini. Mais en moyenne un. Nous sommes convaincus que si Clickhouse plante pour une raison quelconque ou si les serveurs « redĂ©marrent », nous perdons un peu. Dans tous les autres cas, rien ne se passera.
Z : - Bonjour. DÚs le début, il m'a semblé que vous utiliseriez effectivement UDP dÚs le début du rapport. Vous avez http, tout ça... Et la plupart des problÚmes que vous avez décrits, si je comprends bien, ont été causés par cette solution particuliÚre...
ON : â Quâutilise-t-on TCP ?
Z : - Essentiellement oui.
ON : -Non.
Z : â Câest avec fasthttp que vous avez eu des problĂšmes, avec la connexion vous avez eu des problĂšmes. Si vous aviez simplement utilisĂ© UDP, vous auriez gagnĂ© du temps. Bon, il y aurait des problĂšmes avec les messages longs ou autre chose...
ON : - Avec quoi?

Z : â Avec des messages longs, puisqu'ils peuvent ne pas rentrer dans le MTU, autre chose... Eh bien, il peut y avoir leurs propres problĂšmes. La question est : pourquoi pas UDP ?
ON : â Je crois que les auteurs qui ont dĂ©veloppĂ© TCP/IP sont beaucoup plus intelligents que moi et savent mieux que moi comment sĂ©rialiser les paquets (pour qu'ils partent), en mĂȘme temps ajuster la fenĂȘtre d'envoi, ne pas surcharger le rĂ©seau, donner des retours sur quoi n'est pas lu, sans compter de l'autre cĂŽtĂ©... Tous ces problĂšmes, Ă mon avis, existeraient en UDP, seulement je devrais Ă©crire encore plus de code que ce que j'ai dĂ©jĂ Ă©crit pour implĂ©menter moi-mĂȘme la mĂȘme chose et trĂšs probablement pauvrement. Je n'aime mĂȘme pas vraiment Ă©crire en C, encore moins lĂ -bas...
Z : - Juste pratique ! EnvoyĂ© ok et nâattendez rien â câest complĂštement asynchrone. Une notification est revenue indiquant que tout allait bien - cela signifie qu'elle est arrivĂ©e ; Si ça ne vient pas, câest que câest mauvais.
ON : â J'ai besoin des deux â je dois pouvoir envoyer les deux avec et sans garantie de livraison. Ce sont deux scĂ©narios diffĂ©rents. Je ne dois pas perdre certains journaux ou ne pas les perdre dans des limites raisonnables.
Z : â Je ne perdrai pas de temps. Cela doit ĂȘtre discutĂ© davantage. Merci.
ModĂ©rateur â Qui a des questions â les mains vers le ciel !

Z : - Bonjour, je m'appelle Sasha. Quelque part au milieu du rapport, il y avait le sentiment qu'en plus de TCP, il était possible d'utiliser une solution toute faite - une sorte de Kafka.
ON : â Eh bien... je t'ai dit que je ne voulais pas utiliser de serveurs intermĂ©diaires, parce que... chez Kafka, il s'avĂšre que nous avons dix mille hĂŽtes ; en fait, nous en avons davantage : des dizaines de milliers dâhĂŽtes. Il peut Ă©galement ĂȘtre pĂ©nible de travailler avec Kafka sans aucun mandataire. De plus, et surtout, cela donne toujours de la « latence », cela donne des hĂŽtes supplĂ©mentaires dont vous avez besoin. Mais je ne veux pas les avoir - je veux...
Z : "Mais finalement, c'est comme ça que ça s'est passé."
ON : â Non, il nây a pas dâhĂŽtes ! Tout cela fonctionne sur les hĂŽtes Clickhouse.
Z : - Eh bien, et « Kittenhouse », ce qui est l'inverse - oĂč habite-t-il ?

ON : â Sur l'hĂŽte Clickhouse, il n'Ă©crit rien sur le disque.
Z : - Supposons.
Modérateur - Es-tu satisfait? Pouvons-nous vous donner un salaire ?
Z : - Oui, vous pouvez. En fait, il y a beaucoup de bĂ©quilles pour obtenir la mĂȘme chose, et maintenant - la rĂ©ponse prĂ©cĂ©dente sur le thĂšme TCP contredit, Ă mon avis, cette situation. Jâai juste lâimpression que tout aurait pu ĂȘtre fait Ă genoux en beaucoup moins de temps.
ON : â Et aussi pourquoi je ne voulais pas utiliser Kafka, car il y avait beaucoup de plaintes dans le chat Clickhouse Telegram selon lesquelles, par exemple, des messages de Kafka Ă©taient perdus. Pas de Kafka lui-mĂȘme, mais de l'intĂ©gration de Kafka et Clickhaus ; ou quelque chose ne s'est pas connectĂ© lĂ -bas. En gros, il faudrait alors Ă©crire un client pour Kafka. Je ne pense pas qu'il puisse y avoir de solution plus simple ou plus fiable.
Z : â Dis-moi, pourquoi nâas-tu pas essayĂ© de faire la queue ou de prendre un bus commun ? Puisque vous dites qu'avec l'asynchronie, vous pourriez envoyer les journaux eux-mĂȘmes via la file d'attente et recevoir la rĂ©ponse de maniĂšre asynchrone via la file d'attente ?

ON : â Veuillez suggĂ©rer quelles files d'attente pourraient ĂȘtre utilisĂ©es ?
Z : â N'importe lequel, mĂȘme sans garantie qu'il soit en ordre. Une sorte de Redis, RMQ...
ON : â J'ai le sentiment que Redis ne sera probablement pas en mesure de gĂ©nĂ©rer un tel volume d'insertion, mĂȘme sur un seul hĂŽte (au sens de plusieurs serveurs) qui retire Clickhouse. Je ne peux Ă©tayer cela avec aucune preuve (je ne l'ai pas comparĂ©), mais il me semble que Redis n'est pas la meilleure solution ici. En principe, ce systĂšme peut ĂȘtre considĂ©rĂ© comme une file dâattente de messages improvisĂ©e, mais qui est conçue uniquement pour « Clickhouse »
ModĂ©rateur â Yuri, merci beaucoup. Je propose de terminer ici les questions et rĂ©ponses et de dire Ă qui de ceux qui ont posĂ© la question nous donnerons le livre.
ON : â Je voudrais offrir un livre Ă la premiĂšre personne qui posera une question.
Modérateur - Merveilleux! Super! Fabuleux! Merci beaucoup!

Quelques publicitĂ©s đ
Merci de rester avec nous. Vous aimez nos articles ? Vous voulez voir du contenu plus intĂ©ressant ? Soutenez-nous en passant une commande ou en recommandant Ă vos amis, , un analogue unique des serveurs d'entrĂ©e de gamme, que nous avons inventĂ© pour vous : (disponible avec RAID1 et RAID10, jusqu'Ă 24 cĆurs et jusqu'Ă 40 Go de DDR4).
Dell R730xd 2 fois moins cher dans le centre de données Equinix Tier IV à Amsterdam ? Ici seulement aux Pays-Bas! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - à partir de 99$ ! En savoir plus
Source: habr.com
