Mwen sijere ou li transkripsyon rapò 2019 Alexander Valyalkin "Ale optimize nan VictoriaMetrics"
Men yon lyen ki mennen nan videyo rapò sa a -
Pale nou de ou. Mwen se Alexander Valyalkin. Isit la 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.
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.
È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.
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.
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.
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
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
.
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 yolabel=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
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=value
kote 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
.
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.
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.
Pwoblèm sa a ka rezoud lè l sèvi avèk solisyon pare yo tankou
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
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
.
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.
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 :)
Se konsa, mwen te ekri pwòp aplikasyon mwen an nan endèks la Envèse. Epi li rele l
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è
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.
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.
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.
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.
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.
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.
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.
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
.
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
.
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.
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.
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.
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
.
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.
Ann konsidere aplikasyon estrikti sa a. Si ou vle gade, li sitiye nan sous yo VictoriaMetrics, nan katab la 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.
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
.
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 abucket32
. Chak estrikti magazenhi
jaden. Sa yo se 32 bit ki anwo yo. Ak de tranch -b16his
иbuckets
nanbucket16
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.
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.
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
.
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.
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.
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
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
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
Chanèl Telegram
Se sèlman itilizatè ki anrejistre ki ka patisipe nan sondaj la.
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