La traduction de l'article a été préparée spécifiquement pour les étudiants du cours .
est un développeur de logiciels, un fanatique de Go et un résolveur de problÚmes. Il est également responsable de Prometheus et co-fondateur de l'instrumentation Kubernetes SIG. Dans le passé, il était ingénieur de production chez SoundCloud et dirigeait l'équipe de monitoring chez CoreOS. Travaille actuellement chez Google.
- IngĂ©nieur Infrastructure chez Improbable. Il s'intĂ©resse aux nouvelles technologies et aux problĂ©matiques des systĂšmes distribuĂ©s. Il possĂšde une expĂ©rience en programmation de bas niveau chez Intel, une expĂ©rience en tant que contributeur chez Mesos et une expĂ©rience de production SRE de classe mondiale chez Improbable. DĂ©diĂ© Ă lâamĂ©lioration du monde des microservices. Ses trois amours : le Golang, l'open source et le volley.
En regardant notre produit phare SpatialOS, vous pouvez deviner qu'Improbable nĂ©cessite une infrastructure cloud hautement dynamique Ă l'Ă©chelle mondiale avec des dizaines de clusters Kubernetes. Nous avons Ă©tĂ© parmi les premiers Ă utiliser un systĂšme de surveillance . Prometheus est capable de suivre des millions de mĂ©triques en temps rĂ©el et est livrĂ© avec un langage de requĂȘte puissant qui vous permet d'extraire les informations dont vous avez besoin.
La simplicité et la fiabilité de Prometheus sont l'un de ses principaux avantages. Cependant, une fois dépassé une certaine échelle, nous avons rencontré plusieurs inconvénients. Pour résoudre ces problÚmes, nous avons développé est un projet open source créé par Improbable pour transformer de maniÚre transparente les clusters Prometheus existants en un systÚme de surveillance unique avec un stockage illimité de données historiques. Thanos est disponible sur Github .
Nos objectifs avec Thanos
Ă une certaine Ă©chelle, des problĂšmes surgissent qui dĂ©passent les capacitĂ©s de Vanilla Prometheus. Comment stocker de maniĂšre fiable et Ă©conomique des pĂ©taoctets de donnĂ©es historiques ? Est-ce possible sans compromettre le temps de rĂ©ponse ? Est-il possible d'accĂ©der Ă toutes les mĂ©triques situĂ©es sur diffĂ©rents serveurs Prometheus avec une seule requĂȘte API ? Existe-t-il un moyen de combiner les donnĂ©es rĂ©pliquĂ©es collectĂ©es Ă l'aide de Prometheus HA ?
Pour résoudre ces problÚmes, nous avons créé Thanos. Les sections suivantes décrivent comment nous avons abordé ces questions et expliquent nos objectifs.
Interrogation de donnĂ©es Ă partir de plusieurs instances Prometheus (requĂȘte globale)
Prometheus propose une approche fonctionnelle du partitionnement. MĂȘme un seul serveur Prometheus offre suffisamment dâĂ©volutivitĂ© pour libĂ©rer les utilisateurs des complexitĂ©s du partitionnement horizontal dans presque tous les cas dâutilisation.
Bien qu'il s'agisse d'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 interface utilisateur â une vue globale. Bien entendu, il est possible d'afficher plusieurs requĂȘtes dans un seul panneau Grafana, mais chaque requĂȘte ne peut ĂȘtre exĂ©cutĂ©e que sur un seul serveur Prometheus. D'un autre cĂŽtĂ©, avec Thanos, vous pouvez interroger et regrouper les donnĂ©es de plusieurs serveurs Prometheus puisqu'ils sont tous accessibles Ă partir d'un seul point de terminaison.
Auparavant, pour obtenir une vue globale dans Improbable, nous organisions nos instances Prometheus en plusieurs niveaux. . Cela signifiait créer un méta-serveur Prometheus qui collecte certaines des métriques de chaque serveur feuille.

