Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Mwen sijere ou li transkripsyon rapò 2019 Alexander Valyalkin "Ale optimize nan VictoriaMetrics"

VictoriaMetrics - yon DBMS rapid ak évolutive pou estoke ak trete done nan fòm lan nan yon seri tan (dosye a fòme tan ak yon seri valè ki koresponn ak tan sa a, pou egzanp, jwenn nan biwo vòt peryodik nan estati a nan detèktè oswa koleksyon nan metrik).

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Men yon lyen ki mennen nan videyo rapò sa a - https://youtu.be/MZ5P21j_HLE

Dyapozitiv

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Pale nou de ou. Mwen se Alexander Valyalkin. Isit la kont GitHub mwen an. Mwen pasyone sou Go ak optimize pèfòmans. Mwen te ekri anpil bibliyotèk ki itil epi ki pa itil anpil. Yo kòmanse ak swa fast, oswa avèk quick prefiks.

Kounye a mwen ap travay sou VictoriaMetrics. Ki sa li ye e kisa m ap fè la? Mwen pral pale sou sa a nan prezantasyon sa a.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Plan rapò a se jan sa a:

  • Premyèman, mwen pral di w kisa VictoriaMetrics ye.
  • Lè sa a, mwen pral di ou ki seri tan yo ye.
  • Lè sa a, mwen pral di w ki jan yon baz done seri tan ap travay.
  • Apre sa, mwen pral di w sou achitekti baz done a: ki sa li konsiste de.
  • Apre sa, ann ale nan optimize yo ke VictoriaMetrics genyen. Sa a se yon optimize pou endèks la Envèse ak yon optimize pou aplikasyon an bitset nan Go.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Èske nenpòt moun nan odyans lan konnen kisa VictoriaMetrics ye? Wow, anpil moun deja konnen. Se yon bon nouvèl. Pou moun ki pa konnen, sa a se yon baz done seri tan. Li baze sou achitekti ClickHouse, sou kèk detay sou aplikasyon ClickHouse. Pou egzanp, sou tankou: MergeTree, kalkil paralèl sou tout nwayo processeur ki disponib ak optimize pèfòmans nan travay sou blòk done yo mete nan kachèt la processeur.

VictoriaMetrics bay pi bon konpresyon done pase lòt baz done seri tan.

Li balans vètikal - se sa ki, ou ka ajoute plis processeur, plis RAM sou yon sèl òdinatè. VictoriaMetrics pral itilize resous ki disponib sa yo avèk siksè epi li pral amelyore pwodiktivite lineyè.

VictoriaMetrics tou balanse orizontal - sa vle di, ou ka ajoute nœuds adisyonèl nan gwoup VictoriaMetrics la, epi pèfòmans li yo ap ogmante prèske lineyè.

Kòm ou devine, VictoriaMetrics se yon baz done rapid, paske mwen pa ka ekri lòt moun. Epi li ekri nan Go, kidonk mwen ap pale de li nan reyinyon sa a.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ki moun ki konnen ki sa yon seri tan? Li konn anpil moun tou. Yon seri tan se yon seri de pè (timestamp, значение), kote pè sa yo klase pa tan. Valè a se yon nimewo k ap flote - float64.

Chak seri tan inikman idantifye pa yon kle. Ki sa kle sa a konpoze? Li konsiste de yon seri pè kle-valè ki pa vid.

Isit la se yon egzanp yon seri tan. Kle a nan seri sa a se yon lis pè: __name__="cpu_usage" se non metrik la, instance="my-server" - sa a se òdinatè a sou ki metrik sa a kolekte, datacenter="us-east" - sa a se sant done kote òdinatè sa a ye.

Nou te fini ak yon non seri tan ki gen twa pè kle-valè. Kle sa a koresponn ak yon lis pè (timestamp, value). t1, t3, t3, ..., tN - sa yo se timestamps, 10, 20, 12, ..., 15 - valè korespondan yo. Sa a se itilizasyon CPU a nan yon moman bay pou yon ranje bay yo.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ki kote yo ka itilize seri tan? Èske yon moun gen okenn lide?

  • Nan DevOps, ou ka mezire CPU, RAM, rezo, rps, kantite erè, elatriye.
  • IoT - nou ka mezire tanperati, presyon, kowòdone geo ak yon lòt bagay.
  • Epitou finans - nou ka kontwole pri pou tout kalite aksyon ak lajan.
  • Anplis de sa, seri tan yo ka itilize nan siveyans pwosesis pwodiksyon nan faktori yo. Nou gen itilizatè ki sèvi ak VictoriaMetrics pou kontwole van turbin, pou robo.
  • Seri tan yo itil tou pou kolekte enfòmasyon ki soti nan detèktè divès aparèy. Pou egzanp, pou yon motè; pou mezire presyon kawotchou; pou mezire vitès, distans; pou mezire konsomasyon gazolin, elatriye.
  • Seri tan ka itilize tou pou kontwole avyon. Chak avyon gen yon bwat nwa ki kolekte seri tan pou divès paramèt nan sante avyon an. Seri tan yo itilize tou nan endistri ayewospasyal la.
  • Swen sante se tansyon, batman kè, elatriye.

Ka gen plis aplikasyon ke mwen bliye sou, men mwen espere ou konprann ke seri tan yo aktivman itilize nan mond lan modèn. Ak volim nan itilizasyon yo ap grandi chak ane.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Poukisa ou bezwen yon baz done seri tan? Poukisa ou pa ka itilize yon baz done relasyon regilye pou estoke seri tan?

Paske seri tan anjeneral gen yon gwo kantite enfòmasyon, ki difisil pou estoke ak trete nan baz done konvansyonèl yo. Se poutèt sa, baz done espesyalize pou seri tan parèt. Baz sa yo efektivman magazen pwen (timestamp, value) ak kle yo bay la. Yo bay yon API pou li done ki estoke pa kle, pa yon sèl pè kle-valè, oswa pa plizyè pè kle-valè, oswa pa regexp. Pou egzanp, ou vle jwenn chaj la CPU nan tout sèvis ou yo nan yon sant done nan Amerik, Lè sa a, ou bezwen sèvi ak pseudo-rekèt sa a.

