La traduction de l'article a été préparée spécialement pour les étudiants du cours .
â dĂ©veloppeur de logiciels, passionnĂ© par Go et amateur de rĂ©soudre des dĂ©fis complexes. Il est Ă©galement mainteneur de Prometheus et cofondateur du SIG instrumentation de Kubernetes. Auparavant, il Ă©tait ingĂ©nieur de production chez SoundCloud et a dirigĂ© l'Ă©quipe de surveillance chez CoreOS. Il travaille actuellement chez Google.
â ingĂ©nieur d'infrastructure chez Improbable. Il s'intĂ©resse aux nouvelles technologies et aux dĂ©fis des systĂšmes distribuĂ©s. Il a de l'expĂ©rience en programmation bas niveau chez Intel, en tant que contributeur Ă Mesos et en tant qu'ingĂ©nieur SRE mondial chez Improbable. Il travaille Ă amĂ©liorer le monde des microservices. Ses trois passions : Golang, open source et volleyball.
En regardant notre produit phare SpatialOS, on peut deviner qu'Improbable a besoin d'une infrastructure cloud hautement dynamique Ă l'Ă©chelle mondiale avec des dizaines de clusters Kubernetes. Nous avons Ă©tĂ© parmi les premiers Ă commencer Ă utiliser le systĂšme de surveillance . Prometheus peut suivre des millions de mĂ©triques en temps rĂ©el et est livrĂ© avec un langage de requĂȘte puissant qui permet d'extraire les informations nĂ©cessaires.
La simplicitĂ© et la fiabilitĂ© de Prometheus sont l'un de ses principaux atouts. Cependant, aprĂšs avoir atteint une certaine Ă©chelle, nous avons rencontrĂ© plusieurs inconvĂ©nients. Pour rĂ©soudre ces problĂšmes, nous avons dĂ©veloppĂ© â un projet open source créé par Improbable, pour transformer sans couture les clusters Prometheus existants en un systĂšme de surveillance unique avec un stockage illimitĂ© des donnĂ©es historiques. Thanos est disponible sur Github .
Nos objectifs avec Thanos
Ă une certaine Ă©chelle, des problĂšmes Ă©mergent qui dĂ©passent les capacitĂ©s de Prometheus vanilla. Comment stocker de maniĂšre fiable et Ă©conomique des pĂ©taoctets de donnĂ©es historiques ? Est-il possible de le faire sans compromettre le temps de rĂ©ponse des requĂȘtes ? Peut-on accĂ©der Ă toutes les mĂ©triques situĂ©es sur diffĂ©rents serveurs Prometheus via une seule requĂȘte API ? Est-il possible de regrouper d'une maniĂšre ou d'une autre les donnĂ©es rĂ©pliquĂ©es collectĂ©es via Prometheus HA ?
Pour répondre à ces questions, nous avons créé Thanos. Dans les sections suivantes, nous décrivons comment nous avons abordé ces problÚmes et expliquons les objectifs que nous avons poursuivis.
RequĂȘte de donnĂ©es Ă partir de plusieurs instances Prometheus (requĂȘte globale)
Prometheus propose une approche fonctionnelle pour le sharding. MĂȘme un serveur Prometheus fournit une Ă©chelle suffisante pour libĂ©rer les utilisateurs des complexitĂ©s du sharding horizontal dans presque tous les cas d'utilisation.
Bien que ce soit un excellent modĂšle de dĂ©ploiement, il est souvent nĂ©cessaire d'accĂ©der aux donnĂ©es sur diffĂ©rents serveurs Prometheus via une seule API ou une interface utilisateur â une vue globale. Bien sĂ»r, il est possible d'afficher plusieurs requĂȘtes dans un mĂȘme tableau de bord Grafana, mais chaque requĂȘte ne peut ĂȘtre effectuĂ©e que sur un seul serveur Prometheus. D'autre part, grĂące Ă Thanos, vous pouvez interroger et agrĂ©ger des donnĂ©es de plusieurs serveurs Prometheus, puisque tous sont accessibles Ă partir d'un seul point de terminaison.
Auparavant, pour obtenir une vue globale chez Improbable, nous organisions nos instances Prometheus en une architecture multicouche. . Cela nécessitait la création d'un serveur Prometheus méta qui collecte une partie des métriques de chaque serveur "feuille".

