Oversettelsen av artikkelen er forberedt spesielt for studentene i kurset .
â programvareutvikler, Go-entusiast og glad i Ă„ lĂžse komplekse problemer. Han er ogsĂ„ vedlikeholder av Prometheus og medgrĂŒnder av Kubernetes SIG instrumentation. Tidligere var han produksjonsingeniĂžr hos SoundCloud og ledet overvĂ„kningsgruppen i CoreOS. NĂ„ jobber han i Google.
â infrastrukturingeniĂžr hos Improbable. Han interesserer seg for nye teknologier og utfordringer innen distribuerte systemer. Har erfaring med lavnivĂ„programmering i Intel, erfaring som bidragsyter i Mesos og produksjonsopplevelse innen SRE i verdensklasse hos Improbable. Han jobber med Ă„ forbedre mikroserviceverdenen. Hans tre kjĂŠrligheter: Golang, open source og volleyball.
Ser man pÄ vÄrt flaggskipprodukt SpatialOS, kan man gjette at Improbable trenger en hÞy-dynamisk skyinfrastruktur pÄ global skala med titalls Kubernetes-klynger. Vi var blant de fÞrste til Ä begynne Ä bruke overvÄkningssystemet . Prometheus kan spore millioner av metrikker i sanntid og leveres med et kraftig spÞrringssprÄk som gjÞr det mulig Ä hente nÞdvendig informasjon.
Simplicity and reliability is one of Prometheus's main advantages. However, after reaching a certain scale, we faced several shortcomings. To solve these issues, we developed â et prosjekt med Ă„pen kildekode utviklet av Improbable, for sĂžmlĂžs transformasjon av eksisterende Prometheus-klynger til et samlet overvĂ„kingssystem med ubegrenset lagring av historiske data. Thanos er tilgjengelig pĂ„ Github .
VÄre mÄl med Thanos
Ved en viss skala oppstÄr problemer som overstiger evnene til vanilje-Prometheus. Hvordan lagre petabyte av historiske data pÄ en trygg og kostnadseffektiv mÄte? Kan dette gjÞres uten Ä gÄ pÄ bekostning av responstiden pÄ forespÞrselen? Kan man fÄ tilgang til alle metrikker pÄ forskjellige Prometheus-servere med én API-forespÞrsel? Er det mulig Ä pÄ en eller annen mÄte kombinere dupliserte data samlet med Prometheus HA?
For Ä lÞse disse spÞrsmÄlene har vi laget Thanos. I de fÞlgende avsnittene beskrives hvordan vi nÊrmet oss lÞsningene pÄ disse problemene og de mÄlene vi hadde.
ForespĂžrsel om data fra flere Prometheus-installasjoner (global query)
Prometheus tilbyr en funksjonell tilnÊrming til sharding. Selv en enkelt Prometheus-server gir tilstrekkelig skalerbarhet til Ä frigjÞre brukerne fra kompleksiteten av horisontal sharding i praktisk talt alle bruksomrÄder.
Selv om dette er en utmerket distribusjonsmodell, er det ofte nĂždvendig Ă„ fĂ„ tilgang til data pĂ„ forskjellige Prometheus-servere via et enkelt API eller UI â global visning. SelvfĂžlgelig kan flere forespĂžrseler vises i en enkelt Grafana-panel, men hver forespĂžrsel kan kun utfĂžres pĂ„ Ă©n Prometheus-server. PĂ„ den annen side kan du med Thanos forespĂžrre og aggregere data fra flere Prometheus-servere, siden alle er tilgjengelige fra ett endepunkt.
Tidligere, for Ä oppnÄ global visning i Improbable, organiserte vi vÄre Prometheus-installasjoner i en lagdelt . Dette innebar opprettelse av en meta-server for Prometheus som samler inn enkelte metrikker fra hver "blad"-server.

