
VictoriaMetrics â une base de donnĂ©es rapide et Ă©volutive pour le stockage et le traitement des donnĂ©es sous forme de sĂ©ries temporelles (un enregistrement forme le temps et un ensemble de valeurs correspondantes Ă ce temps, par exemple, obtenues via un sondage pĂ©riodique de l'Ă©tat des capteurs ou la collecte de mĂ©triques).


Je m'appelle Pavel Kolobaev. DevOps, SRE, LeroyMerlin, tout comme le code â c'est tout nous : moi et les autres employĂ©s de LeroyMerlin.

Il existe un nuage basé sur OpenStack. Voici un petit lien vers le radar technique.

Il est construit sur du matériel Kubernetes, ainsi que sur tous les services associés à OpenStack et à la journalisation.

Voici comment nous avons organisé le développement. Lorsque nous avons tout développé, nous avions un opérateur Prometheus qui stockait les données à l'intérieur du cluster K8s. Il trouve automatiquement ce qu'il faut scraper et le place sous ses pieds, pour dire les choses simplement.

Nous devons dĂ©placer toutes les donnĂ©es en dehors du cluster Kubernetes, car si quelque chose se produit, nous devons comprendre oĂč et quoi.

La premiÚre solution consiste à utiliser la fédération, lorsque nous avons un Prometheus externe, lorsque nous accédons au cluster Kubernetes via le mécanisme de fédération.

Mais ici, cela pose quelques problÚmes. Dans notre cas, les problÚmes ont commencé lorsque nous avions 250 000 métriques, et lorsque nous sommes passés à 400 000 métriques, nous avons réalisé que nous ne pouvions pas travailler de cette maniÚre. Nous avons augmenté le scrape_timeout à 25 secondes.
Pourquoi avons-nous dĂ» faire cela ? Prometheus commence Ă compter le temps d'attente Ă partir du moment oĂč il commence Ă collecter. Et peu importe que les donnĂ©es soient encore en cours d'envoi. Si, pendant cette pĂ©riode spĂ©cifiĂ©e, les donnĂ©es ne sont pas envoyĂ©es et que la session n'est pas fermĂ©e par http, il est considĂ©rĂ© que la session a Ă©chouĂ© et que les donnĂ©es ne sont pas envoyĂ©es dans Prometheus lui-mĂȘme.

Tout le monde connaßt les graphiques que nous obtenons lorsque certaines données sont manquantes. Les graphiques sont fragmentés et cela ne nous convient pas.

La prochaine option est le partitionnement basĂ© sur deux Prometheus diffĂ©rents via le mĂȘme mĂ©canisme de fĂ©dĂ©ration.
Par exemple, simplement les partitionner par nom. Cela peut Ă©galement ĂȘtre utilisĂ©, mais nous avons dĂ©cidĂ© d'aller plus loin.

Nous allons maintenant devoir traiter ces shards d'une maniĂšre ou d'une autre. On peut utiliser promxy, qui va dans la zone du shard, multiplie les donnĂ©es. Il fonctionne avec deux shards comme un point d'entrĂ©e unique. Cela peut ĂȘtre rĂ©alisĂ© via promxy, mais c'est encore trop complexe.

La premiĂšre option â nous voulons renoncer au mĂ©canisme de fĂ©dĂ©ration, car il est trĂšs lent.
Les développeurs de Prometheus disent clairement : « Les gars, utilisez d'autres TimescaleDB, car nous ne supporterons pas un stockage à long terme des métriques ». Ce n'est pas leur rÎle. 
Nous notons sur un papier qu'il nous faut effectivement une exportation vers l'extĂ©rieur, afin de ne pas tout stocker au mĂȘme endroit.

Le deuxiÚme inconvénient est la consommation de mémoire. Oui, je comprends que beaucoup diront qu'en 2020, quelques gigaoctets de mémoire ne coûtent pas cher, mais néanmoins.
Actuellement, nous avons un environnement dev et prod. En dev, cela représente environ 9 gigaoctets pour 350 000 métriques. En prod, c'est juste un peu plus de 14 gigaoctets pour 780 000 métriques. De plus, notre temps de rétention est de seulement 30 minutes. C'est problématique. Et je vais expliquer pourquoi.

Nous faisons le calcul, c'est-à -dire qu'avec un million et demi de métriques, et nous y sommes presque, au stade de la conception, nous prévoyons 35 à 37 gigaoctets de mémoire. Mais déjà pour 4 millions de métriques, il faut environ 90 gigaoctets de mémoire. Cela a été calculé selon la formule fournie par les développeurs de Prometheus. Nous avons observé la corrélation et compris que nous ne voulons pas payer quelques millions pour un serveur juste pour la surveillance.
Nous n'allons pas seulement augmenter le nombre de machines, nous surveillons aussi les machines virtuelles elles-mĂȘmes. Donc, plus il y a de machines virtuelles, plus il y aura de mĂ©triques de diffĂ©rents types, etc. Nous prĂ©voyons une croissance spĂ©ciale de notre cluster en termes de mĂ©triques.

Ce n'est pas si grave en ce qui concerne l'espace disque, mais nous aimerions l'améliorer. Nous avons obtenu en 15 jours un total de 120 gigaoctets, dont 100 sont des données compressées, 20 des données non compressées, mais nous souhaiterions toujours moins.

Par conséquent, nous notons un autre point : c'est une grande consommation de ressources que nous aimerions économiser, car nous ne voulons pas que notre cluster de surveillance consomme plus de ressources que notre cluster qui gÚre OpenStack.

Il y a un autre inconvĂ©nient de Prometheus que nous avons identifiĂ©, c'est au moins une certaine limitation de la mĂ©moire. Avec Prometheus, c'est bien pire, car il n'a pas du tout ce type de rĂ©glages. Utiliser des limites de mĂ©moire dans Docker nâest Ă©galement pas une option. Si votre RAF tombe et qu'il y a 20-30 gigaoctets, la remontĂ©e prendra beaucoup de temps.

C'est une autre raison pour laquelle Prometheus ne nous convient pas, c'est-à -dire qu'il n'est pas possible de limiter la consommation de mémoire.

Nous pourrions adopter un tel schĂ©ma. Ce schĂ©ma est nĂ©cessaire pour organiser un cluster HA. Nous voulons que nos mĂ©triques soient toujours et partout accessibles, mĂȘme en cas de panne du serveur qui les stocke. Ainsi, nous devrons construire un tel schĂ©ma.
Ce schĂ©ma indique que nous aurons une duplication des shards, et par consĂ©quent, une duplication des ressources consommĂ©es. Il peut presque ĂȘtre mis Ă l'Ă©chelle horizontalement, mais nĂ©anmoins, la consommation des ressources sera Ă©norme.

Les inconvénients, par ordre, tels que nous les avons écrits pour nous :
- Une exportation des métriques vers l'extérieur est nécessaire.
- Grande consommation de ressources.
- Impossible de limiter la consommation de mémoire.
- Implémentation complexe et gourmande en ressources pour le HA.

Nous avons décidé d'abandonner Prometheus comme solution de stockage.
Nous avons également défini d'autres exigences dont nous avons besoin. Celles-ci sont :
- Le support de promql, car beaucoup de choses ont dĂ©jĂ Ă©tĂ© Ă©crites pour Prometheus : requĂȘtes, alertes.
- Et ensuite, nous avons Grafana, qui est également conçue pour Prometheus en tant que backend. Nous ne voulons pas réécrire les dashboards.
- Nous voulons construire une architecture HA correcte.
- Nous souhaitons réduire la consommation de toutes les ressources.
- Il y a encore un petit détail. Nous ne pouvons pas utiliser différents types de systÚmes cloud de collecte de métriques. Nous ne savons pas ce qui se perdra dans ces métriques pour l'instant. Et comme tout ce qui veut y aller peut s'y retrouver, nous devons nous limiter à un hébergement local.

Le choix était limité. Nous avons rassemblé tout ce que nous avions expérimenté. Nous avons regardé la page de Prometheus dans la section intégration, lu de nombreux articles, et vérifié ce qui existe. Nous avons choisi VictoriaMetrics comme remplacement de Prometheus.
Pourquoi ? Parce que :
- Il sait utiliser promql.
- Il dispose d'une architecture modulaire.
- Il ne nécessite pas de modifications dans Grafana.
- Et surtout â il est possible que nous offrions le stockage des mĂ©triques au sein de notre entreprise en tant que service, donc nous nous orientons dĂ©jĂ vers des limitations de divers types, afin que les utilisateurs puissent utiliser toutes les ressources du cluster d'une maniĂšre un peu limitĂ©e, car il y a une chance qu'il soit multitenant.

Nous faisons une premiĂšre comparaison. Nous prenons le mĂȘme Prometheus Ă l'intĂ©rieur du cluster, auquel se connecte un Prometheus externe. Nous ajoutons VictoriaMetrics via remoteWrite.

Je précise tout de suite qu'ici nous avons constaté une légÚre augmentation de la consommation CPU de VictoriaMetrics. La wiki de VictoriaMetrics indique quels paramÚtres sont les plus appropriés. Nous les avons vérifiés. Ils ont trÚs bien réduit la consommation spécifiquement en ce qui concerne le CPU.
Dans notre cas, la consommation de mémoire de Prometheus, qui est dans le cluster Kubernetes, a légÚrement augmenté.

Nous comparons deux sources de donnĂ©es des mĂȘmes donnĂ©es. Dans Prometheus, nous voyons toutes les mĂȘmes donnĂ©es manquantes. Dans VictoriaMetrics, tout est en ordre.

RĂ©sultats des tests en termes d'espace disque. Nous avons obtenu 120 Go au total dans Prometheus. Avec VictoriaMetrics, nous obtenons dĂ©jĂ 4 Go par jour. Il y a un mĂ©canisme lĂ©gĂšrement diffĂ©rent de ce Ă quoi nous sommes habituĂ©s avec Prometheus. Autrement dit, les donnĂ©es sont dĂ©jĂ assez bien comprimĂ©es en une journĂ©e, en une demi-heure. Elles sont bien comprimĂ©es aprĂšs une journĂ©e, en une demi-heure, mĂȘme si les donnĂ©es seront ensuite fusionnĂ©es. Au final, nous avons Ă©conomisĂ© sur l'espace disque.

Nous faisons Ă©galement des Ă©conomies sur la consommation des ressources mĂ©moire. Lors des tests, Prometheus Ă©tait dĂ©ployĂ© sur une machine virtuelle - 8 cĆurs, 24 Go. Prometheus consomme pratiquement tout. Il a Ă©tĂ© arrĂȘtĂ© par OOM Killer. En mĂȘme temps, il ne traitait que 900 000 mĂ©triques actives. Cela reprĂ©sente environ 25 000 Ă 27 000 mĂ©triques par seconde.
VictoriaMetrics Ă©tait exĂ©cutĂ© sur une machine virtuelle Ă deux cĆurs avec 8 Go de RAM. Nous avons rĂ©ussi Ă faire fonctionner VictoriaMetrics efficacement en ajustant certaines choses sur la machine de 8 Go. Nous avons finalement utilisĂ© 7 Go. De plus, nous avons obtenu une vitesse de livraison de contenu, c'est-Ă -dire de mĂ©triques, mĂȘme supĂ©rieure Ă celle de Prometheus.

En ce qui concerne le CPU, c'est beaucoup mieux par rapport Ă Prometheus. Ici, Prometheus consomme 2,5 cĆurs, tandis que VictoriaMetrics ne consomme que 0,25 cĆur. Au dĂ©part, c'est 0,5 cĆur. Au fur et Ă mesure de la fusion, il atteint un cĆur, mais cela arrive extrĂȘmement rarement.

Dans notre cas, le choix s'est porté sur VictoriaMetrics pour des raisons évidentes, nous souhaitions économiser et nous avons réussi.

Nous éliminons immédiatement deux points - l'exportation des métriques et une grande consommation de ressources. Il ne reste plus que deux points à résoudre que nous avons encore à examiner.

Je précise tout de suite que nous considérons VictoriaMetrics comme un stockage de métriques. Mais puisque nous allons probablement fournir VictoriaMetrics comme stockage pour tout Leroy, nous devons restreindre ceux qui utiliseront ce cluster afin qu'ils ne le mettent pas en panne.
Il existe une excellente option qui permet de limiter le temps, le volume de données et la durée d'exécution.
Il y a aussi une option fantastique qui permet de limiter la consommation de mémoire, nous permettant ainsi de trouver cet équilibre qui nous donnera une vitesse de fonctionnement normale et une consommation de ressources adéquate.

Un point de moins, c'est-Ă -dire que nous rayons le point â la consommation de mĂ©moire ne peut pas ĂȘtre limitĂ©e.

Dans les premiÚres itérations, nous avons testé VictoriaMetrics Single Node. Nous passons maintenant à la version Cluster de VictoriaMetrics.
Ici, nous avons une flexibilitĂ© quant Ă la rĂ©partition des diffĂ©rents services dans VictoriaMetrics en fonction de leur fonctionnement et de leurs ressources consommĂ©es. C'est une solution trĂšs flexible et pratique. Nous l'avons utilisĂ©e nous-mĂȘmes.

Les composants principaux de la version Cluster de VictoriaMetrics sont le vmstorage. Il peut y en avoir un nombre N. Dans notre cas, nous en avons deux pour l'instant.
Et il y a le vminsert. C'est un serveur proxy qui nous permet : d'organiser le sharding entre tous les storages que nous lui avons indiqués, et il supporte également la réplication, c'est-à -dire que vous aurez à la fois du sharding et de la réplication.
Le vminsert prend en charge les protocoles OpenTSDB, Graphite, InfluxDB et remoteWrite de Prometheus.

Il y a aussi le vmselect. Sa tùche principale est d'aller dans le vmstorage, d'en obtenir les données, de les dédupliquer et de les transmettre au client.

Il y a une chose formidable qu'est le vmagent. Nous l'aimons beaucoup. Il permet de configurer de la mĂȘme maniĂšre que Prometheus tout en faisant exactement la mĂȘme chose que Prometheus. C'est-Ă -dire qu'il collecte des mĂ©triques Ă partir de diffĂ©rentes entitĂ©s, services, et les envoie au vminsert. AprĂšs cela, tout dĂ©pend de vous.

Un autre service remarquable est le vmalert, qui permet d'utiliser VictoriaMetrics comme backend, de recevoir des données de vminsert et de les transmettre à vmselect. Il traite les alertes et les rÚgles. En cas d'alerte, nous recevons l'alerte via alertmanager.

Il y a un composant wmauth. Il sera peut-ĂȘtre utilisĂ©, ou peut-ĂȘtre pas (nous ne nous sommes pas encore dĂ©cidĂ©s) comme systĂšme d'autorisation pour la version multitenancy des clusters. Il prend en charge remoteWrite pour Prometheus et peut autoriser sur la base de l'url, plus prĂ©cisĂ©ment de sa deuxiĂšme partie, oĂč vous pouvez ou non Ă©crire.

Il y a encore le vmbackup, le vmrestore. Ce sont, en fait, la récupération et la sauvegarde de toutes les données. Il gÚre S3, GCS, file.

La premiĂšre itĂ©ration de notre cluster a Ă©tĂ© rĂ©alisĂ©e pendant le confinement. Ă ce moment-lĂ , il n'y avait pas de rĂ©plique, donc notre itĂ©ration Ă©tait composĂ©e de deux clusters diffĂ©rents et indĂ©pendants, d'oĂč nous obtenions des donnĂ©es via remoteWrite.

Je prĂ©ciserai ici qu'en passant de VictoriaMetrics Single Node Ă VictoriaMetrics Cluster Version, nous avons conservĂ© les mĂȘmes ressources consommĂ©es, c'est-Ă -dire principalement la mĂ©moire. Voici comment nos donnĂ©es se sont rĂ©parties, c'est-Ă -dire la consommation des ressources.

Une réplication a déjà été ajoutée. Nous avons fusionné tout cela en un seul cluster relativement grand. Toutes nos données sont à la fois shardées et répliquées.
L'ensemble du cluster a N points d'entrée, c'est-à -dire que Prometheus peut ajouter des données via HAPROXY. Voici notre point d'entrée. Et par ce point d'entrée, on peut accéder à Grafana.

Dans notre cas, HAPROXY est le seul port qui proxy select, insert et les autres services Ă l'intĂ©rieur de ce cluster. Dans notre cas, il n'a pas Ă©tĂ© possible de crĂ©er une seule adresse, nous avons dĂ» Ă©tablir plusieurs points d'entrĂ©e, car les machines virtuelles sur lesquelles le cluster VictoriaMetrics fonctionne se trouvent dans diffĂ©rentes zones d'un mĂȘme fournisseur de cloud, c'est-Ă -dire Ă l'extĂ©rieur de notre cloud.

Nous avons un systĂšme d'alerte. Nous l'utilisons. Nous utilisons alertmanager de Prometheus. Pour la livraison des alertes, nous utilisons Opsgenie et Telegram. Sur Telegram, nous recevons des alertes de dev, peut-ĂȘtre quelque chose de prod, mais surtout des Ă©lĂ©ments statistiques nĂ©cessaires aux ingĂ©nieurs. Opsgenie est pour les alertes critiques. Ce sont des appels, la gestion des incidents.

La question Ă©ternelle : «Qui surveille la surveillance ?». Dans notre cas, la surveillance surveille elle-mĂȘme la surveillance, car nous utilisons vmagent sur chaque nĆud. Ătant donnĂ© que nos nĆuds sont dispersĂ©s dans diffĂ©rents centres de donnĂ©es d'un mĂȘme fournisseur, chaque centre de donnĂ©es a son propre canal, ils sont indĂ©pendants et mĂȘme en cas de split brain, nous recevrons tout de mĂȘme des alertes. Oui, il y en aura plus, mais il vaut mieux recevoir plus d'alertes que pas du tout.

Nous concluons notre liste avec la mise en Ćuvre de la HA.

Je voudrais également souligner l'expérience de collaboration avec la communauté VictoriaMetrics. Cela a été trÚs positif. Les gars sont réactifs. Ils essaient de comprendre chaque cas proposé.
J'ai créé des issues sur GitHub. Elles ont été résolues trÚs rapidement. Il y a encore quelques issues qui ne sont pas complÚtement résolues, mais je vois déjà dans le code que des travaux sont en cours dans cette direction.
La principale douleur pendant les itĂ©rations pour moi Ă©tait que si je coupais un nĆud, alors pendant les 30 premiĂšres secondes, vminsert ne pouvait pas comprendre qu'il n'y avait pas de backend. Maintenant, c'est rĂ©solu. En une seconde ou deux, les donnĂ©es sont dĂ©jĂ rĂ©cupĂ©rĂ©es de tous les nĆuds restants, et la requĂȘte cesse d'attendre le nĆud manquant.

à un moment donné, nous voulions que ce soit un opérateur VictoriaMetrics. Nous l'avons attendu. Nous construisons actuellement une interface autour de l'opérateur VictoriaMetrics pour prendre toutes les rÚgles de pré-calcul, etc. à Prometheus, car nous utilisons assez activement les rÚgles qui viennent avec l'opérateur Prometheus.
Il y a des suggestions pour améliorer l'implémentation en cluster. Je les ai exposées ci-dessus.
Et il y a aussi un besoin urgent de downsampling. Dans notre cas, le downsampling est nĂ©cessaire uniquement pour visualiser les tendances. En gros, j'ai besoin d'une seule mĂ©trique pendant la journĂ©e. Ces tendances doivent ĂȘtre disponibles pour un an, trois ans, cinq ans, dix ans. Et une seule valeur de mĂ©trique est tout Ă fait suffisante.

- Nous avons ressenti la douleur, comme certains de nos collĂšgues, en utilisant Prometheus.
- Nous avons choisi VictoriaMetrics.
- Elle évolue trÚs bien à la fois verticalement et horizontalement.
- Nous pouvons rĂ©partir diffĂ©rents composants sur un nombre diffĂ©rent de nĆuds dans le cluster, les limiter en termes de mĂ©moire, ajouter de la mĂ©moire, etc.
Nous utiliserons VictoriaMetrics chez nous, car elle nous a beaucoup plu. Voici ce qu'il en était et ce qu'il en est devenu.

Quelques QR codes pour le chat VictoriaMetrics, mes contacts, le radar technologique LeroyMerlin.
Source : habr.com