Tipikman baz done seri tan yo bay lang rechèch espesyalize paske seri tan SQL pa trè byen adapte. Malgre ke gen baz done ki sipòte SQL, li pa trè apwopriye. Rechèch lang tankou PromQL, InfluxQL, Règ, Q. Mwen espere ke yon moun te tande omwen youn nan lang sa yo. Anpil moun te pwobableman tande pale sou PromQL. Sa a se lang rechèch Prometheus la.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Se sa ki sanble yon achitekti baz done seri tan modèn lè l sèvi avèk VictoriaMetrics kòm yon egzanp.

Li konsiste de de pati. Sa a se depo pou endèks la Envèse ak depo pou valè seri tan. Depo sa yo separe.

Lè yon nouvo dosye rive nan baz done a, nou premye jwenn aksè nan endèks la envèse pou jwenn idantifyan seri tan pou yon seri bay yo. label=value pou yon metrik bay. Nou jwenn idantifyan sa a epi sove valè a nan magazen done a.

Lè yon demann vini pou rekipere done ki soti nan TSDB, nou premye ale nan endèks la Envèse. Ann jwenn tout bagay timeseries_ids dosye ki koresponn ak seri sa a label=value. Lè sa a, nou jwenn tout done ki nesesè nan depo done a, endis pa timeseries_ids.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ann gade nan yon egzanp sou fason yon baz done seri tan trete yon rechèch fèk ap rantre.

  • Premye a tout li jwenn tout bagay timeseries_ids soti nan yon endèks Envèse ki genyen pè yo bay yo label=value, oswa satisfè yon ekspresyon regilye bay yo.
  • Lè sa a, li rekipere tout pwen done nan depo done a nan yon entèval tan bay yo pou yo jwenn yo timeseries_ids.
  • Apre sa, baz done a fè kèk kalkil sou pwen done sa yo, dapre demann itilizatè a. Apre sa, li retounen repons lan.

Nan prezantasyon sa a mwen pral pale w sou premye pati a. Sa a se yon rechèch timeseries_ids pa endèks envèse. Ou ka gade sou dezyèm pati a ak twazyèm pati a pita Sous VictoriaMetrics, oswa tann jiskaske mwen prepare lòt rapò :)

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ann ale nan endèks la Envèse. Anpil moun ka panse sa a se senp. Ki moun ki konnen ki sa yon endèks Envèse se ak ki jan li fonksyone? Oh, pa tèlman moun ankò. Ann eseye konprann sa li ye.

Li aktyèlman senp. Li se tou senpleman yon diksyonè ki kat yon kle nan yon valè. Ki sa ki se yon kle? Koup sa a label=valuekote label и value - sa yo se liy. Ak valè yo se yon seri timeseries_ids, ki gen ladan pè yo bay yo label=value.

Envèse endèks pèmèt ou byen vit jwenn tout bagay timeseries_ids, ki te bay label=value.

Li tou pèmèt ou jwenn byen vit timeseries_ids seri tan pou plizyè pè label=value, oswa pou koup label=regexp. Ki jan sa rive? Lè w jwenn entèseksyon seri a timeseries_ids pou chak pè label=value.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ann gade nan aplikasyon divès kalite endèks la Envèse. Ann kòmanse ak aplikasyon an nayif ki pi senp. Li sanble sa a.

Fonksyon getMetricIDs jwenn yon lis fisèl. Chak liy gen ladan l label=value. Fonksyon sa a retounen yon lis metricIDs.

Ki jan li fonksyone? Isit la nou gen yon varyab mondyal ki rele invertedIndex. Sa a se yon diksyonè regilye (map), ki pral kat fisèl la nan tranch ints. Liy la gen ladan l label=value.

Fonksyon aplikasyon: jwenn metricIDs pou premye a label=value, Lè sa a, nou ale nan tout lòt bagay label=value, nou jwenn li metricIDs pou yo. Epi rele fonksyon an intersectInts, ki pral diskite anba a. Ak fonksyon sa a retounen entèseksyon lis sa yo.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Kòm ou ka wè, mete ann aplikasyon yon endèks Envèse pa trè konplike. Men, sa a se yon aplikasyon nayif. Ki dezavantaj li genyen? Dezavantaj prensipal la nan aplikasyon an nayif se ke tankou yon endèks Envèse ki estoke nan RAM. Apre rekòmanse aplikasyon an nou pèdi endèks sa a. Pa gen okenn ekonomize endèks sa a sou disk. Yon endèks Envèse konsa pa gen anpil chans pou yo apwopriye pou yon baz done.

Dezavantaj nan dezyèm se tou ki gen rapò ak memwa. Endèks Envèse a dwe anfòm nan RAM. Si li depase gwosè a nan RAM, Lè sa a, evidamman nou pral jwenn - soti nan erè memwa. Ak pwogram nan pa pral travay.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Pwoblèm sa a ka rezoud lè l sèvi avèk solisyon pare yo tankou LevelDBOswa RocksDB.

An brèf, nou bezwen yon baz done ki pèmèt nou fè twa operasyon byen vit.

  • Premye operasyon an se anrejistreman ключ-значение nan baz done sa a. Li fè sa trè vit, kote ключ-значение yo se kòd abitrè.
  • Dezyèm operasyon an se yon rechèch rapid pou yon valè lè l sèvi avèk yon kle bay yo.
  • Ak twazyèm operasyon an se yon rechèch rapid pou tout valè pa yon prefiks bay yo.

LevelDB ak RocksDB - Google ak Facebook te devlope baz done sa yo. Premye te vini LevelDB. Lè sa a, mesye yo nan Facebook pran LevelDB epi yo te kòmanse amelyore li, yo te fè RocksDB. Koulye a, prèske tout baz done entèn yo travay sou RocksDB andedan Facebook, ki gen ladan sa yo ki te transfere nan RocksDB ak MySQL. Yo ba li non MyRocks.