Denne tilnÊrmingen viste seg Ä vÊre problematisk. Den fÞrte til komplisert konfigurasjon, la til en ekstra potensiell feilkilde og pÄfÞrte komplekse regler for Ä tilby den federerte endepunktet kun de nÞdvendige dataene. I tillegg tillater ikke slik federasjon virkelig Ä oppnÄ en global visning, ettersom ikke alle data er tilgjengelige fra én API-forespÞrsel.
Dette er nÊrt knyttet til et enhetlig syn pÄ data samlet pÄ hÞytilgjengelige (high-availability, HA) Prometheus-servere. HA-modellen til Prometheus samler uavhengig data to ganger, noe som er sÄ enkelt at det knapt kan bli enklere. Det ville imidlertid vÊrt veldig praktisk Ä bruke et samlet og deduplisert syn pÄ begge strÞmmer.
SelvfÞlgelig er det et behov for hÞytilgjengelige servere for Prometheus. I Improbable tar vi virkelig dataovervÄking pÄ minuttbasis alvorlig, men Ä ha en enkelt instans av Prometheus i klyngen er et enkelt feilpunkt. Enhver konfigurasjonsfeil eller maskinvarefeil kan potensielt fÞre til tap av viktig data. Selv en enkel distribusjon kan fÞre til smÄ avbrudd i innsamlingen av metrikker, siden omstart kan ta betydelig lengre tid enn skrapetintervallet.
PÄlitelige historiske data lagring
Billig, rask og langvarig lagring av metrikker er vÄr drÞm (som deles av de fleste brukere av Prometheus). Hos Improbable mÄtte vi sette lagringsperioden for metrikker til ni dager (for Prometheus 1.8). Dette legger Äpenbare begrensninger pÄ hvor langt tilbake vi kan se.
Prometheus 2.0 har blitt bedre pÄ dette omrÄdet, ettersom antall tidsserier ikke lenger pÄvirker den totale ytelsen til serveren (se ). Likevel lagrer Prometheus data pÄ lokal disk. Selv om hÞyeffektiv datakomprimering kan redusere bruken av lokal SSD betydelig, finnes det til slutt fortsatt en grense for mengden historiske data som kan lagres.
I tillegg bryr vi oss hos Improbable om pÄlitelighet, enkelhet og kostnad. Store lokale disker er vanskeligere Ä administrere og sikkerhetskopiere. De er dyrere og krever flere verktÞy for sikkerhetskopiering, noe som fÞrer til unÞdvendig kompleksitet.
Nedsampling
Da vi begynte Ä jobbe med historiske data, innsÄ vi at det finnes fundamentale vanskeligheter med O-stor, som gjÞr at forespÞrslene blir tregere og tregere nÄr vi jobber med data over uker, mÄneder og Är.
Den standard lĂžsningen pĂ„ dette problemet vil vĂŠre (downsampling) â redusere samplingfrekvensen av signalet. Ved Ă„ senke samplingfrekvensen kan vi "skalere ned" til et stĂžrre tidsrom og opprettholde det samme antallet prĂžver, noe som vil bevare responsiviteten i forespĂžrslene.
Nedsampling av eldre data er et uunngÄelig krav for enhver lÞsning for langsiktig lagring og gÄr utover vanilje-Prometheus.
Ytterligere mÄl
Et av de opprinnelige mÄlene med Thanos-prosjektet var sÞmlÞs integrasjon med eksisterende Prometheus-installasjoner. Det andre mÄlet var enkel drift med minimal inngangsbarriere. Eventuelle avhengigheter mÄ kunne oppfylles enkelt for bÄde smÄ og store brukere, noe som ogsÄ innebÊrer at den grunnleggende kostnaden er ubetydelig.
Thanos-arkitektur
Etter at vi har listet opp vÄre mÄl i avsnittet ovenfor, la oss jobbe med dem og se hvordan Thanos lÞser disse problemene.
Global visning
For a global view over existing Prometheus instances, we need to link a single entry point for requests to all servers. This is precisely what the Thanos component does. . It is deployed alongside each Prometheus server and acts as a proxy, serving local Prometheus data through the gRPC Store API interface, allowing for time series data selection by labels and time range.
On the other side is a horizontally scalable, stateless Querier component, which does a bit more than just answering PromQL queries via the standard Prometheus HTTP API. The Querier, Sidecar, and other Thanos components interact through .