Cette approche s'est rĂ©vĂ©lĂ©e problĂ©matique. Elle a entraĂźnĂ© une complexitĂ© accrue de la configuration, l'ajout d'un point de dĂ©faillance potentiel supplĂ©mentaire et l'application de rĂšgles complexes pour fournir Ă la fin des requĂȘtes fĂ©dĂ©rĂ©es uniquement les donnĂ©es nĂ©cessaires. De plus, une fĂ©dĂ©ration de ce type n'offre pas de vĂ©ritable vue globale, car toutes les donnĂ©es ne sont pas accessibles par une seule requĂȘte API.
Cela est Ă©troitement liĂ© Ă une vue unifiĂ©e des donnĂ©es collectĂ©es sur des serveurs Prometheus Ă haute disponibilitĂ© (high-availability, HA). Le modĂšle HA de Prometheus collecte indĂ©pendamment les donnĂ©es deux fois, ce qui est si simple que cela ne peut pas ĂȘtre plus facile. Cependant, utiliser une vue combinĂ©e et dĂ©dupliquĂ©e des deux flux serait beaucoup plus pratique.
Bien sĂ»r, il y a un besoin pour des serveurs Prometheus Ă haute disponibilitĂ©. Chez Improbable, nous prenons trĂšs au sĂ©rieux la surveillance des donnĂ©es minute par minute, mais avoir une seule instance de Prometheus dans un cluster constitue un point de dĂ©faillance unique. Toute erreur de configuration ou panne matĂ©rielle peut potentiellement entraĂźner la perte de donnĂ©es importantes. MĂȘme un simple dĂ©ploiement peut provoquer de lĂ©gers Ă©checs dans la collecte des mĂ©triques, car un redĂ©marrage peut ĂȘtre considĂ©rablement plus long que l'intervalle de scraping.
Stockage fiable des données historiques
Un stockage de mĂ©triques bon marchĂ©, rapide et Ă long terme est notre rĂȘve (partagĂ© par la plupart des utilisateurs de Prometheus). Chez Improbable, nous avons Ă©tĂ© contraints de configurer la durĂ©e de stockage des mĂ©triques Ă neuf jours (pour Prometheus 1.8). Cela impose des limites claires Ă la rĂ©troactivitĂ© de nos analyses.
Prometheus 2.0 s'est amĂ©liorĂ© Ă cet Ă©gard, car le nombre de sĂ©ries temporelles n'influence plus la performance globale du serveur (voir ). Cependant, Prometheus stocke les donnĂ©es sur un disque local. Bien qu'une compression des donnĂ©es trĂšs efficace puisse considĂ©rablement rĂ©duire l'utilisation d'un SSD local, il existe quand mĂȘme une limite sur la quantitĂ© de donnĂ©es historiques pouvant ĂȘtre conservĂ©e.
De plus, chez Improbable, nous nous soucions de la fiabilité, de la simplicité et des coûts. Les grands disques locaux sont plus difficiles à gérer et à sauvegarder. Ils sont plus coûteux et nécessitent plus d'outils de sauvegarde, ce qui entraßne une complexité excessive.
Réduction d'échantillonnage
DĂšs que nous avons commencĂ© Ă travailler avec des donnĂ©es historiques, nous avons rĂ©alisĂ© qu'il existait des complexitĂ©s fondamentales en O-grand, qui ralentissent de plus en plus les requĂȘtes lorsque nous travaillons avec des donnĂ©es sur des semaines, mois et annĂ©es.
La solution standard Ă ce problĂšme est (downsampling) â rĂ©duire la frĂ©quence d'Ă©chantillonnage d'un signal. En abaissant la frĂ©quence d'Ă©chantillonnage, nous pouvons "redimensionner" sur une plus grande plage temporelle tout en maintenant le mĂȘme nombre d'Ă©chantillons, ce qui permet de garder les requĂȘtes rĂ©actives.
La réduction d'échantillonnage des anciennes données est un besoin inévitable de toute solution de stockage à long terme et dépasse les capacités de Prometheus vanille.
Objectifs supplémentaires
L'un des objectifs initiaux du projet Thanos Ă©tait une intĂ©gration sans faille avec toutes les installations existantes de Prometheus. Le deuxiĂšme objectif Ă©tait une exploitation simple avec une barriĂšre d'entrĂ©e minimale. Toutes les dĂ©pendances doivent ĂȘtre facilement satisfaites tant pour les petits que pour les grands utilisateurs, ce qui implique Ă©galement un coĂ»t de base faible.
Architecture de Thanos
AprÚs avoir énuméré nos objectifs dans la section précédente, travaillons à leur réalisation et voyons comment Thanos résout ces problÚmes.
Vue globale
Pour obtenir une vue globale au-dessus des instances existantes de Prometheus, nous devons relier un point d'entrĂ©e unique pour toutes les requĂȘtes vers les serveurs. C'est exactement ce que fait le composant Thanos. . Il est dĂ©ployĂ© Ă cĂŽtĂ© de chaque serveur Prometheus et fonctionne comme un proxy, servant les donnĂ©es locales de Prometheus via l'interface gRPC du Store API, permettant de sĂ©lectionner des donnĂ©es de sĂ©ries temporelles par labels et plage temporelle.
D'autre part, il y a le composant Querier, qui est Ă©volutif horizontalement et sans Ă©tat, et qui fait un peu plus que rĂ©pondre aux requĂȘtes PromQL via l'API HTTP standard de Prometheus. Les composants Querier, Sidecar et d'autres de Thanos interagissent via le .