Yon endèks Envèse ka aplike lè l sèvi avèk LevelDB. Ki jan fè li? Nou sove kòm yon kle label=value. Ak valè a se idantifyan seri tan kote pè a prezan label=value.

Si nou gen anpil seri tan ak yon pè bay label=value, Lè sa a, pral gen anpil ranje nan baz done sa a ak menm kle a ak diferan timeseries_ids. Pou jwenn yon lis tout timeseries_ids, ki kòmanse ak sa a label=prefix, nou fè yon eskanè ranje pou ki baz done sa a optimize. Sa vle di, nou chwazi tout liy ki kòmanse avèk yo label=prefix epi jwenn sa ki nesesè yo timeseries_ids.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Men yon echantiyon aplikasyon de sa li ta sanble nan Go. Nou gen yon endèks envèse. Sa a se LevelDB.

Fonksyon an se menm jan ak aplikasyon nayif la. Li repete aplikasyon nayif la prèske liy pa liy. Sèl pwen se sa olye de vire pou map nou jwenn aksè nan endèks la Envèse. Nou jwenn tout valè yo pou premye a label=value. Lè sa a, nou ale nan tout pè ki rete yo label=value epi jwenn seri metricID korespondan yo pou yo. Lè sa a, nou jwenn entèseksyon an.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Tout bagay sanble ap byen, men gen dezavantaj nan solisyon sa a. Okòmansman, VictoriaMetrics te aplike yon endèks envèse ki baze sou LevelDB. Men, nan fen mwen te oblije abandone li.

Poukisa? Paske LevelDB pi dousman pase aplikasyon nayif la. Nan yon aplikasyon nayif, bay yon kle bay, nou imedyatman rekipere tout tranch la metricIDs. Sa a se yon operasyon trè vit - tout tranch la pare pou itilize.

Nan LevelDB, chak fwa yo rele yon fonksyon GetValues ou bezwen ale nan tout liy ki kòmanse ak label=value. Epi jwenn valè a pou chak liy timeseries_ids. Nan sa yo timeseries_ids kolekte yon ti tranch sa yo timeseries_ids. Li evidan, sa a se pi dousman pase tou senpleman aksè nan yon kat regilye pa kle.

Dezyèm dezavantaj la se ke LevelDB ekri nan C. Rele C fonksyon soti nan Go se pa trè vit. Li pran dè santèn de nanosegond. Sa a se pa trè vit, paske konpare ak yon apèl fonksyon regilye ekri nan ale, ki pran 1-5 nanosegond, diferans lan nan pèfòmans se dè dizèn de fwa. Pou VictoriaMetrics sa a se te yon defo fatal :)

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Se konsa, mwen te ekri pwòp aplikasyon mwen an nan endèks la Envèse. Epi li rele l fizyone.

Mergeset baze sou estrikti done MergeTree. Se estrikti done sa a prete nan men ClickHouse. Li evidan, mergeset ta dwe optimize pou rechèch rapid timeseries_ids dapre kle yo bay la. Mergeset ekri antyèman nan Go. Ou ka wè Sous VictoriaMetrics sou GitHub. Aplikasyon an nan mergeset se nan katab la /lib/mergeset. Ou ka eseye konnen sa k ap pase la.

API mergeset la sanble anpil ak LevelDB ak RocksDB. Sa vle di, li pèmèt ou byen vit sove nouvo dosye la epi byen vit chwazi dosye pa yon prefiks bay yo.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Nou pral pale sou dezavantaj yo nan mergeset pita. Koulye a, ann pale sou ki pwoblèm ki te parèt ak VictoriaMetrics nan pwodiksyon lè yo te aplike yon endèks Envèse.

Poukisa yo te leve?

Premye rezon an se gwo pousantaj désabonnement. Tradui nan Ris, sa a se yon chanjman souvan nan seri tan. Sa a se lè yon seri tan fini ak yon nouvo seri kòmanse, oswa anpil nouvo seri tan kòmanse. E sa rive souvan.

Dezyèm rezon an se gwo kantite seri tan. Nan kòmansman an, lè siveyans te pran popilarite, kantite seri tan yo te piti. Pou egzanp, pou chak òdinatè ou bezwen kontwole CPU, memwa, rezo ak chaj disk. 4 seri tan pou chak òdinatè. Ann di ou gen 100 òdinatè ak 400 seri tan. Sa a trè piti.

Apre yon tan, moun te kalkile ke yo te kapab mezire plis enfòmasyon granulaire. Pou egzanp, mezire chaj la pa nan processeur a tout antye, men separeman nan chak nwayo processeur. Si ou gen 40 nwayo processeur, Lè sa a, ou gen 40 fwa plis seri tan pou mezire chaj processeur.

Men, sa se pa tout. Chak nwayo processeur ka gen plizyè eta, tankou san fè anyen konsa, lè li san fè anyen konsa. Epi tou travay nan espas itilizatè, travay nan espas nwayo ak lòt eta yo. Epi chak eta sa yo ka mezire tou kòm yon seri tan separe. Sa a Anplis de sa ogmante kantite ranje pa 7-8 fwa.

Soti nan yon metrik nou te resevwa 40 x 8 = 320 metrik pou jis yon òdinatè. Miltipliye pa 100, nou jwenn 32 olye de 000.

Lè sa a, Kubernetes te vini ansanm. Epi li te vin pi mal paske Kubernetes ka òganize anpil sèvis diferan. Chak sèvis nan Kubernetes konsiste de anpil gous. Ak tout sa a bezwen yo dwe kontwole. Anplis de sa, nou gen yon deplwaman konstan nan nouvo vèsyon sèvis ou yo. Pou chak nouvo vèsyon, yo dwe kreye nouvo seri tan. Kòm yon rezilta, kantite seri tan ap grandi yon fason eksponansyèl epi nou fè fas ak pwoblèm nan nan yon gwo kantite seri tan, ki rele segondè-cardinality. VictoriaMetrics fè fas ak li avèk siksè konpare ak lòt baz done seri tan.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ann pran yon gade pi pre nan gwo pousantaj désabonnement. Ki sa ki lakòz yon gwo pousantaj désabonnement nan pwodiksyon? Paske gen kèk siyifikasyon etikèt ak etikèt yo toujou ap chanje.