- When the Querier receives a request, it connects to the corresponding Store API server, namely our Sidecars, and retrieves time series data from the relevant Prometheus servers.
- It then combines the responses and executes the PromQL query on them. The Querier can merge both non-overlapping and duplicated data from HA Prometheus servers.
This solves the main part of our puzzle â merging data from isolated Prometheus servers into a single view. In fact, Thanos can be used solely for this capability. No modifications are needed on existing Prometheus servers!
Unlimited storage duration!
However, sooner or later we will want to retain data that goes beyond the usual retention period of Prometheus. For storing historical data, we chose object storage. It is widely available in any cloud and also in local data centers, and it's very cost-effective. Moreover, virtually any object storage is accessible via the well-known S3 API.
Prometheus writes data from memory to disk approximately every two hours. A block of stored data contains all data for a fixed time interval and is immutable. This is very convenient, as Thanos Sidecar can simply look at the Prometheus data directory and load new blocks into the object storage buckets as they appear.

Uploading to object storage immediately after writing to disk also helps maintain the simplicity of the scraper (Prometheus and Thanos Sidecar), which simplifies system maintenance, cost, and design.
Som du kan se, er det veldig enkelt Ă„ ta sikkerhetskopi av data. Men hva med forespĂžrselen til dataene i objektlagringen?
Thanos Store-komponenten fungerer som en proxy for Ă„ hente data fra objektlagringen. Akkurat som Thanos Sidecar deltar den i et gossip-kluster og implementerer Store API. Dermed kan eksisterende Querier behandle den som Sidecar, som en annen kilde til tidsseriedata â ingen spesialkonfigurasjon er nĂždvendig.

Tidsseriedataene bestĂ„r av flere store filer. Ă
laste dem pÄ forespÞrsel ville vÊrt ganske ineffektivt, og lokal caching ville krevd enorme ressurser for minne og lagringsplass.
I stedet vet Store Gateway hvordan man hÄndterer Prometheus lagringsformat. Takket vÊre en smart forespÞrselplanlegger og caching av bare nÞdvendige indeksdeler av blokkene, er det mulig Ä redusere komplekse forespÞrsel til et minimum av HTTP-forespÞrsel til filer i objektlagringen. Dermed kan antallet forespÞrsel reduseres med fire til seks stÞrrelsesordener og oppnÄ responstid som generelt er vanskelig Ä skille fra forespÞrsel til data pÄ lokal SSD.

Som vist i diagrammet ovenfor, reduserer Thanos Querier kostnadene for en forespÞrsel til data i objektlagringen betydelig ved Ä bruke Prometheus lagringsformat og plassere relaterte data nÊr hverandre. Ved Ä bruke denne tilnÊrmingen kan vi sammenslÄ mange individuelle forespÞrsel til et minimum av bulk-operasjoner.
Kompresjon og nedsampling
Etter at en ny blokk med tidsseriedata har blitt lastet opp til objektlagringen, betrakter vi den som "historiske" data som umiddelbart blir tilgjengelige via Store Gateway.
Imidlertid, etter en stund, akkumuleres blokkene fra en kilde (Prometheus med Sidecar) og utnytter ikke lenger hele indekseringspotensialet. For Ä lÞse dette problemet har vi introdusert en annen komponent kalt Compactor. Den bruker ganske enkelt den lokale kompresjonsmekanismen til Prometheus pÄ de historiske dataene i objektlagringen og kan kjÞres som en enkel periodisk batchjobb.

Takk vere effektiv komprimering, utgjer ikkje forespÞrselen i lagringssystemet eit problem sjÞlv over lengre tid frÄ eit datastÞrrelsesynspunkt. Men den potensielle kostnaden ved Ä pakke ut milliardar av verdiar og kÞyre dei gjennom forespÞrselbehandlaren vil uunngÄeleg fÞre til ein markant auke i behandlingstida for forespÞrselen. PÄ den andre sida, sidan kvar skjermpiksel har hundrevis av datapunkt, blir det umogleg Ä visualisere data i full opplÞysing. SÄleis er nedoverprÞving ikkje berre mogleg, men fÞrer heller ikkje til merkbar tap av presisjon.