Cette approche s'est avĂ©rĂ©e problĂ©matique. Cela a abouti Ă des configurations plus complexes, Ă l'ajout d'un point de dĂ©faillance potentiel supplĂ©mentaire et Ă l'application de rĂšgles complexes pour garantir que le point de terminaison fĂ©dĂ©rĂ© reçoit uniquement les donnĂ©es dont il a besoin. De plus, ce type de fĂ©dĂ©ration ne permet pas dâavoir une vĂ©ritable vision globale, puisque toutes les donnĂ©es ne sont pas disponibles Ă partir dâune seule requĂȘte API.
Une vue unifiĂ©e des donnĂ©es collectĂ©es sur les serveurs Prometheus Ă haute disponibilitĂ© (HA) est Ă©troitement liĂ©e Ă cela. Le modĂšle HA de Prometheus collecte indĂ©pendamment les donnĂ©es deux fois, ce qui est si simple qu'il ne pourrait pas ĂȘtre plus simple. Cependant, utiliser une vue combinĂ©e et dĂ©dupliquĂ©e des deux flux serait bien plus pratique.
Bien entendu, des serveurs Prometheus hautement disponibles sont nĂ©cessaires. Chez Improbable, nous prenons trĂšs au sĂ©rieux la surveillance des donnĂ©es minute par minute, mais avoir une instance Prometheus par 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 entraĂźner des perturbations mineures dans la collecte des mĂ©triques, car les redĂ©marrages peuvent ĂȘtre considĂ©rablement plus longs que l'intervalle de scraping.
Stockage fiable des données historiques
Le stockage de mĂ©triques bon marchĂ©, rapide et Ă long terme est notre rĂȘve (partagĂ© par la plupart des utilisateurs de Prometheus). Dans Improbable, nous avons Ă©tĂ© obligĂ©s de configurer la pĂ©riode de conservation des mĂ©triques Ă neuf jours (pour Prometheus 1.8). Cela ajoute des limites Ă©videntes Ă la distance dans laquelle nous pouvons regarder en arriĂšre.
Prometheus 2.0 s'est amĂ©liorĂ© Ă cet Ă©gard, puisque le nombre de sĂ©ries temporelles n'affecte plus les performances globales du serveur (voir. ). Cependant, Prometheus stocke les donnĂ©es sur le disque local. Bien qu'une compression de donnĂ©es Ă haute efficacitĂ© puisse rĂ©duire considĂ©rablement l'utilisation des disques SSD locaux, il existe toujours une limite Ă la quantitĂ© de donnĂ©es historiques pouvant ĂȘtre stockĂ©es.
De plus, chez Improbable, nous nous soucions de la fiabilitĂ©, de la simplicitĂ© et du coĂ»t. Les disques locaux volumineux sont plus difficiles Ă exploiter et Ă sauvegarder. Ils coĂ»tent plus cher et nĂ©cessitent davantage dâoutils de sauvegarde, ce qui entraĂźne une complexitĂ© inutile.
Sous-échantillonnage
Une fois que nous avons commencĂ© Ă travailler avec des donnĂ©es historiques, nous avons rĂ©alisĂ© qu'il existe des difficultĂ©s fondamentales avec big-O qui rendent les requĂȘtes de plus en plus lentes Ă mesure que nous travaillons avec des semaines, des mois et des annĂ©es de donnĂ©es.
La solution standard Ă ce problĂšme serait (sous-Ă©chantillonnage) - rĂ©duction de la frĂ©quence d'Ă©chantillonnage du signal. GrĂące au sous-Ă©chantillonnage, nous pouvons « rĂ©duire » Ă une pĂ©riode plus large et conserver le mĂȘme nombre dâĂ©chantillons, ce qui permet aux requĂȘtes de rester rĂ©actives.
Le sous-échantillonnage des anciennes données est une exigence inévitable de toute solution de stockage à long terme et dépasse la portée de Vanilla Prometheus.
Objectifs supplémentaires
L'un des objectifs initiaux du projet Thanos Ă©tait de s'intĂ©grer de maniĂšre transparente Ă toutes les installations Prometheus existantes. Le deuxiĂšme objectif Ă©tait la facilitĂ© dâexploitation avec un minimum de barriĂšres Ă lâentrĂ©e. Toutes les dĂ©pendances doivent ĂȘtre facilement satisfaites, aussi bien pour les petits que pour les grands utilisateurs, ce qui signifie Ă©galement un faible coĂ»t de base.
Architecture de Thanos
AprÚs avoir énuméré nos objectifs dans la section précédente, parcourons-les et voyons comment Thanos résout ces problÚmes.
Vue globale
Pour obtenir une vue globale des instances Prometheus existantes, nous devons lier un seul point d'entrĂ©e de requĂȘte Ă tous les serveurs. C'est exactement ce que fait le composant Thanos. . Il est dĂ©ployĂ© Ă cĂŽtĂ© de chaque serveur Prometheus et agit comme un proxy, servant les donnĂ©es Prometheus locales via l'API gRPC Store, permettant de rĂ©cupĂ©rer les donnĂ©es de sĂ©ries chronologiques par balise et par plage horaire.
De lâautre cĂŽtĂ© se trouve le composant Querier Ă©volutif et sans Ă©tat, qui ne fait guĂšre plus que simplement rĂ©pondre aux requĂȘtes PromQL via lâAPI HTTP Prometheus standard. Querier, Sidecar et d'autres composants Thanos communiquent via .