Pou egzanp, pran Kubernetes, ki gen konsèp la deployment, sa vle di lè yo lage yon nouvo vèsyon aplikasyon w lan. Pou kèk rezon, devlopè Kubernetes yo deside ajoute id deplwaman an sou etikèt la.

Ki sa ki te mennen nan? Anplis, ak chak nouvo deplwaman, tout ansyen seri tan yo entèwonp, epi olye pou yo, nouvo seri tan kòmanse ak yon nouvo valè etikèt. deployment_id. Kapab genyen dè santèn de milye e menm dè milyon de ranje sa yo.

Sa ki enpòtan sou tout bagay sa yo se ke kantite total seri tan ap grandi, men kantite seri tan ki aktif kounye a epi k ap resevwa done rete konstan. Eta sa a rele gwo pousantaj désabonnement.

Pwoblèm prensipal la nan gwo pousantaj désabonnement se asire yon vitès rechèch konstan pou tout seri tan pou yon seri etikèt bay sou yon sèten entèval tan. Tipikman sa a se entèval tan pou dènye èdtan an oswa dènye jou a.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ki jan yo rezoud pwoblèm sa a? Men premye opsyon. Sa a se divize endèks la Envèse an pati endepandan sou tan. Sa vle di, kèk entèval tan pase, nou fini travay ak endèks aktyèl la Envèse. Epi kreye yon nouvo endèks Envèse. Yon lòt entèval tan pase, nou kreye yon lòt ak yon lòt.

Epi lè w pran echantiyon nan endis envèse sa yo, nou jwenn yon seri endis envèse ki tonbe nan entèval yo bay la. Epi, kòmsadwa, nou chwazi id seri tan an soti nan la.

Sa a sove resous paske nou pa bezwen gade nan pati ki pa tonbe nan entèval yo bay la. Sa vle di, anjeneral, si nou chwazi done pou dènye èdtan an, Lè sa a, pou entèval tan anvan nou sote demann.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Gen yon lòt opsyon pou rezoud pwoblèm sa a. Sa a se pou estoke pou chak jou yon lis separe idantite seri tan ki te fèt nan jou sa a.

Avantaj nan solisyon sa a sou solisyon anvan an se ke nou pa kopi enfòmasyon seri tan ki pa disparèt sou tan. Yo toujou prezan epi yo pa chanje.

Dezavantaj la se ke yon solisyon konsa pi difisil pou aplike ak pi difisil pou debogaj. Ak VictoriaMetrics te chwazi solisyon sa a. Se konsa sa te pase istorikman. Solisyon sa a tou fè byen konpare ak yon sèl anvan an. Paske solisyon sa a pa te aplike akòz lefèt ke li nesesè kopi done nan chak patisyon pou seri tan ki pa chanje, sa vle di ki pa disparèt sou tan. VictoriaMetrics te optimize prensipalman pou konsomasyon espas disk, ak aplikasyon anvan an te fè konsomasyon espas disk vin pi mal. Men, aplikasyon sa a pi byen adapte pou minimize konsomasyon espas ki gen kapasite, kidonk li te chwazi.

Mwen te oblije goumen ak li. Lit la te ke nan aplikasyon sa a ou toujou bezwen chwazi yon kantite pi gwo timeseries_ids pou done pase lè endèks la envèse se tan partisyone.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ki jan nou te rezoud pwoblèm sa a? Nou rezoud li nan yon fason orijinal - nan estoke plizyè idantifyan seri tan nan chak antre endèks Envèse olye pou yo yon sèl idantifyan. Sa vle di, nou gen yon kle label=value, ki rive nan chak seri tan. Epi, koulye a nou sove plizyè timeseries_ids nan yon sèl antre.

Men yon egzanp. Anvan nou te gen N antre, men kounye a nou gen yon sèl antre ki gen prefiks menm jan ak tout lòt yo. Pou antre anvan an, valè a gen tout idantite seri tan.

Sa a te fè li posib ogmante vitès la optik nan tankou yon endèks Envèse jiska 10 fwa. Epi li pèmèt nou diminye konsomasyon memwa pou kachèt la, paske kounye a nou estoke fisèl la label=value sèlman yon fwa nan kachèt la ansanm N fwa. Ak liy sa a ka gwo si ou estoke liy long nan tags ou yo ak etikèt, ki Kubernetes renmen pouse la.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Yon lòt opsyon pou pi vit rechèch sou yon endèks Envèse se sharding. Kreye plizyè endèks Envèse olye pou yo yon sèl ak sharding done ant yo pa kle. Sa a se yon seri key=value vapè. Sa vle di, nou jwenn plizyè endèks Envèse endepandan, ke nou ka rechèch an paralèl sou plizyè processeur. Enplemantasyon anvan yo te pèmèt sèlman operasyon nan mòd yon sèl-processeur, sa vle di, eskanè done sou yon sèl nwayo sèlman. Solisyon sa a pèmèt ou eskane done sou plizyè nwayo alafwa, jan ClickHouse renmen fè. Se sa nou planifye pou aplike.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Koulye a, ann retounen nan mouton nou yo - nan fonksyon entèseksyon an timeseries_ids. Ann konsidere ki aplikasyon ki ka genyen. Fonksyon sa a pèmèt ou jwenn timeseries_ids pou yon seri bay label=value.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Premye opsyon a se yon aplikasyon nayif. De bouk enbrike. Isit la nou jwenn opinyon fonksyon an intersectInts de tranch - a и b. Nan pwodiksyon an, li ta dwe retounen nan nou entèseksyon tranch sa yo.