- Lorsqu'il reçoit une requĂȘte, le Querier se connecte au serveur Store API correspondant, c'est-Ă -dire Ă nos Sidecar, et rĂ©cupĂšre les donnĂ©es de sĂ©ries temporelles des serveurs Prometheus appropriĂ©s.
- Ensuite, il fusionne les rĂ©ponses et exĂ©cute la requĂȘte PromQL. Le Querier peut fusionner des donnĂ©es non chevauchantes ainsi que des donnĂ©es dupliquĂ©es provenant des serveurs HA de Prometheus.
Cela rĂ©sout la plupart de notre casse-tĂȘte : la fusion des donnĂ©es de serveurs Prometheus isolĂ©s en une seule reprĂ©sentation. En fait, Thanos peut ĂȘtre utilisĂ© uniquement pour cette fonctionnalitĂ©. Il n'est pas nĂ©cessaire d'apporter des modifications aux serveurs Prometheus existants !
Durée de conservation illimitée !
Cependant, tÎt ou tard, nous voudrons conserver des données qui dépassent la durée de conservation normale de Prometheus. Pour le stockage des données historiques, nous avons choisi un stockage d'objets. Il est largement disponible dans n'importe quel cloud, ainsi que dans les centres de données locaux, et est trÚs économique. De plus, presque n'importe quel stockage d'objets est accessible via le bien connu API S3.
Prometheus écrit les données de la mémoire vive sur le disque environ toutes les deux heures. Un bloc de données conservées contient toutes les données d'une période fixe et est immuable. C'est trÚs pratique, car Thanos Sidecar peut simplement consulter le répertoire des données de Prometheus et, à mesure que de nouveaux blocs apparaissent, les charger dans les buckets de stockage d'objets.

Le chargement vers le stockage d'objets immédiatement aprÚs l'écriture sur le disque permet également de maintenir la simplicité du « scrapeur » (Prometheus et Thanos Sidecar). Ce qui simplifie la maintenance, le coût et la conception du systÚme.
Comme vous pouvez le voir, la sauvegarde des donnĂ©es est mise en Ćuvre trĂšs simplement. Mais qu'en est-il de la requĂȘte des donnĂ©es dans le stockage d'objets ?
Le composant Thanos Store agit comme un proxy pour obtenir des donnĂ©es depuis le stockage d'objets. Comme le Thanos Sidecar, il participe au cluster de gossip et implĂ©mente l'API Store. Ainsi, les Querier existants peuvent le considĂ©rer comme un Sidecar, comme une source supplĂ©mentaire de donnĂ©es de sĂ©ries temporelles â aucune configuration spĂ©ciale n'est requise.

