Il y a trois ans, Viktor Tarnavski et Alexei Milovidov de Yandex sur scĂšne HighLoad++ , ont montrĂ© Ă quel point ClickHouse est bon et comment il fonctionne sans ralentir. Et sur la scĂšne voisine se trouvait Alexandre ZaĂŻtsev avec parlant de la migration vers ClickHouse une autre base de donnĂ©es analytique, concluant que ClickHouse, bien sĂ»r, c'est bon, mais pas trĂšs pratique. Quand en 2016, l'entreprise LifeStreet, oĂč travaillait alors Alexandre, a migrĂ© son systĂšme d'analytique multi-pĂ©tabytes vers ClickHouse, c'Ă©tait un captivant « chemin de briques jaunes », rempli de dangers inconnus â ClickHouse il ressemblait alors Ă un champ de mines.
Trois ans plus tard, ClickHouse c'est devenu beaucoup mieux â pendant ce temps, Alexandre a fondĂ© l'entreprise Altinity, qui non seulement aide Ă migrer vers ClickHouse des dizaines de projets, mais amĂ©liore Ă©galement le produit lui-mĂȘme avec ses collĂšgues de Yandex. Maintenant, ClickHouse ce n'est plus une promenade insouciante, mais ce n'est plus non plus un champ de mines.
Alexandre travaille sur des systÚmes distribués depuis 2003, développant de grands projets sur MySQL, Oracle. et VerticaLors de la HighLoad++ 2019, Alexandre, l'un des pionniers de l'utilisation de ClickHouse, a expliqué ce qu'est cette base de données aujourd'hui. Nous apprendrons les principales caractéristiques ClickHouse: ce qui la distingue des autres systÚmes et dans quels cas elle est plus efficace à utiliser. à l'aide d'exemples, nous explorerons les pratiques récentes et validées par des projets pour la construction de systÚmes sur ClickHouse.