Yon aplikasyon nayif sanble sa a. Nou repete sou tout valè soti nan tranch a, andedan bouk sa a nou ale nan tout valè yo nan tranch b. Epi nou konpare yo. Si yo matche, lè sa a nou jwenn yon entèseksyon. Epi sove li nan result.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ki dezavantaj yo? Konpleksite kwadratik se dezavantaj prensipal li yo. Pou egzanp, si dimansyon ou yo se tranch a и b yon milyon alafwa, lè sa a fonksyon sa a p'ap janm retounen yon repons ba ou. Paske li pral bezwen fè yon billions iterasyon, ki se yon anpil menm pou òdinatè modèn.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Dezyèm aplikasyon an baze sou kat jeyografik. Nou kreye kat jeyografik. Nou mete tout valè yo nan tranch nan kat sa a a. Lè sa a, nou ale nan tranch nan yon bouk separe b. Epi nou tcheke si valè sa a soti nan tranch b nan kat jeyografik. Si li egziste, ajoute li nan rezilta a.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ki benefis ki genyen? Avantaj la se ke gen sèlman konpleksite lineyè. Sa vle di, fonksyon an pral egzekite anpil pi vit pou pi gwo tranch. Pou yon tranch yon milyon, fonksyon sa a pral egzekite nan 2 milyon iterasyon, kontrèman ak iterasyon milya dola nan fonksyon anvan an.

Dezavantaj la se ke fonksyon sa a mande plis memwa pou kreye kat sa a.

Dezyèm dezavantaj la se gwo tèt pou hachaj. Dezavantaj sa a pa trè evidan. E pou nou tou li pa t 'très evidan, se konsa nan premye nan VictoriaMetrics aplikasyon an nan entèseksyon te atravè yon kat. Men, Lè sa a, profilage te montre ke tan prensipal la processeur te pase ekri nan kat jeyografik la ak tcheke pou prezans nan yon valè nan kat sa a.

Poukisa tan CPU gaspiye nan kote sa yo? Paske Go fè yon operasyon hashing sou liy sa yo. Sa vle di, li kalkile hash la nan kle a nan lòd yo Lè sa a, jwenn aksè nan li nan yon endèks yo bay nan HashMap la. Operasyon kalkil hash la fini an dè dizèn de nanosegond. Sa ralanti pou VictoriaMetrics.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Mwen deside aplike yon bitset optimize espesyalman pou ka sa a. Sa a se sa ki entèseksyon an nan de tranch kounye a sanble. Isit la nou kreye yon bitset. Nou ajoute eleman ki soti nan premye tranch la. Lè sa a, nou tcheke prezans nan eleman sa yo nan dezyèm tranch la. Epi ajoute yo nan rezilta a. Sa vle di, li prèske pa diferan de egzanp anvan an. Bagay la sèlman isit la se ke nou ranplase aksè nan kat ak fonksyon koutim add и has.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Nan premye gade, li sanble ke sa a ta dwe travay pi dousman, si te deja itilize yon kat estanda la, ak Lè sa a, kèk lòt fonksyon yo rele, men profilage montre ke bagay sa a ap travay 10 fwa pi vit pase kat estanda a nan ka VictoriaMetrics.

Anplis de sa, li itilize anpil mwens memwa konpare ak aplikasyon kat jeyografik la. Paske nou ap estoke Bits isit la olye pou yo valè uit-byte.

Dezavantaj aplikasyon sa a se ke li pa tèlman evidan, pa trivial.

Yon lòt dezavantaj ke anpil moun ka pa remake se ke aplikasyon sa a ka pa mache byen nan kèk ka. Sa vle di, li optimize pou yon ka espesifik, pou ka sa a nan entèseksyon nan idantite seri tan VictoriaMetrics. Sa pa vle di ke li se apwopriye pou tout ka yo. Si yo itilize li mal, nou pa pral jwenn yon ogmantasyon pèfòmans, men yon erè memwa ak yon ralentissement nan pèfòmans.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ann konsidere aplikasyon estrikti sa a. Si ou vle gade, li sitiye nan sous yo VictoriaMetrics, nan katab la lib/uint64set. Li optimisé espesyalman pou ka VictoriaMetrics, kote timeseries_id se yon valè 64-bit, kote premye 32-bit yo fondamantalman konstan epi sèlman dènye 32-bit yo chanje.

Estrikti done sa a pa estoke sou disk, li sèlman opere nan memwa.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Isit la se API li yo. Li pa trè konplike. API a pwepare espesyalman pou yon egzanp espesifik lè l sèvi avèk VictoriaMetrics. Sa vle di, pa gen okenn fonksyon nesesè isit la. Men fonksyon ke VictoriaMetrics itilize klèman.

Gen fonksyon add, ki ajoute nouvo valè. Gen yon fonksyon has, ki tcheke pou nouvo valè. Epi gen yon fonksyon del, ki retire valè. Gen yon fonksyon asistan len, ki retounen gwosè a nan seri a. Fonksyon clone klon anpil. Ak fonksyon appendto konvèti seri sa a nan tranch timeseries_ids.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Sa a se sa aplikasyon an nan estrikti done sa a sanble. seri gen de eleman:

  • ItemsCount se yon jaden ki ede byen vit retounen kantite eleman nan yon seri. Li ta posib pou fè san jaden oksilyè sa a, men li te dwe ajoute isit la paske VictoriaMetrics souvan mande longè bitset nan algoritm li yo.

  • Dezyèm jaden an se buckets. Sa a se tranch nan estrikti a bucket32. Chak estrikti magazen hi jaden. Sa yo se 32 bit ki anwo yo. Ak de tranch - b16his и buckets nan bucket16 estrikti.

Top 16 Bits nan dezyèm pati nan estrikti 64-bit yo estoke isit la. Ak isit la bitsets yo estoke pou pi ba 16 Bits nan chak byte.