- Querier, dÚs réception d'une demande, se connecte au serveur API Store correspondant, c'est-à -dire à nos Sidecars et reçoit des données de séries chronologiques des serveurs Prometheus correspondants.
- AprĂšs cela, il combine les rĂ©ponses et exĂ©cute une requĂȘte PromQL sur celles-ci. Querier peut fusionner Ă la fois des donnĂ©es disjointes et des donnĂ©es en double provenant des serveurs Prometheus HA.
Cela rĂ©sout une piĂšce majeure de notre puzzle : combiner les donnĂ©es de serveurs Prometheus isolĂ©s en une seule vue. En fait, Thanos ne peut ĂȘtre utilisĂ© que pour cette fonctionnalitĂ©. Aucune modification ne doit ĂȘtre apportĂ©e aux serveurs Prometheus existants !
Durée de conservation illimitée !
Cependant, tĂŽt ou tard, nous souhaiterons stocker les donnĂ©es au-delĂ de la durĂ©e de conservation normale de Prometheus. Nous avons choisi le stockage objet pour stocker les donnĂ©es historiques. Il est largement disponible dans nâimporte quel cloud ainsi que dans les centres de donnĂ©es sur site et est trĂšs rentable. De plus, presque tous les stockages d'objets sont disponibles via la cĂ©lĂšbre API S3.
Prometheus écrit les données de la RAM sur le disque environ toutes les deux heures. Le bloc de données stocké contient toutes les données pendant une période de temps déterminée et est immuable. C'est trÚs pratique car Thanos Sidecar peut simplement consulter le répertoire de données Prometheus et, à mesure que de nouveaux blocs deviennent disponibles, les charger dans des compartiments de stockage d'objets.

Le chargement dans le stockage d'objets immédiatement aprÚs l'écriture sur le disque vous permet également de conserver la simplicité du scraper (Prometheus et Thanos Sidecar). Ce qui simplifie le support, les coûts et la conception du systÚme.
Comme vous pouvez le constater, la sauvegarde des donnĂ©es est trĂšs simple. Mais quâen est-il de lâinterrogation des donnĂ©es dans le stockage objet ?
Le composant Thanos Store agit comme un proxy pour rĂ©cupĂ©rer les donnĂ©es du stockage d'objets. Comme Thanos Sidecar, il participe au cluster gossip et implĂ©mente l'API Store. De cette façon, le demandeur existant peut le traiter comme un side-car, comme une autre source de donnĂ©es de sĂ©ries chronologiques â aucune configuration particuliĂšre n'est requise.