Rétrospective : que s'est-il passé il y a 3 ans
Il y a trois ans, nous avons migré l'entreprise LifeStreet sur ClickHouse d'une autre base de données analytique, et la migration de l'analytique du réseau publicitaire se déroulait comme suit :
- Juin 2016. Nous avons lancé notre projet dans OpenSource, est apparu ClickHouse et c'est là que tout a commencé ;
- Août. Proof Of Concept : un grand réseau publicitaire, une infrastructure et 200-300 téraoctets de données ;Octobre. Les premiÚres données de production ;
- DĂ©cembre. Charge produit complĂšte â 10-50 milliards d'Ă©vĂ©nements par jour.
- Juin 2017. Migration réussie des utilisateurs vers
- , 2,5 pétaoctets de données sur un cluster de 60 serveurs. ClickHouseAu cours de la migration, nous avons de plus en plus compris que
c'est un bon systĂšme, avec lequel il est agrĂ©able de travailler, mais c'est un projet interne de Yandex. Donc, il y a des nuances : Yandex s'occupera d'abord de ses propres clients internes, puis de la communautĂ© et des besoins des utilisateurs externes, et ClickHouse, Ă l'Ă©poque, ne correspondait pas au niveau entreprise dans de nombreux domaines fonctionnels. C'est pourquoi, en mars 2017, nous avons fondĂ© la sociĂ©tĂ© Altinity, afin de crĂ©er ClickHouse â c'est un excellent systĂšme, avec lequel il est agrĂ©able de travailler, mais c'est un projet interne de l'entreprise Yandex. Il y a donc des nuances : Yandex s'occupera d'abord de ses propres commanditaires internes, puis des communautĂ©s et des besoins des utilisateurs externes. Ă l'Ă©poque, ClickHouse n'atteignait pas encore le niveau entreprise dans plusieurs domaines fonctionnels. C'est pourquoi, en mars 2017, nous avons fondĂ© la sociĂ©tĂ© Altinity pour faire ClickHouse encore plus rapide et pratique non seulement pour Yandex, mais aussi pour d'autres utilisateurs. Et maintenant, nous :
- formons et aidons à construire des solutions sur ClickHouse de maniÚre à ce que les clients n'aient pas d'échecs, et pour que la solution fonctionne finalement ;
- Nous assurons un support 24/7 ClickHouse-d'installations ;
- Nous développons nos propres projets écologiques ;
- Nous nous engageons activement dans le ClickHouse, répondant aux demandes des utilisateurs qui souhaitent voir certaines fonctionnalités.
Et bien sûr, nous aidons à la migration vers ClickHouse avec MySQL, Vertica, Oracle, Greenplum, Redshift et d'autres systÚmes. Nous avons participé à divers types de migrations, et toutes ont été réussies.
Pourquoi migrer vers ClickHouse
Ne ralentit pas ! C'est la principale raison. ClickHouse â une base de donnĂ©es trĂšs rapide pour diffĂ©rents scĂ©narios :
Citations aléatoires de personnes qui travaillent depuis longtemps avec ClickHouse.
Scalabilité. Avec une autre base de données, vous pouvez atteindre de bonnes performances sur un seul serveur, mais ClickHouse vous pouvez mettre à l'échelle non seulement verticalement, mais aussi horizontalement, simplement en ajoutant des serveurs. Tout ne fonctionne pas aussi parfaitement qu'on le souhaiterait, mais ça fonctionne. Vous pouvez faire croßtre le systÚme avec la croissance de l'entreprise. Il est important que nous ne soyons pas limités par une solution pour le moment et qu'il y ait toujours du potentiel pour se développer.
PortabilitĂ©. Il n'y a pas d'attachement Ă quelque chose de spĂ©cifique. Par exemple, avec Amazon Redshift il est difficile de migrer ailleurs. Mais ClickHouse peut ĂȘtre installĂ© sur votre ordinateur portable, serveur, dĂ©ployĂ© dans le cloud, aller dans Kubernetes â il n'y a pas de restrictions sur l'exploitation de l'infrastructure. C'est pratique pour tout le monde, et c'est un grand avantage dont ne peuvent se vanter de nombreuses autres bases de donnĂ©es similaires.
FlexibilitĂ©. ClickHouse ne s'arrĂȘte pas Ă quelque chose de spĂ©cifique, comme Yandex.Metrica, mais se dĂ©veloppe et est utilisĂ© dans de plus en plus de projets et d'industries diffĂ©rents. Il peut ĂȘtre Ă©largi en ajoutant de nouvelles fonctionnalitĂ©s pour rĂ©soudre de nouvelles tĂąches. Par exemple, il est considĂ©rĂ© comme inappropriĂ© de stocker des logs dans une base de donnĂ©es, donc cela a donnĂ© lieu Ă Elasticsearch. Mais grĂące Ă la flexibilitĂ© de ClickHouse, il est Ă©galement possible de stocker des logs, et c'est souvent mĂȘme mieux que dans Elasticsearch â dans ClickHouse cela nĂ©cessite 10 fois moins de matĂ©riel.
Gratuit Open Source. Il n'est nĂ©cessaire de payer pour rien. Vous n'avez pas Ă nĂ©gocier pour obtenir la permission d'installer le systĂšme sur votre ordinateur portable ou serveur. Il n'y a pas de paiements cachĂ©s. En mĂȘme temps, aucune autre technologie de base de donnĂ©es Open Source ne peut rivaliser en vitesse avec ClickHouse. MySQL, MariaDB, Greenplum â tous sont beaucoup plus lents.
Communauté, dynamisme et fun. ClickHouse une excellente communauté : des meetups, des chats et Alexey Milovidov, qui nous enthousiasme tous avec son énergie et son optimisme.
Migration vers ClickHouse
Pour passer Ă ClickHouse d'autre chose, il faut juste trois choses :
- Comprendre les limitations ClickHouse et pour quoi il n'est pas adapté.
- Exploiter les avantages de la technologie et ses points forts.
- ExpĂ©rimenter. MĂȘme en comprenant comment cela fonctionne ClickHouse, il n'est pas toujours possible de prĂ©dire quand cela sera plus rapide, quand cela sera plus lent, quand ce sera mieux et quand ce sera pire. Alors, essayez.
Le problĂšme de la migration
Il y a juste un « mais » : si vous migrez vers ClickHouse d'autre chose, alors généralement quelque chose ne se passe pas comme prévu. Nous nous sommes habitués à certaines pratiques et éléments qui fonctionnent dans notre base de données préférée. Par exemple, toute personne travaillant avec des bases de données SQLconsidÚre un ensemble de fonctionnalités comme essentielles :
- transactions ;
- contraintes ;
- consistance ;
- index ;
- UPDATE/DELETE ;;
- NULLs ;;
- millisecondes ;
- conversions automatiques de types ;
- jointures multiples ;
- partitions arbitraires ;
- outils de gestion de cluster.
Cet ensemble est requis, mais il y a trois ans, ClickHouse il n'y avait aucune de ces fonctionnalités ! Maintenant, il reste moins de la moitié de ce qui n'était pas encore réalisé : transactions, contraintes, consistance, millisecondes et conversions de types.
Et surtout â certains standards et pratiques ne fonctionnent pas ou fonctionnent diffĂ©remment de ce Ă quoi nous sommes habituĂ©s. Tout ce qui apparaĂźt dans ClickHouse est conforme à « ClickHouseClickHouse way», c'est-Ă -dire que les fonctionnalitĂ©s diffĂšrent des autres bases de donnĂ©es. Par exemple :Les index ne sĂ©lectionnent pas, mais sautent.
- ne sont pas synchrones, mais asynchrones.
- UPDATE/DELETE ; Il y a des jointures multiples, mais il n'y a pas de planificateur de requĂȘtes. Comment sont-elles alors exĂ©cutĂ©es, cela reste un mystĂšre pour les gens du monde des bases de donnĂ©es.
- Les scénarios ClickHouse
En 1960, le mathématicien américain d'origine hongroise
Wigner E. P. a écrit un article intitulé « The unreasonable effectiveness of mathematics in the natural sciences» sur le fait que le monde qui nous entoure est étrangement bien décrit par des lois mathématiques. Les mathématiques sont une science abstraite, et les lois physiques exprimées sous forme mathématique ne sont pas triviales, etil a souligné que c'est trÚs étrange. a écrit un article intitulé « De mon point de vue,
c'est tout aussi étrange. En reformulant Wigner, on pourrait dire : l'incroyable efficacité ClickHouse dans une grande variété d'applications analytiques ! ClickHouse Par exemple, prenons
un entrepĂŽt de donnĂ©es en temps rĂ©el. Real-Time Data Warehouse, dans lequel les donnĂ©es sont chargĂ©es pratiquement de maniĂšre continue. Nous souhaitons recevoir des requĂȘtes avec un dĂ©lai de seconde. S'il vous plaĂźt â utilisons ClickHouse, car c'est pour ce scĂ©nario qu'il a Ă©tĂ© conçu. ClickHouse c'est exactement ainsi qu'il est utilisĂ© non seulement dans le web, mais aussi dans l'analyse marketing et financiĂšre, AdTech, ainsi que dans Fraud detection. Dans EntrepĂŽt de donnĂ©es en temps rĂ©el une structure complexe de type « Ă©toile » ou « flocon » est utilisĂ©e, avec de nombreuses tables de JOIN (parfois multiples), et les donnĂ©es sont gĂ©nĂ©ralement stockĂ©es et modifiĂ©es dans certains systĂšmes.
Prenons un autre scĂ©nario â SĂ©ries temporelles: surveillance des dispositifs, des rĂ©seaux, statistiques d'utilisation, Internet des objets. Ici, nous rencontrons des Ă©vĂ©nements assez simples ordonnĂ©s dans le temps. ClickHouse ce qui n'Ă©tait pas initialement conçu pour cela, mais a bien fonctionnĂ©, donc de grandes entreprises l'utilisent ClickHouse comme stockage pour les informations de surveillance. Pour Ă©tudier si ClickHouse convient aux sĂ©ries temporelles, nous avons fait un benchmark basĂ© sur l'approche et les rĂ©sultats InfluxDB et TimescaleDB â bases de donnĂ©es spĂ©cialisĂ©es sĂ©ries temporelles , mĂȘme sans optimisation pour de telles tĂąches, dĂ©passe aussi sur d'autres terrains : , que ClickHousenormalement utilisĂ©e une table Ă©troite â quelques petites colonnes. La surveillance peut gĂ©nĂ©rer beaucoup de donnĂ©es, â des millions d'enregistrements par seconde, â et elles arrivent gĂ©nĂ©ralement par petites insertions (
Dans sĂ©ries temporelles streaming). C'est pourquoi un autre scĂ©nario d'insertion est nĂ©cessaire, et les requĂȘtes elles-mĂȘmes â avec leur spĂ©cificitĂ©.en temps rĂ©el Gestion des logs
. Le stockage des logs dans la base de donnĂ©es â c'est gĂ©nĂ©ralement mauvais, mais danscela peut se faire avec quelques commentaires, comme dĂ©crit ci-dessus. Beaucoup d'entreprises utilisent ClickHouse exactement pour cela. Dans ce cas, une table large et plate est utilisĂ©e, oĂč nous stockons les logs en entier (par exemple, sous forme de ClickHouse ), soit nous les dĂ©coupons en morceaux. Les donnĂ©es sont gĂ©nĂ©ralement chargĂ©es par gros lots (fichiers), et nous cherchons selon un certain champ. JSONPour chacune de ces fonctions, des bases de donnĂ©es spĂ©cialisĂ©es sont gĂ©nĂ©ralement utilisĂ©es.
un seul peut faire tout cela et si bien qu'il les dépasse en performance. Examinons maintenant en détail ClickHouse le scénario, et comment bien le « préparer » séries temporelles pour ce scénario. ClickHouse Séries temporelles
En ce moment, c'est le scénario principal pour lequel
est considĂ©rĂ© comme une solution standard. ClickHouse SĂ©ries temporelles sĂ©ries temporelles â un ensemble d'Ă©vĂ©nements ordonnĂ©s dans le temps, reprĂ©sentant les changements d'un processus au fil du temps. Par exemple, cela peut ĂȘtre la frĂ©quence cardiaque sur une journĂ©e ou le nombre de processus dans un systĂšme. Tout ce qui donne des intervalles temporels avec des mesures spĂ©cifiques est sĂ©ries temporelles:
La plupart de ce type d'événements provient de la surveillance. Il peut s'agir non seulement de la surveillance web, mais aussi d'appareils réels : voitures, systÚmes industriels, IoT, productions ou taxis sans conducteur, dans le coffre desquels Yandex place déjà ClickHouse-serveur.
Par exemple, il existe des entreprises qui collectent des donnĂ©es des navires. Toutes les quelques secondes, des capteurs d'un porte-conteneurs envoient des centaines de mesures diffĂ©rentes. Les ingĂ©nieurs les Ă©tudient, construisent des modĂšles et essaient de comprendre Ă quel point le navire est utilisĂ© efficacement, car un porte-conteneurs ne doit pas rester inactif une seconde. Toute inactivitĂ© signifie une perte d'argent, il est donc crucial de prĂ©voir la route de maniĂšre Ă ce que les arrĂȘts soient minimaux.
On observe actuellement une croissance des bases de donnĂ©es spĂ©cialisĂ©es qui mesurent sĂ©ries temporelles. Sur le site DB-Engines de diffĂ©rentes maniĂšres, et elles peuvent ĂȘtre consultĂ©es par types :
Le type Ă la croissance la plus rapide est time-series.Cependant, les bases de donnĂ©es graphiques croissent, mais time-series.elles croissent plus rapidement depuis ces derniĂšres annĂ©es. Parmi les exemples typiques de cette catĂ©gorie de bases de donnĂ©es, nous trouvons InfluxDB, Prometheus, KDB, TimescaleDB (basĂ©e sur PostgreSQL), des solutions de Amazon. ClickHouse oĂč il peut Ă©galement ĂȘtre utilisĂ©, et il est utilisĂ©. Voici quelques exemples publics.
Un des pionniers est la sociĂ©tĂ© CloudFlare (CDN-fournisseur). Ils surveillent leur CDN via ClickHouse (DNS-requĂȘtes, . L'augmentation de la performance de Nginx est due Ă l'utilisation d'une architecture asynchrone gĂ©rĂ©e par Ă©vĂ©nements, contrairement Ă un modĂšle multithread. Cela, combinĂ© Ă un haut niveau de parallĂ©lisme, permet Ă Nginx de traiter les requĂȘtes avec une mĂ©moire minimale. Cela fait de Nginx une excellente solution pour les serveurs web, qu'il s'agisse de gros ou de petits volumes de trafic. Nginx est une solution mature et entiĂšrement documentĂ©e, permettant une configuration facile selon vos besoins. Les dĂ©veloppeurs utilisent Ă©galement Nginx comme proxy inverse pour-requĂȘtes) avec une Ă©norme charge â 6 millions d'Ă©vĂ©nements par seconde. Tout passe par Kafka, envoyĂ© Ă ClickHouse, qui permet de voir en temps rĂ©el les tableaux de bord des Ă©vĂ©nements dans le systĂšme.
Comcast â l'un des leaders des tĂ©lĂ©communications aux Ătats-Unis : internet, tĂ©lĂ©vision numĂ©rique, tĂ©lĂ©phonie. Ils ont créé un systĂšme de gestion similaire CDN dans le cadre de Open Source du projet Apache Traffic Control pour travailler avec leurs Ă©normes donnĂ©es. ClickHouse est utilisĂ© comme backend pour l'analyse.
Percona ils ont intégré ClickHouse dans leur PMM,pour stocker la surveillance de divers MySQL.
Exigences spécifiques
Les bases de données de type time-series ont des exigences spécifiques.
- Insertion rapide depuis de nombreux agents.Nous devons insĂ©rer des donnĂ©es trĂšs rapidement depuis plusieurs flux. ClickHouse le fait bien car toutes ses insertions ne bloquent pas. Toute insert â c'est un nouveau fichier sur le disque, et de petites insertions peuvent ĂȘtre mises en mĂ©moire tampon de diffĂ©rentes maniĂšres. Dans ClickHouse il est prĂ©fĂ©rable d'insĂ©rer des donnĂ©es par gros paquets plutĂŽt qu'une ligne Ă la fois.
- SchĂ©ma flexible. Il y a sĂ©ries temporelles nous ne connaissons gĂ©nĂ©ralement pas la structure des donnĂ©es avec certitude. On peut construire un systĂšme de surveillance pour une application spĂ©cifique, mais alors il est difficile de l'utiliser pour une autre application. Pour cela, un schĂ©ma plus flexible est nĂ©cessaire. ClickHouse, ce qui permet de le faire, mĂȘme si c'est une base fortement typĂ©e.
- Stockage efficace et « oubli » des donnĂ©es. En gĂ©nĂ©ral, dans sĂ©ries temporelles un volume colossal de donnĂ©es, il faut donc les stocker de maniĂšre maximale efficace. Par exemple, dans InfluxDB une bonne compression â c'est son atout principal. Mais au-delĂ du stockage, il faut aussi savoir « oublier » des donnĂ©es anciennes et effectuer un downsampling â calcul automatique des agrĂ©gats.
- RequĂȘtes rapides sur des donnĂ©es agrĂ©gĂ©es. Parfois, il est intĂ©ressant de voir les 5 derniĂšres minutes avec une prĂ©cision Ă la milliseconde, mais pour des donnĂ©es mensuelles, une granularitĂ© minute ou seconde peut ne pas ĂȘtre nĂ©cessaire â des statistiques globales suffisent. Un tel support est indispensable, sinon une requĂȘte sur 3 mois prendra beaucoup de temps mĂȘme dans ClickHouse.
- Des requĂȘtes du type «dernier point, Ă date du». Ce sont des requĂȘtes typiques pour sĂ©ries temporelles regardons la derniĂšre mesure ou l'Ă©tat du systĂšme Ă un moment donnĂ© t. Pour les bases de donnĂ©es, ce ne sont pas les requĂȘtes les plus agrĂ©ables, mais il faut aussi savoir les exĂ©cuter.
- « Assemblage » de sĂ©ries temporelles. sĂ©ries temporelles â il s'agit d'une sĂ©rie temporelle. S'il y a deux sĂ©ries temporelles, souvent il faut les assembler et les corrĂ©ler. Ce n'est pas pratique Ă faire dans toutes les bases de donnĂ©es, surtout avec des sĂ©ries temporelles non alignĂ©es : ici â un ensemble de points temporels, lĂ â d'autres. On peut calculer des moyennes, mais s'il y a tout de mĂȘme un trou, c'est problĂ©matique.
Regardons comment ces exigences sont respectées dans ClickHouse.
Configuration
Dans ClickHouse un schĂ©ma pour sĂ©ries temporelles peut ĂȘtre rĂ©alisĂ© de plusieurs maniĂšres, selon le degrĂ© de rĂ©gularitĂ© des donnĂ©es. On peut construire un systĂšme sur des donnĂ©es rĂ©guliĂšres, lorsque toutes les mĂ©triques sont connues Ă l'avance. Par exemple, c'est ce que a fait CloudFlare avec la surveillance CDN â c'est un systĂšme bien optimisĂ©. On peut construire un systĂšme plus gĂ©nĂ©ral qui surveille l'ensemble de l'infrastructure, diffĂ©rents services. Dans le cas de donnĂ©es irrĂ©guliĂšres, nous ne savons pas ce que nous surveillons Ă l'avance â et c'est probablement le cas le plus gĂ©nĂ©ral.
DonnĂ©es rĂ©guliĂšres. Colonnes. Le schĂ©ma est simple â des colonnes avec les types nĂ©cessaires :
CREATE TABLE cpu (
created_date Date DEFAULT today(),
created_at DateTime DEFAULT now(),
time String,
tags_id UInt32,
/* join to dim_tag */
usage_user Float64,
usage_system Float64,
usage_idle Float64,
usage_nice Float64,
usage_iowait Float64,
usage_irq Float64,
usage_softirq Float64,
usage_steal Float64,
usage_guest Float64,
usage_guest_nice Float64
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);C'est une table ordinaire qui surveille une certaine activité liée à la charge du systÚme (user, system, idle, nice). Simple et pratique, mais peu flexible. Si nous voulons un schéma plus flexible, nous pouvons utiliser des tableaux.
Données irréguliÚres. Tableaux:
CREATE TABLE cpu_alc (
created_date Date,
created_at DateTime,
time String,
tags_id UInt32,
metrics Nested(
name LowCardinality(String),
value Float64
)
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);
SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...
Structure ImbriquĂ© â ce sont deux tableaux : metrics.name et metrics.value. Ici, nous pouvons stocker des donnĂ©es de surveillance arbitraires, comme un tableau de noms et un tableau de valeurs Ă chaque Ă©vĂ©nement. Pour une optimisation ultĂ©rieure, au lieu d'une telle structure, nous pouvons en crĂ©er plusieurs. Par exemple, une pour float-la valeur, une autre pour int-la valeur, parce que int nous voulons stocker de maniĂšre plus efficace.
Mais cette structure est plus difficile à interroger. Il faudra utiliser une construction spéciale et des fonctions spécifiques pour extraire d'abord l'indice, puis le tableau :
SELECT max(metrics.value[indexOf(metrics.name,'usage_user')]) FROM ...Mais cela fonctionne quand mĂȘme assez rapidement. Une autre façon de stocker des donnĂ©es irrĂ©guliĂšres est de le faire par lignes.
Données irréguliÚres. Lignes. Dans cette méthode traditionnelle, sans tableaux, les noms et les valeurs sont stockés ensemble. Si un appareil envoie 5 000 mesures à la fois, 5 000 lignes sont générées dans la base de données :
CREATE TABLE cpu_rlc (
created_date Date,
created_at DateTime,
time String,
tags_id UInt32,
metric_name LowCardinality(String),
metric_value Float64
) ENGINE = MergeTree(created_date, (metric_name, tags_id, created_at), 8192);
SELECT
maxIf(metric_value, metric_name = 'usage_user'),
...
FROM cpu_r
WHERE metric_name IN ('usage_user', ...)
ClickHouse ce qui gĂšre cela â il a des extensions spĂ©ciales ClickHouse SQL. Par exemple, maxIf â une fonction spĂ©ciale qui calcule le maximum d'une mĂ©trique sous certaines conditions. On peut Ă©crire plusieurs de telles expressions dans une seule requĂȘte et calculer immĂ©diatement la valeur pour plusieurs mĂ©triques.
Comparons les trois approches :
Ici, j'ai ajoutĂ© « Taille des donnĂ©es sur le disque » pour un ensemble de donnĂ©es de test. Dans le cas des colonnes, nous avons la plus petite taille des donnĂ©es : compression maximale, vitesse optimale des requĂȘtes, mais nous devons tout fixer en mĂȘme temps.
Dans le cas des tableaux, c'est un peu moins bien. Les donnĂ©es se compressent toujours bien et nous pouvons stocker un schĂ©ma irrĂ©gulier. Mais ClickHouse â une base de donnĂ©es en colonnes, et lorsque nous commençons Ă tout stocker dans un tableau, elle se transforme en base de donnĂ©es de type ligne, et nous payons pour la flexibilitĂ© avec de l'efficacitĂ©. Pour chaque opĂ©ration, il faudra lire tout le tableau en mĂ©moire, puis trouver l'Ă©lĂ©ment dĂ©sirĂ© â et si le tableau grandit, la vitesse diminue.
Dans l'une des entreprises qui utilise cette approche (par exemple, ), les tableaux sont découpés en morceaux de 128 éléments. Les données de plusieurs milliers de métriques d'un volume de 200 To de données/jour ne sont pas stockées dans un seul tableau, mais dans 10 ou 30 tableaux avec une logique spéciale pour le stockage.
L'approche la plus simple â avec des chaĂźnes de caractĂšres. Mais les donnĂ©es se compressent mal, la taille de la table devient grande, et lorsque les requĂȘtes touchent plusieurs mĂ©triques, ClickHouse fonctionne de maniĂšre non optimale.
Schéma hybride
Supposons que nous avons choisi un schéma avec un tableau. Mais si nous savons que la majorité de nos tableaux de bord montrent uniquement les métriques utilisateur et systÚme, nous pouvons matérialiser ces métriques en colonnes au niveau de la table comme suit :
CREATE TABLE cpu_alc (
created_date Date,
created_at DateTime,
time String,
tags_id UInt32,
metrics Nested(
name LowCardinality(String),
value Float64
),
usage_user Float64
MATERIALIZED metrics.value[indexOf(metrics.name,'usage_user')],
usage_system Float64
MATERIALIZED metrics.value[indexOf(metrics.name,'usage_system')]
) ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);
Lors de l'insertion ClickHouse il les comptera automatiquement. Cela permet de combiner l'agréable à l'utile : le schéma est flexible et général, mais nous avons extrait les colonnes les plus utilisées. Je précise que cela n'a pas nécessité de modifier l'insertion et ETL, qui continue à insérer des tableaux dans la table. Nous avons simplement fait ALTER TABLE, ajouté quelques colonnes et nous avons obtenu un schéma hybride et plus rapide, que l'on peut utiliser immédiatement.
Codecs et compression
Pour sĂ©ries temporelles il est important de savoir Ă quel point vous emballez bien les donnĂ©es, car le volume d'informations peut ĂȘtre trĂšs grand. Dans ClickHouse il existe un ensemble d'outils pour obtenir un effet de compression de 1:10, 1:20, voire plus. Cela signifie que des donnĂ©es non compressĂ©es d'un volume de 1 To sur le disque occupent entre 50 et 100 Go. Une taille plus petite est bĂ©nĂ©fique, car les donnĂ©es peuvent ĂȘtre lues et traitĂ©es plus rapidement.
Pour atteindre un niveau élevé de compression, ClickHouse il prend en charge les codecs suivants :
Exemple de tableau :
CREATE TABLE benchmark.cpu_codecs_lz4 (
created_date Date DEFAULT today(),
created_at DateTime DEFAULT now() Codec(DoubleDelta, LZ4),
tags_id UInt32,
usage_user Float64 Codec(Gorilla, LZ4),
usage_system Float64 Codec(Gorilla, LZ4),
usage_idle Float64 Codec(Gorilla, LZ4),
usage_nice Float64 Codec(Gorilla, LZ4),
usage_iowait Float64 Codec(Gorilla, LZ4),
usage_irq Float64 Codec(Gorilla, LZ4),
usage_softirq Float64 Codec(Gorilla, LZ4),
usage_steal Float64 Codec(Gorilla, LZ4),
usage_guest Float64 Codec(Gorilla, LZ4),
usage_guest_nice Float64 Codec(Gorilla, LZ4),
additional_tags String DEFAULT ''
)
ENGINE = MergeTree(created_date, (tags_id, created_at), 8192);Ici, nous dĂ©finissons le codec DoubleDelta dans un cas, et dans l'autre â Gorilla, et nous ajoutons impĂ©rativement encore LZ4 de la compression. En consĂ©quence, la taille des donnĂ©es sur le disque diminue considĂ©rablement :
Voici combien d'espace occupent les mĂȘmes donnĂ©es, mais avec diffĂ©rents codecs et compressions :
- dans un fichier GZIP sur le disque ;
- dans ClickHouse sans codecs, mais avec compression ZSTD ;
- dans ClickHouse avec codecs et compression LZ4 et ZSTD.
Il est évident que les tables avec codecs occupent beaucoup moins d'espace.
La taille compte
Il est également important le bon type de données :
Dans tous les exemples ci-dessus, j'ai utilisĂ© Float64. Mais si nous avions choisi Float32, cela aurait Ă©tĂ© encore mieux. Cela a Ă©tĂ© bien dĂ©montrĂ© par les gars de Percona dans l'article liĂ© ci-dessus. Il est essentiel d'utiliser le type le plus compact adaptĂ© Ă la tĂąche : ce n'est pas seulement une question de taille sur le disque, mais aussi de rapiditĂ© des requĂȘtes. ClickHouse il est trĂšs sensible Ă cela.
Si vous pouvez utiliser int32 au lieu de int64, attendez-vous à un gain de performance presque double. Les données occupent moins de mémoire, et toute l'arithmétique fonctionne beaucoup plus rapidement. ClickHouse à l'intérieur, c'est un systÚme trÚs typé, qui utilise au maximum toutes les capacités fournies par les systÚmes modernes.
Agrégation et Vues matérialisées
L'agrégation et les vues matérialisées permettent de créer des agrégats pour différents cas d'utilisation :
Par exemple, vous pouvez avoir des donnĂ©es source non agrĂ©gĂ©es, sur lesquelles il est possible de superposer diffĂ©rentes vues matĂ©rialisĂ©es avec une sommation automatique via un moteur spĂ©cial. SummingMergeTree (SMT). SMT â est une structure de donnĂ©es agrĂ©gĂ©e spĂ©ciale qui calcule les agrĂ©gats automatiquement. Les donnĂ©es brutes sont insĂ©rĂ©es dans la base de donnĂ©es, elles sont automatiquement agrĂ©gĂ©es, et il est immĂ©diatement possible d'utiliser des tableaux de bord.
TTL â «oublie» les anciennes donnĂ©es
Comment «oublier» les données qui ne sont plus nécessaires ? ClickHouse peut le faire. Lors de la création de tables, il est possible de spécifier TTL des expressions : par exemple, que les données par minute sont conservées pendant un jour, les données journaliÚres pendant 30 jours, et que les données hebdomadaires ou mensuelles ne sont jamais touchées :
CREATE TABLE aggr_by_minute
âŠ
TTL time + interval 1 day
CREATE TABLE aggr_by_day
âŠ
TTL time + interval 30 day
CREATE TABLE aggr_by_week
âŠ
/* pas de TTL */
Multi-niveau â nous sĂ©parons les donnĂ©es par disques
En dĂ©veloppant cette idĂ©e, les donnĂ©es peuvent ĂȘtre stockĂ©es dans ClickHouse diffĂ©rents endroits. Supposons que nous voulions conserver les donnĂ©es chaudes de la derniĂšre semaine sur un disque local trĂšs rapide, SSDalors que les donnĂ©es plus historiques sont stockĂ©es ailleurs. Dans ClickHouse cette configuration, c'est possible :
Il est possible de configurer la politique de stockage (storage policy) de sorte que ClickHouse les données soient automatiquement transférées dans un autre stockage lorsque certaines conditions sont atteintes.
Mais ce n'est pas tout. Au niveau d'une table spécifique, il est possible de définir des rÚgles sur quand les données passent effectivement à un stockage froid. Par exemple, les données restent sur un disque trÚs rapide pendant 7 jours, et tout ce qui est plus ancien est transféré sur un disque lent. Cela est avantageux car cela permet de maintenir le systÚme à des performances maximales tout en contrÎlant les coûts et en n'investissant pas des ressources dans des données froides :
CREATE TABLE
...
TTL date + INTERVAL 7 DAY TO VOLUME 'cold_volume',
date + INTERVAL 180 DAY DELETE
Fonctionnalités uniques ClickHouse
Presque tout dans ClickHouse possĂšde ces «petits plus», mais ils sont attĂ©nuĂ©s par l'exclusivitĂ© â ce qui n'est pas prĂ©sent dans d'autres bases de donnĂ©es. Par exemple, voici quelques-unes des fonctionnalitĂ©s uniques ClickHouse:
- Tableaux. Il y a ClickHouse un excellent support pour les tableaux, ainsi que la possibilité d'effectuer des calculs complexes sur ceux-ci.
- Structures de données agrégées. C'est l'un des «atouts» ClickHouse. Bien que les gars de Yandex disent que nous ne voulons pas agréger des données, tout le monde agrÚge dans ClickHouse, car c'est rapide et pratique.
- Vues matérialisées. Avec des structures de données agrégées, les vues matérialisées permettent de faire un résumé pratique en temps réel .
- SQL de ClickHouse. C'est une extension du langage SQL avec quelques fonctionnalités supplémentaires et exclusives que l'on trouve uniquement dans ClickHouse. Auparavant, cela ressemblait à une extension d'une part, et à un inconvénient d'autre part. Maintenant, presque tous les inconvénients par rapport à SQL 92 ont été éliminés, c'est maintenant seulement une extension.
- Lambdaâ expressions. En existe-t-il encore dans d'autres bases de donnĂ©es?
- ML- support. Cela existe dans différentes BDs, de maniÚre mieux ou moins bien suivant le cas.
- Code ouvert. Nous pouvons Ă©tendre ClickHouse ensemble. Actuellement, il y a environ 500 contributeurs, et ce nombre continue d'augmenter. ClickHouse Il existe de nombreuses façons ingĂ©nieuses de rĂ©aliser la mĂȘme chose avec des requĂȘtes.
Par exemple, il est possible de retourner la derniÚre valeur d'une table de trois maniÚres différentes pour
Dans ClickHouse ïŒil y en a aussi une quatriĂšme, mais elle est encore plus exotique). CPU La premiĂšre montre Ă quel point il est pratique de faire des requĂȘtes dans
quand vous souhaitez vĂ©rifier ce qui ClickHouse se trouve dans une sous-requĂȘte. C'est ce qui me manquait personnellement dans d'autres BDs. Si je veux comparer quelque chose avec une sous-requĂȘte, dans d'autres BDs, on ne peut comparer que des scalaires, et pour plusieurs colonnes, il faut Ă©crire tuple il est possible d'utiliser un tuple : JOIN. Il y a ClickHouse SELECT * FROM cpu WHERE (tags_id, created_at) IN (SELECT tags_id, max(created_at) FROM cpu GROUP BY tags_id)
La deuxiĂšme mĂ©thode fait la mĂȘme chose, mais utilise la fonction agrĂ©gĂ©eargMax SELECT argMax(usage_user), created_at), argMax(usage_system), created_at), ... FROM cpu:
il existe plusieurs dizaines de fonctions d'agrĂ©gation, et si l'on utilise des combinateurs, on obtenez environ mille selon les lois combinatoires. Dans ClickHouse ArgMax est l'une des fonctions qui calcule la valeur maximale : la requĂȘte renvoie la valeur usage_user , Ă laquelle la valeur maximale est atteinte, created_at:
SELECT now() as created_at,
cpu.*
FROM (SELECT DISTINCT tags_id from cpu) base
ASOF LEFT JOIN cpu USING (tags_id, created_at)
ASOF JOIN â la « jointure » de lignes Ă diffĂ©rents moments. C'est une fonction unique pour les bases de donnĂ©es, que l'on trouve Ă©galement dans kdb+. Si deux sĂ©ries chronologiques ont des moments diffĂ©rents, ASOF JOIN elle permet de les dĂ©caler et de les joindre dans une seule requĂȘte. Pour chaque valeur d'une sĂ©rie chronologique, on trouve la valeur la plus proche dans l'autre, et elles sont renvoyĂ©es sur une seule ligne :
Fonctions analytiques
Dans la norme SQL-2003 on peut écrire ainsi :
SĂLECTIONNER origine,
horodatage,
horodatage -LAG(horodatage, 1) OVER (PARTITIONNER PAR origine ORDRE PAR horodatage) COMME durée,
horodatage -MIN(horodatage) OVER (PARTITIONNER PAR origine ORDRE PAR horodatage) COMME startseq_duration,
ROW_NUMBER() OVER (PARTITIONNER PAR origine ORDRE PAR horodatage) COMME séquence,
COUNT() OVER (PARTITIONNER PAR origine ORDRE PAR horodatage) COMME nb
DE maTable
COMMANDER PAR origine, horodatage;
Dans ClickHouse cela ne peut pas ĂȘtre â il ne supporte pas la norme SQL-2003 et, probablement, ne le fera jamais. Au lieu de cela, il est ClickHouse d'usage d'Ă©crire comme ça :
J'ai promis des lambda â les voilĂ !
C'est l'analogue d'une requĂȘte analytique dans la norme SQL-2003: il calcule la diffĂ©rence entre deux horodatage, durĂ©e, numĂ©ro de sĂ©quence â tout ce que nous considĂ©rons gĂ©nĂ©ralement comme des fonctions analytiques. Dans ClickHouse nous les considĂ©rons Ă travers des tableaux : d'abord nous plions les donnĂ©es en tableau, aprĂšs cela nous faisons tout ce que nous voulons sur le tableau, puis nous le dĂ©roulons Ă nouveau. Ce n'est pas trĂšs pratique, cela demande de l'affection pour la programmation fonctionnelle, au minimum, mais c'est trĂšs flexible.
Fonctions spéciales
De plus, dans ClickHouse il y a beaucoup de fonctions spĂ©cialisĂ©es. Par exemple, comment dĂ©terminer combien de sessions se dĂ©roulent simultanĂ©ment ? Une tĂąche typique pour la surveillance â dĂ©terminer la charge maximum d'une seule requĂȘte. Dans ClickHouse il existe une fonction spĂ©ciale pour cet objectif :
En général, pour de nombreux objectifs dans ClickHouse, il y a des fonctions spéciales :
- runningDifference, runningAccumulate, neighbor;
- sumMap(clé, valeur);
- timeSeriesGroupSum(uid, horodatage, valeur);
- timeSeriesGroupRateSum(uid, horodatage, valeur);
- skewPop, skewSamp, kurtPop, kurtSamp;
- WITH FILL / WITH TIES;
- simpleLinearRegression, stochasticLinearRegression.
Ce n'est pas une liste complÚte de fonctions, il y en a environ 500-600. Indice : toutes les fonctions dans ClickHouse sont disponibles dans la table systÚme (toutes ne sont pas documentées, mais toutes sont intéressantes) :
sĂ©lectionner * de system.functions commander par nomClickHouse contient beaucoup d'informations sur lui-mĂȘme, y compris tables de log, journal_requĂȘte, journal de traçage, journal des opĂ©rations sur les blocs de donnĂ©es (part_log), journal des mĂ©triques, et le journal systĂšme, qui est gĂ©nĂ©ralement Ă©crit sur disque. Le journal des mĂ©triques est sĂ©ries temporelles dans ClickHouse sur le ClickHouse: La BD elle-mĂȘme peut jouer le rĂŽle de sĂ©ries temporelles base de donnĂ©es, ainsi, « dĂ©vorant » elle-mĂȘme.
C'est aussi une chose unique â puisque nous faisons bien le travail pour sĂ©ries temporelles, pourquoi ne pouvons-nous pas stocker tout ce qui est nĂ©cessaire en nous-mĂȘmes ? Nous n'avons pas besoin de Prometheus, nous stockons tout en nous. Nous avons connectĂ© Grafana et nous nous surveillons nous-mĂȘmes. Cependant, si ClickHouse tombe, alors nous ne verrons pas pourquoi, â donc gĂ©nĂ©ralement, on ne fait pas cela.
Un grand cluster ou de nombreux petits ClickHouse
Qu'est-ce qui est mieux â un grand cluster ou plusieurs petits ClickHouse ? L'approche traditionnelle pour DWH â c'est un grand cluster, oĂč des schĂ©mas sont allouĂ©s pour chaque application. Nous sommes allĂ©s voir l'administrateur de base de donnĂ©es â donnez-nous un schĂ©ma, et il nous l'a fourni :
Dans ClickHouse cela peut ĂȘtre fait autrement. Chaque application peut avoir son propre ClickHouse:
Nous n'avons plus besoin d'un grand monstre DWH et des administrateurs peu conciliants. Nous pouvons fournir Ă chaque application son propre ClickHouse, et le dĂ©veloppeur peut le faire lui-mĂȘme, puisque ClickHouse c'est trĂšs simple Ă installer et ne nĂ©cessite pas une administration complexe :
Mais si nous en avons beaucoup ClickHouse, et qu'il faut souvent l'installer, nous voulons automatiser ce processus. Pour cela, nous pouvons par exemple utiliser Kubernetes et clickhouse-l'opĂ©rateur. Dans Kubernetes ClickHouse peut ĂȘtre installĂ© « d'un clic » : je peux appuyer sur un bouton, lancer le manifeste et la base est prĂȘte. Je peux immĂ©diatement crĂ©er un schĂ©ma, commencer Ă charger des mĂ©triques, et dans 5 minutes, j'ai dĂ©jĂ un tableau de bord prĂȘt Grafana. C'est aussi simple que ça !
Quel est le résultat ?
Alors, ClickHouse â c'est :
- Rapidement. C'est bien connu.
- Tout simplement. Un peu controversé, mais je pense que c'est difficile à apprendre, facile à combattre. Une fois que vous comprenez comment ClickHouse cela fonctionne, tout devient trÚs simple.
- Universel. Il convient à divers scénarios : DWH, Time Series, Log Storage. Mais ce n'est pas une base de données OLTP, donc ne tentez pas d'y effectuer des insertions et des lectures courtes. C'est intéressant
- . Probablement, ceux qui travaillent avec, ont vĂ©cu de nombreux moments intĂ©ressants tant dans le bon que dans le mauvais sens. Par exemple, une nouvelle version est sortie, tout a cessĂ© de fonctionner. Ou quand vous avez travaillĂ© sur une tĂąche pendant deux jours, mais aprĂšs une question dans le chat Telegram, la tĂąche a Ă©tĂ© rĂ©solue en deux minutes. Ou lors de la confĂ©rence, dans la prĂ©sentation d'Alesha Milovidov, une capture d'Ă©cran de ClickHousea interrompu la diffusion ClickHouse . Ce genre de choses arrive constamment et rend notre vie avec HighLoad++brillante et intĂ©ressante ! ClickHouse La prĂ©sentation peut ĂȘtre visionnĂ©e
La tant attendue rencontre des développeurs de systÚmes à forte charge se tiendra .
les 9 et 10 novembre Ă Skolkovo. Ce sera enfin une confĂ©rence en prĂ©sentiel (bien que dans le respect de toutes les mesures de prĂ©caution), car l'Ă©nergie de HighLoad++ ne peut pas ĂȘtre emballĂ©e dans le format en ligne. Pour la confĂ©rence, nous trouvons et vous montrons des cas sur les capacitĂ©s maximales des technologies : HighLoad++ a Ă©tĂ©, est et sera le seul endroit oĂč l'on peut en deux jours comprendre comment Facebook, Yandex, VKontakte, Google et Amazon sont organisĂ©s.
Pour la confĂ©rence, nous recherchons et vous montrons des cas sur les possibilitĂ©s maximales des technologies : HighLoad++ a Ă©tĂ©, est et sera le seul endroit oĂč, en deux jours, vous pouvez dĂ©couvrir comment fonctionnent Facebook, Yandex, VKontakte, Google et Amazon.
Depuis nos réunions sans interruption depuis 2007, nous nous rencontrerons cette année pour la 14Úme fois. Au cours de cette période, la conférence a décuplé, l'année derniÚre, l'événement phare de l'industrie a rassemblé 3339 participants, 165 intervenants, et 16 pistes simultanées.
L'annĂ©e derniĂšre, nous avons prĂ©vu 20 bus, 5280 litres de thĂ© et de cafĂ©, 1650 litres de boissons aux fruits et 10200 bouteilles d'eau. De plus, 2640 kilogrammes de nourriture, 16000 assiettes et 25000 gobelets. Au fait, avec l'argent rĂ©coltĂ© grĂące au recyclage du papier, nous avons plantĂ© 100 jeunes chĂȘnes đVous pouvez acheter des billets , recevoir des nouvelles de la confĂ©rence â , et discuter â sur tous les rĂ©seaux sociaux : , , et .
Source : habr.com