Bucket64 konsiste de yon etalaj uint64. Longè a kalkile lè l sèvi avèk konstan sa yo. Nan youn bucket16 maksimòm ka estoke 2^16=65536 ti jan. Si ou divize sa a pa 8, Lè sa a, li se 8 kilobyte. Si ou divize pa 8 ankò, li se 1000 uint64 siyifikasyon. Sa vle di Bucket16 – sa a se estrikti 8-kilobyte nou an.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ann gade ki jan youn nan metòd estrikti sa a pou ajoute yon nouvo valè aplike.

Li tout kòmanse ak uint64 siyifikasyon. Nou kalkile 32 bit ki anwo yo, nou kalkile 32 bit ki pi ba yo. Ann ale nan tout bagay buckets. Nou konpare tèt 32 bit yo nan chak bokit ak valè yo te ajoute. Men, si yo matche, Lè sa a, nou rele fonksyon an add nan estrikti b32 buckets. Epi ajoute 32 bit ki pi ba yo la. Men, si li tounen true, Lè sa a, sa vle di ke nou te ajoute yon valè konsa la epi nou pa t 'gen yon valè konsa. Si li retounen false, Lè sa a, yon siyifikasyon konsa te deja egziste. Lè sa a, nou ogmante kantite eleman nan estrikti a.

Si nou pa jwenn youn ou bezwen an bucket ak hi-valè ki nesesè yo, Lè sa a, nou rele fonksyon an addAlloc, ki pral pwodwi yon nouvo bucket, ajoute li nan estrikti bokit la.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Sa a se aplikasyon an nan fonksyon an b32.add. Li sanble ak aplikasyon anvan an. Nou kalkile 16 bit ki pi enpòtan yo, 16 bit ki pi piti yo.

Lè sa a, nou ale nan tout 16 Bits anwo yo. Nou jwenn match. Men, si gen yon matche ak, nou rele metòd la ajoute, ke nou pral konsidere nan pwochen paj la pou bucket16.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Ak isit la se nivo ki pi ba a, ki ta dwe optimize otank posib. Nou kalkile pou uint64 valè id nan ti tranch epi tou bitmask. Sa a se yon mask pou yon valè bay 64-bit, ki ka itilize yo tcheke prezans nan ti jan sa a, oswa mete li. Nou tcheke pou wè si ti jan sa a mete epi mete li, epi retounen prezans. Sa a se aplikasyon nou an, ki te pèmèt nou akselere operasyon an nan entèseksyon id nan seri tan pa 10 fwa konpare ak kat konvansyonèl yo.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Anplis optimize sa a, VictoriaMetrics gen anpil lòt optimize. Pifò nan optimize sa yo te ajoute pou yon rezon, men apre pwofil kòd la nan pwodiksyon an.

Sa a se règ prensipal la nan optimize - pa ajoute optimize asepte pral gen yon gou boutèy isit la, paske li ka vire soti pa pral gen yon gou boutèy la. Optimizasyon anjeneral degrade kalite kòd la. Se poutèt sa, li vo optimize sèlman apre profilage ak de preferans nan pwodiksyon, se konsa ke sa a se done reyèl. Si yon moun enterese, ou ka gade kòd sous VictoriaMetrics epi chèche lòt optimize ki la.

Ale optimize nan VictoriaMetrics. Alexander Valyalkin

Mwen gen yon kesyon sou bitset. Trè menm jan ak C++ vektè bool aplikasyon an, optimize bitset. Èske ou te pran aplikasyon an soti nan la?

Non, pa soti la. Lè m te mete ann aplikasyon bitset sa a, mwen te gide pa konesans estrikti seri idant sa yo, ki te itilize nan VictoriaMetrics. Ak estrikti yo se tankou ke anwo 32 Bits yo fondamantalman konstan. 32 Bits ki pi ba yo sijè a chanje. Pi ba ti jan an, pi souvan li ka chanje. Se poutèt sa, aplikasyon sa a espesyalman optimize pou estrikti done sa a. Aplikasyon C++, osi lwen ke mwen konnen, optimize pou ka jeneral la. Si ou optimize pou ka jeneral la, sa vle di ke li pa pral pi pi bon an pou yon ka espesifik.

Mwen konseye w tou gade repòtaj Alexey Milovid. Apeprè yon mwa de sa, li te pale sou optimize nan ClickHouse pou espesyalizasyon espesifik. Li jis di ke nan ka jeneral la, yon aplikasyon C++ oswa kèk lòt aplikasyon pwepare pou travay byen an mwayèn nan yon lopital. Li ka fè pi mal pase yon aplikasyon konesans espesifik tankou nou an, kote nou konnen ke 32 Bits yo pi wo yo se sitou konstan.

Mwen gen yon dezyèm kesyon. Ki diferans fondamantal ak InfluxDB?

Gen anpil diferans fondamantal. An tèm de pèfòmans ak konsomasyon memwa, InfluxDB nan tès yo montre 10 fwa plis konsomasyon memwa pou seri tan kardinalite segondè, lè ou gen anpil nan yo, pou egzanp, dè milyon. Pou egzanp, VictoriaMetrics konsome 1 GB pou chak milyon ranje aktif, pandan y ap InfluxDB konsome 10 GB. E sa se yon gwo diferans.

Dezyèm diferans fondamantal la se ke InfluxDB gen lang rechèch etranj - Flux ak InfluxQL. Yo pa trè pratik pou travay ak seri tan konpare ak PromQL, ki sipòte pa VictoriaMetrics. PromQL se yon langaj rechèch ki soti nan Prometheus.

Ak yon lòt diferans se ke InfluxDB gen yon modèl done yon ti kras etranj, kote chak liy ka estoke plizyè jaden ak yon seri diferan nan Tags. Liy sa yo plis divize an plizyè tab. Konplikasyon adisyonèl sa yo konplike travay ki vin apre ak baz done sa a. Li difisil pou sipòte ak konprann.