Les blocs de données de séries chronologiques sont constitués de plusieurs fichiers volumineux. Les charger à la demande serait assez inefficace et les mettre en cache localement nécessiterait une énorme quantité de mémoire et d'espace disque.
Au lieu de cela, Store Gateway sait comment gĂ©rer le format de stockage 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 nombre minimum de requĂȘtes HTTP vers des fichiers de stockage d'objets. De cette maniĂšre, vous pouvez rĂ©duire le nombre de requĂȘtes de quatre Ă six ordres de grandeur et atteindre des temps de rĂ©ponse gĂ©nĂ©ralement difficiles Ă distinguer des requĂȘtes de donnĂ©es sur un SSD local.

Comme le montre le diagramme ci-dessus, Thanos Querier rĂ©duit considĂ©rablement le coĂ»t par requĂȘte des donnĂ©es de stockage d'objets en tirant parti du format de stockage Prometheus et en plaçant cĂŽte Ă cĂŽte les donnĂ©es associĂ©es. GrĂące Ă cette approche, nous pouvons combiner de nombreuses requĂȘtes uniques en un nombre minimum d'opĂ©rations groupĂ©es.
Compactage et sous-échantillonnage
Une fois quâun nouveau bloc de donnĂ©es de sĂ©ries chronologiques est chargĂ© avec succĂšs dans le stockage dâobjets, nous le traitons comme des donnĂ©es « historiques », immĂ©diatement disponibles via Store Gateway.
Cependant, aprĂšs un certain temps, les blocs provenant d'une seule source (Prometheus avec Sidecar) s'accumulent et n'utilisent plus tout le potentiel d'indexation. Pour rĂ©soudre ce problĂšme, nous avons introduit un autre composant appelĂ© Compactor. Il applique simplement le moteur de compactage local de Prometheus aux donnĂ©es historiques dans le stockage d'objets et peut ĂȘtre exĂ©cutĂ© comme un simple travail par lots pĂ©riodique.

GrĂące Ă une compression efficace, interroger le stockage sur une longue pĂ©riode ne pose pas de problĂšme en termes de taille des donnĂ©es. Cependant, le coĂ»t potentiel liĂ© au dĂ©compression d'un milliard de valeurs et Ă leur exĂ©cution via un processeur de requĂȘtes entraĂźnera inĂ©vitablement une augmentation spectaculaire du temps d'exĂ©cution des requĂȘtes. Dâun autre cĂŽtĂ©, comme il y a des centaines de points de donnĂ©es par pixel sur lâĂ©cran, il devient mĂȘme impossible de visualiser les donnĂ©es en pleine rĂ©solution. Ainsi, le sous-Ă©chantillonnage est non seulement possible, mais nâentraĂźnera pas non plus de perte notable de prĂ©cision.