Les blocs de données de séries temporelles se composent de plusieurs gros fichiers. Les charger à la demande serait assez inefficace, et la mise en cache locale nécessiterait une énorme mémoire et un grand espace disque.
Au lieu de cela, le Store Gateway sait comment gĂ©rer le format de stockage de Prometheus. GrĂące Ă un planificateur de requĂȘtes intelligent et Ă la mise en cache uniquement des parties d'index nĂ©cessaires des blocs, il est possible de rĂ©duire les requĂȘtes complexes Ă un minimum de requĂȘtes HTTP vers les fichiers de stockage d'objets. Ainsi, le nombre de requĂȘtes peut ĂȘtre rĂ©duit de quatre Ă six ordres de grandeur et atteindre des temps de rĂ©ponse qui sont gĂ©nĂ©ralement difficiles Ă distinguer de ceux des requĂȘtes de donnĂ©es sur SSD locaux.

Comme l'illustre le diagramme ci-dessus, le Thanos Querier rĂ©duit considĂ©rablement les coĂ»ts d'une requĂȘte de donnĂ©es dans le stockage d'objets en utilisant le format de stockage de Prometheus et en plaçant les donnĂ©es connexes prĂšs les unes des autres. En utilisant cette approche, nous pouvons combiner de nombreuses requĂȘtes individuelles en un minimum d'opĂ©rations en masse.
Consolidation et échantillonnage descendant
Une fois qu'un nouveau bloc de données de séries temporelles est chargé avec succÚs dans le stockage d'objets, nous le considérons comme des données « historiques » qui deviennent immédiatement accessibles via le Store Gateway.
Cependant, aprĂšs un certain temps, les blocs d'une seule source (Prometheus avec Sidecar) s'accumulent et n'exploitent plus pleinement le potentiel d'indexation. Pour rĂ©soudre ce problĂšme, nous avons introduit un autre composant appelĂ© Compactor. Il applique simplement le mĂ©canisme de consolidation local de Prometheus aux donnĂ©es historiques dans le stockage d'objets et peut ĂȘtre exĂ©cutĂ© comme une simple tĂąche par lots pĂ©riodiques.

GrĂące Ă une compression efficace, les requĂȘtes de stockage Ă long terme ne posent pas de problĂšme en termes de taille des donnĂ©es. Cependant, le coĂ»t potentiel de dĂ©compression d'un milliard de valeurs et de leur passage Ă travers le processeur de requĂȘtes entraĂźnera inĂ©vitablement une augmentation rapide du temps d'exĂ©cution de la requĂȘte. D'autre part, Ă©tant donnĂ© que chaque pixel Ă l'Ă©cran correspond Ă des centaines de points de donnĂ©es, il devient impossible mĂȘme de visualiser les donnĂ©es en pleine rĂ©solution. Ainsi, le downsampling est non seulement possible, mais ne conduira pas Ă une perte de prĂ©cision significative.

Pour le downsampling des donnĂ©es, le Compactor agrĂšge en continu les donnĂ©es avec une rĂ©solution de cinq minutes et une heure. Pour chaque fragment brut, codĂ© Ă l'aide de la compression TSDB XOR, diffĂ©rents types de donnĂ©es agrĂ©gĂ©es sont stockĂ©s, comme min, max ou sum pour un bloc donnĂ©. Cela permet au Querier de choisir automatiquement l'agrĂ©gat qui convient pour une requĂȘte PromQL donnĂ©e.
Pour utiliser des donnĂ©es avec une prĂ©cision rĂ©duite, l'utilisateur n'a besoin d'aucune configuration spĂ©ciale. Le Querier change automatiquement entre diffĂ©rentes rĂ©solutions et donnĂ©es brutes Ă mesure que l'utilisateur zoom ou dĂ©zoom. Si dĂ©sirĂ©, l'utilisateur peut gĂ©rer cela directement via le paramĂštre âstepâ de la requĂȘte.
Ătant donnĂ© que le coĂ»t de stockage d'un Go est faible, Thanos par dĂ©faut conserve les donnĂ©es brutes, ainsi que les donnĂ©es avec une rĂ©solution de cinq minutes et d'une heure. Il n'est pas nĂ©cessaire de supprimer les donnĂ©es brutes.
RĂšgles d'enregistrement
MĂȘme avec Thanos, les rĂšgles d'enregistrement sont une partie essentielle de la pile de surveillance. Elles rĂ©duisent la complexitĂ©, la latence et le coĂ»t des requĂȘtes. Elles sont Ă©galement pratiques pour les utilisateurs souhaitant obtenir des donnĂ©es agrĂ©gĂ©es sur les mĂ©triques. Thanos est basĂ© sur des instances vanilla de Prometheus, donc il est tout Ă fait acceptable de stocker des rĂšgles d'enregistrement et des rĂšgles d'alerte sur un serveur Prometheus existant. Cependant, dans certains cas, cela peut ne pas suffire :
- Alerte et rĂšgle globales (par exemple, alerte lorsque le service ne fonctionne pas sur plus de deux des trois clusters).
- RÚgle pour les données hors du stockage local.
- Volonté de conserver toutes les rÚgles et alertes en un seul endroit.