Nan VictoriaMetrics tout bagay se pi senp. La, chak seri tan se yon kle-valè. Valè a se yon seri pwen - (timestamp, value), ak kle a se seri a label=value. Pa gen okenn separasyon ant jaden ak mezi. Li pèmèt ou chwazi nenpòt done ak Lè sa a, konbine, ajoute, soustraksyon, miltipliye, divize, kontrèman ak InfluxDB kote kalkil ant diferan ranje yo toujou pa aplike jan mwen konnen. Menm si yo aplike, li difisil, ou dwe ekri anpil kòd.

Mwen gen yon kesyon klarifye. Èske mwen konprann kòrèkteman ke te gen yon kalite pwoblèm ke ou te pale sou, ke endèks envèse sa a pa anfòm nan memwa, kidonk gen patisyon la?

Premyèman, mwen te montre yon aplikasyon nayif nan yon endèks Envèse sou yon kat estanda Go. Aplikasyon sa a pa apwopriye pou baz done paske endèks envèse sa a pa sove sou disk, epi baz done a dwe sove sou disk pou done sa yo rete disponib lè rekòmanse. Nan aplikasyon sa a, lè ou rekòmanse aplikasyon an, endèks envèse ou a pral disparèt. Epi ou pral pèdi aksè a tout done yo paske ou pa yo pral kapab jwenn li.

Bonjou! Mèsi pou rapò a! Non mwen se Pavel. Mwen soti nan Wildberries. Mwen gen kèk kesyon pou ou. Kesyon youn. Èske ou panse ke si ou te chwazi yon prensip diferan lè bati achitekti aplikasyon w lan ak patisyon done yo sou tan, Lè sa a, petèt ou ta kapab entèsekte done lè w ap chèche, ki baze sèlman sou lefèt ke yon patisyon gen done pou youn. peryòd de tan, se sa ki, nan yon sèl entèval tan epi ou pa ta gen enkyete sou lefèt ke moso ou yo gaye yon fason diferan? Kesyon nimewo 2 - depi w ap aplike yon algorithm menm jan an ak bitset ak tout lòt bagay, Lè sa a, petèt ou te eseye itilize enstriksyon processeur? Petèt ou te eseye optimize sa yo?

Mwen pral reponn dezyèm lan touswit. Nou poko rive nan pwen sa a. Men, si sa nesesè, nou pral rive la. Ak premye a, ki sa ki te kesyon an?

Ou te diskite de senaryo. Apre sa, yo te di ke yo te chwazi youn nan dezyèm ak yon aplikasyon ki pi konplèks. Apre sa, yo pa t 'pito youn nan premye, kote done yo se partisyone pa tan.

Wi. Nan premye ka a, volim total endèks la ta pi gwo, paske nan chak patisyon nou ta dwe estoke done kopi pou seri tan sa yo ki kontinye atravè tout patisyon sa yo. Men, si to seri tan ou a se piti, sa vle di menm seri yo toujou ap itilize, Lè sa a, nan premye ka a, nou ta pèdi pi plis nan kantite espas ki gen kapasite ki te okipe konpare ak dezyèm ka a.

Se konsa - wi, tan partitionnement se yon bon opsyon. Prometheus sèvi ak li. Men, Prometheus gen yon lòt dezavantaj. Lè fizyone moso done sa yo, li bezwen kenbe nan memwa enfòmasyon meta pou tout etikèt ak timeseries. Se poutèt sa, si moso done yo ke li fizyone yo gwo, Lè sa a, konsomasyon memwa ogmante anpil pandan fizyone, kontrèman ak VictoriaMetrics. Lè fizyone, VictoriaMetrics pa konsome memwa ditou; se sèlman yon koup kilookte ki konsome, kèlkeswa gwosè moso done yo fizyone.

Algorithm w ap itilize a sèvi ak memwa. Li make tags timeseries ki genyen valè. Ak fason sa a ou tcheke pou prezans pè nan yon etalaj done ak nan yon lòt. Epi ou konprann si kwaze te fèt oswa ou pa. Tipikman, baz done aplike kurseur ak iteratè ki estoke kontni aktyèl yo epi kouri atravè done yo klase akòz konpleksite a senp nan operasyon sa yo.

Poukisa nou pa itilize kurseur pou travèse done?

Wi.

Nou estoke ranje klase nan LevelDB oswa mergeset. Nou ka deplase kurseur a epi jwenn entèseksyon an. Poukisa nou pa sèvi ak li? Paske li dousman. Paske kurseur vle di ke ou bezwen rele yon fonksyon pou chak liy. Yon apèl fonksyon se 5 nanosegond. Men, si ou gen 100 liy, Lè sa a, li vire soti ke nou pase mwatye yon segonn jis rele fonksyon an.

Gen yon bagay konsa wi. E mon dernyen kestyon. Kesyon an ka son yon ti kras etranj. Poukisa li pa posib pou li tout total ki nesesè yo nan moman done yo rive epi sove yo nan fòm yo mande a? Poukisa sove gwo volim nan kèk sistèm tankou VictoriaMetrics, ClickHouse, elatriye, ak Lè sa a, pase anpil tan sou yo?

Mon ava donn en legzanp pou fer li pli kler. Ann di ki jan yon ti jwèt kontè vitès travay? Li anrejistre distans ou te vwayaje a, pandan tout tan an ajoute li nan yon valè, ak dezyèm fwa a. Epi divize. Epi li jwenn vitès mwayèn. Ou ka fè sou menm bagay la. Ajoute tout enfòmasyon ki nesesè yo sou vole a.

Oke, mwen konprann kesyon an. Egzanp ou a gen plas li. Si ou konnen ki total ou bezwen, Lè sa a, sa a se aplikasyon ki pi bon. Men, pwoblèm nan se ke moun sove mezi sa yo, kèk done nan ClickHouse epi yo poko konnen ki jan yo pral total ak filtre yo nan lavni an, kidonk yo dwe sove tout done yo anvan tout koreksyon. Men, si ou konnen ou bezwen kalkile yon bagay an mwayèn, Lè sa a, poukisa pa kalkile li olye pou yo estoke yon pakèt valè anvan tout koreksyon la? Men, sa a se sèlman si ou konnen egzakteman sa ou bezwen.