Pour sous-Ă©chantillonner les donnĂ©es, Compactor agrĂšge continuellement les donnĂ©es Ă une rĂ©solution de cinq minutes et une heure. Pour chaque morceau brut codĂ© Ă l'aide de la compression TSDB XOR, diffĂ©rents types de donnĂ©es agrĂ©gĂ©es sont stockĂ©s, tels que le minimum, le maximum ou la somme pour un bloc. Cela permet Ă Querier de sĂ©lectionner automatiquement un agrĂ©gat appropriĂ© pour une requĂȘte PromQL donnĂ©e.
Aucune configuration particuliĂšre n'est requise pour que l'utilisateur puisse utiliser des donnĂ©es de prĂ©cision rĂ©duite. Querier bascule automatiquement entre diffĂ©rentes rĂ©solutions et donnĂ©es brutes lorsque l'utilisateur effectue un zoom avant et arriĂšre. S'il le souhaite, l'utilisateur peut contrĂŽler cela directement via le paramĂštre « step » dans la requĂȘte.
Ătant donnĂ© que le coĂ»t de stockage d'un Go est faible, Thanos stocke par dĂ©faut les donnĂ©es brutes, les donnĂ©es de rĂ©solution de cinq minutes et d'une heure. Il n'est pas nĂ©cessaire de supprimer les donnĂ©es originales.
RĂšgles d'enregistrement
MĂȘme avec Thanos, les rĂšgles d'enregistrement constituent un Ă©lĂ©ment essentiel de la pile de surveillance. Ils rĂ©duisent la complexitĂ©, la latence et le coĂ»t des requĂȘtes. Ils permettent Ă©galement aux utilisateurs d'obtenir des donnĂ©es agrĂ©gĂ©es par mĂ©triques. Thanos est basĂ© sur des instances Prometheus vanille, il est donc parfaitement 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, une alerte lorsqu'un service ne fonctionne pas sur plus de deux clusters sur trois).
- RÚgle pour les données en dehors du stockage local.
- Le désir de stocker 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 StoreAPI bien connue, le nĆud Query peut accĂ©der Ă des mĂ©triques fraĂźchement calculĂ©es. Plus tard, ils sont Ă©galement stockĂ©s dans le stockage dâobjets et mis Ă disposition via Store Gateway.
Le pouvoir de Thanos
Thanos est suffisamment flexible pour ĂȘtre personnalisĂ© selon vos besoins. Ceci est particuliĂšrement utile lors de la migration depuis la plaine Prometheus. RĂ©capitulons rapidement ce que nous avons appris sur les composants de Thanos avec un exemple rapide. Voici comment emmener votre Prometheus vanille dans le monde du « stockage de mĂ©triques illimitĂ© » :

- Ajoutez Thanos Sidecar Ă vos serveurs Prometheus - par exemple, un conteneur side-car dans un pod Kubernetes.
- Déployez plusieurs répliques Thanos Querier pour pouvoir afficher les données. A ce stade, il est facile d'établir des ragots entre Scraper et Querier. Pour vérifier l'interaction des composants, utilisez la métrique « thanos_cluster_members ».
Ces deux étapes suffisent pour fournir une vue globale et une déduplication transparente des données à partir de répliques potentielles de Prometheus HA ! Connectez simplement vos tableaux de bord au point de terminaison HTTP Querier ou utilisez directement l'interface utilisateur de Thanos.
Toutefois, si vous avez besoin d'une sauvegarde des métriques et d'un stockage à long terme, vous devrez effectuer trois étapes supplémentaires :
- CrĂ©ez un compartiment AWS S3 ou GCS. Configurez Sidecar pour copier les donnĂ©es dans ces compartiments. Le stockage local des donnĂ©es peut dĂ©sormais ĂȘtre minimisĂ©.
- Déployez Store Gateway et connectez-le à votre cluster Gossip existant. Vous pouvez désormais interroger les données sauvegardées !
- DĂ©ployez Compactor pour amĂ©liorer l'efficacitĂ© des requĂȘtes sur de longues pĂ©riodes grĂące au compactage et au sous-Ă©chantillonnage.
Si vous souhaitez en savoir plus, n'hĂ©sitez pas Ă jeter un Ćil Ă notre Đž !
En seulement cinq étapes, nous avons transformé Prometheus en un systÚme de surveillance fiable avec une vue globale, une durée de stockage illimitée et une haute disponibilité potentielle des métriques.
Pull request : nous avons besoin de vous !
est un projet open source depuis le tout début. L'intégration transparente avec Prometheus et la possibilité d'utiliser seulement une partie de Thanos en font un excellent choix pour faire évoluer votre systÚme de surveillance sans effort.
Nous acceptons toujours les demandes et problÚmes de pull GitHub. En attendant, n'hésitez pas à nous contacter via Github Issues ou Slacksi 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