Pour tous ces cas, Thanos inclut un composant distinct appelĂ© Ruler, qui calcule les rĂšgles et les alertes via les requĂȘtes Thanos. En fournissant une API Store bien connue, le nĆud de requĂȘte peut accĂ©der Ă des mĂ©triques fraĂźchement calculĂ©es. Plus tard, elles sont Ă©galement stockĂ©es dans un stockage d'objets et deviennent accessibles via le Store Gateway.
La puissance de Thanos
Thanos est suffisamment flexible pour ĂȘtre adaptĂ© Ă vos besoins. Cela est particuliĂšrement utile lors de la migration depuis un Prometheus classique. Revenons rapidement, Ă travers un petit exemple, sur ce que nous avons appris concernant les composants de Thanos. Voici comment transfĂ©rer votre Prometheus classique vers le monde du stockage illimitĂ© des mĂ©triques:

- Ajoutez Thanos Sidecar Ă vos serveurs Prometheus â par exemple, comme un conteneur voisin dans un pod Kubernetes.
- Déployez plusieurs répliques de Thanos Querier pour la visualisation des données. à ce stade, il est facile de configurer le gossip entre le Scraper et le Querier. Pour vérifier l'interaction des composants, utilisez la métrique 'thanos_cluster_members'.
Ces deux étapes suffisent pour garantir une vue globale et une déduplication fluide des données provenant de répliques HA potentielles de Prometheus ! Connectez simplement vos tableaux de bord au point de terminaison HTTP du Querier ou utilisez directement l'interface Thanos UI.
Cependant, si vous avez besoin d'une sauvegarde des métriques et d'un stockage à long terme, trois étapes supplémentaires seront nécessaires :
- Créez un bucket AWS S3 ou GCS. Configurez le Sidecar pour copier les données dans ces buckets. Vous pouvez alors minimiser le stockage local des données.
- Déployez le Store Gateway et connectez-le à votre cluster gossip existant. Vous pouvez maintenant interroger les données dans les sauvegardes !
- DĂ©ployez le Compactor pour amĂ©liorer l'efficacitĂ© des requĂȘtes sur de longues pĂ©riodes, en utilisant la compression et le downsampling.
Si vous souhaitez en savoir plus, n'hésitez pas à consulter nos et !
En seulement cinq étapes, nous avons transformé Prometheus en un systÚme de surveillance fiable avec une vue globale, un temps de stockage illimité et une accessibilité potentiellement élevée des métriques.
Pull request : vous avez besoin de nous !
a toujours été un projet open source. L'intégration fluide avec Prometheus et la capacité d'utiliser uniquement une partie de Thanos font de lui un excellent choix pour faire évoluer le systÚme de surveillance sans effort supplémentaire.
Nous sommes toujours heureux de recevoir des Pull Requests et des Issues sur GitHub. En attendant, n'hĂ©sitez pas Ă nous contacter via les Issues de GitHub ou Slack., si vous avez des questions ou des commentaires, ou si vous souhaitez partager votre expĂ©rience d'utilisation ! Si vous aimez ce que nous faisons chez Improbable, n'hĂ©sitez pas Ă nous contacter â !
Source : habr.com