For nedoverprÞving av data aggregerer Compactor kontinuerleg data med ei opplÞysing pÄ fem minutt og ein time. For kvar rÄdel av data koda med TSDB XOR-komprimering, blir ulike typar aggregerte data lagra, som min, max eller sum for ei blokk. Dette gjer at Querier automatisk kan velje aggreget som passar for den aktuelle PromQL-forespÞrselen.
For Ă„ bruke data med redusert presisjon treng brukaren ingen spesialkonfigurasjon. Querier vekslar automatisk mellom ulike opplĂžysingar og rĂ„data etter kvart som brukaren zoomar inn og ut. Om Ăžnskelig kan brukaren styre dette direkte via parameteren âstepâ i forespĂžrselen.
Sidan kostnaden for lagring av ein GB er lÄg, lagrar Thanos som standard rÄdata, data med ei opplÞysing pÄ fem minutt og pÄ ein time. Det er ikkje behov for Ä slette raw data.
Opptakreglar
SjÞlv utan Thanos er opptakreglar ein viktig del av overvÄkingsstakken. Dei reduserer kompleksitet, latency og kostnad ved forespÞrslene. Dei er ogsÄ nyttige for brukarar nÄr det gjeld Ä fÄ aggregerte data om metrikkar. Thanos bygger pÄ vanlige instansar av Prometheus, sÄ det er heilt akseptabelt Ä lagre opptakreglar og varslingsreglar pÄ den eksisterande Prometheus-serveren. Men i nokre tilfelle kan dette vere utilstrekkeleg:
- Globale varslar og reglar (for eksempel varsling nÄr tenesta ikkje fungerer pÄ meir enn to av tre klynger).
- Regel for data utanfor det lokale lagringssystemet.
- Ănsket om Ă„ lagre alle reglar og varslar pĂ„ eitt staden.

For all these cases, Thanos includes a separate component called Ruler, which computes rules and alerts through Thanos Queries. By providing the well-known StoreAPI, the Query node can access freshly computed metrics. Later, they are also stored in object storage and made available through Store Gateway.
The Power of Thanos
Thanos is flexible enough to be tailored to your needs. This is especially useful when migrating from a simple Prometheus. Letâs quickly recall what we learned about Thanos components with a small example. Hereâs how to transition your vanilla Prometheus into the world of âunlimited metric storageâ:

- Add Thanos Sidecar to your Prometheus servers â for instance, as an adjacent container in a Kubernetes pod.
- Deploy multiple replicas of Thanos Querier for data viewing capabilities. At this stage, it's easy to set up gossip between Scraper and Querier. To verify component interaction, use the âthanos_cluster_membersâ metric.
These two steps alone are enough to ensure a global view and seamless deduplication of data from potential HA replicas of Prometheus! Simply connect your dashboards to the HTTP endpoint of Querier or use the Thanos UI directly.
However, if you require metric backup and long-term storage, you will need to complete three more steps:
- Create an AWS S3 or GCS bucket. Configure the Sidecar to copy data into these buckets. You can now minimize local data storage.
- Deploy Store Gateway and connect it to the existing gossip cluster. You can now send queries to the backup data!
- Deploy Compactor to enhance query efficiency for longer time intervals using compaction and downsampling.
If you want to learn more, feel free to check out our og !
In just five steps, we transformed Prometheus into a reliable monitoring system with a global view, unlimited retention time, and potential high availability of metrics.
Pull request: we need you!
has been an open-source project from the very beginning. Seamless integration with Prometheus and the ability to use only part of Thanos makes it a great choice for scaling the monitoring system without unnecessary effort.
Vi er alltid glade for GitHub Pull Requests og Issues. Samtidig, ikke nĂžl med Ă„ kontakte oss via Github Issues eller slack, hvis du har spĂžrsmĂ„l eller tilbakemeldinger, eller hvis du Ăžnsker Ă„ dele din erfaring med oss! Hvis du liker det vi gjĂžr i Improbable, ikke nĂžl med Ă„ ta kontakt med oss â !
Kilde: habr.com