By wout la, baz done pou estoke seri tan sipòte konte nan total. Pou egzanp, Prometheus sipòte règ anrejistreman yo. Sa vle di, sa ka fè si ou konnen ki inite w ap bezwen. VictoriaMetrics pa gen sa a ankò, men li anjeneral anvan pa Prometheus, nan ki sa a ka fè nan règ yo kodaj.

Pou egzanp, nan travay anvan mwen an mwen te bezwen konte kantite evènman nan yon fenèt glisman sou dènye èdtan an. Pwoblèm lan se ke mwen te oblije fè yon aplikasyon koutim nan Go, sa vle di yon sèvis pou konte bagay sa a. Sèvis sa a te finalman ki pa trivial, paske li difisil pou kalkile. Aplikasyon an ka senp si ou bezwen konte kèk total nan entèval tan fiks. Si ou vle konte evènman nan yon fenèt glisman, Lè sa a, li pa senp tankou li sanble. Mwen panse ke sa poko aplike nan ClickHouse oswa nan baz done timeseries, paske li difisil pou aplike.

Ak yon lòt kesyon. Nou te jis pale sou mwayèn, epi mwen sonje ke te gen yon fwa tankou yon bagay tankou Graphite ak yon backend Kabòn. Epi li te konnen ki jan yo eklèsi done fin vye granmoun, se sa ki, kite yon pwen pou chak minit, yon pwen pou chak èdtan, elatriye. Nan prensip, sa a se byen pratik si nou bezwen done anvan tout koreksyon, relativman pale, pou yon mwa, ak tout lòt bagay ka dwe eklèsi. Men, Prometheus ak VictoriaMetrics pa sipòte fonksyonalite sa a. Èske li planifye pou sipòte li? Si non, poukisa pa?

Mèsi pou kesyon an. Itilizatè nou yo poze kesyon sa a detanzantan. Yo mande ki lè nou pral ajoute sipò pou downsampling. Gen plizyè pwoblèm isit la. Premyèman, chak itilizatè konprann downsampling yon bagay diferan: yon moun vle jwenn nenpòt pwen abitrè sou yon entèval bay, yon moun vle maksimòm, minimòm, valè mwayèn. Si anpil sistèm ekri done nan baz done ou a, Lè sa a, ou pa ka boul li tout ansanm. Li kapab ke chak sistèm mande diferan eklèsi. E sa i difisil pou enplimant.

Ak dezyèm bagay la se ke VictoriaMetrics, tankou ClickHouse, optimize pou travay sou gwo kantite done anvan tout koreksyon, kidonk li ka pèl yon milya liy nan mwens pase yon segonn si ou gen anpil nwayo nan sistèm ou an. Analize pwen seri tan nan VictoriaMetrics - 50 pwen pou chak segonn pou chak nwayo. Ak pèfòmans sa a balanse nan nwayo ki deja egziste. Sa vle di, si ou gen 000 nwayo, pou egzanp, ou pral eskane yon milya pwen pou chak segonn. Ak pwopriyete sa a nan VictoriaMetrics ak ClickHouse diminye bezwen an pou downsamling.

Yon lòt karakteristik se ke VictoriaMetrics efektivman konprese done sa yo. Konpresyon an mwayèn nan pwodiksyon se soti nan 0,4 a 0,8 bytes pou chak pwen. Chak pwen se yon timestamp + valè. Epi li se konprese nan mwens pase yon byte an mwayèn.

Sergey. Mwen gen yon kesyon. Ki kantite minimòm tan anrejistreman an?

Yon milisgond. Nou dènyèman te gen yon konvèsasyon ak lòt devlopè baz done seri tan. Tranch tan minimòm yo se yon segonn. Ak nan Graphite, pou egzanp, li la tou yon segonn. Nan OpenTSDB li se tou yon segonn. InfluxDB gen presizyon nanosecond. Nan VictoriaMetrics li se yon milisgond, paske nan Prometheus li se yon milisgond. Ak VictoriaMetrics te orijinal devlope kòm depo aleka pou Prometheus. Men koulye a, li ka sove done ki soti nan lòt sistèm yo.

Moun mwen te pale ak yo di ke yo gen presizyon dezyèm a dezyèm - sa a ase pou yo paske li depann de ki kalite done ke yo te estoke nan baz done seri tan an. Si sa a se done DevOps oswa done ki soti nan enfrastrikti, kote ou kolekte li nan entèval 30 segonn, pou chak minit, Lè sa a, dezyèm presizyon se ase, ou pa bezwen anyen mwens. Men, si ou kolekte done sa yo soti nan sistèm komès segondè frekans, Lè sa a, ou bezwen presizyon nanosecond.

Presizyon milisgond nan VictoriaMetrics tou apwopriye pou ka DevOps la, epi li ka apwopriye pou pifò ka yo ke mwen mansyone nan kòmansman rapò a. Bagay la sèlman pou ki li ka pa apwopriye se sistèm komès segondè frekans.

Mèsi! Ak yon lòt kesyon. Ki sa ki konpatibilite nan PromQL?

Konpatibilite konplè bak. VictoriaMetrics konplètman sipòte PromQL. Anplis de sa, li ajoute plis fonksyonalite avanse nan PromQL, ki rele MetricsQL. Gen yon pale sou YouTube sou fonksyonalite pwolonje sa a. Mwen te pale nan reyinyon Siveyans nan sezon prentan an nan St.

Chanèl Telegram VictoriaMetrics.

Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la. Enskri, tanpri.

Ki sa ki anpeche w chanje nan VictoriaMetrics kòm depo alontèm ou pou Prometheus? (Ekri nan kòmantè yo, mwen pral ajoute li nan biwo vòt la))

  • 71,4%Mwen pa sèvi ak Prometheus5

  • 28,6%Pa t 'konnen sou VictoriaMetrics2

7 itilizatè yo te vote. 12 itilizatè te absteni.

Sous: www.habr.com

Add nouvo kòmantè