HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

jÀrgmine HighLoad++ konverents toimub 6. ja 7. aprillil 2020 Peterburis.
Üksikasjad ja piletid lingi kaudu. HighLoad++ Siberia 2019. Saal «Krasnojarsk». 25. juuni, 12:00. Teesid ja esitlus.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Kui praktilised nĂ”udmised ja teooria ei ĂŒhti, unustades kaubanduse jaoks olulised aspektid. Selles ettekandes tutvustatakse erinevate lĂ€henemisviiside valiku ja kombineerimise protsessi Causal consistency komponentide loomisel akadeemiliste uurimuste pĂ”hjal, arvestades kaubanduse vajadusi. Kuulajad saavad teada olemasolevatest teoreetilistest lĂ€henemisviisidest, nagu loogilised kellad, sĂ”ltuvuse jĂ€lgimine, sĂŒsteemi turvalisus, kella sĂŒnkroniseerimine, ja miks MongoDB valis teatud lahendused.

Mikhail Tyulenev (edaspidi - MT): – RÀÀgin Causal consistency'st – funktsioonist, millega töötasime MongoDB-s. Töötan jaotatud sĂŒsteemide grupis, me valmistasime selle toodanguks umbes kaks aastat tagasi.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Protsessis tuli tutvuda suure hulga akadeemilise uurimistööga, kuna see funktsioon on piisavalt hĂ€sti uuritud. Selgus, et ĂŒkski artikkel ei vasta sellele, mida produktsioonis vaja, andmebaasi arvestades erilisi nĂ”udeid, mis on tĂ”enĂ€oliselt igas produktsioonirakenduses.

Ma rÀÀgin sellest, kuidas meie, olles akadeemilise uurimistöö tarbija, valmistame sellest midagi, mida saame hiljem esitada oma kasutajatele valmistoiduna, millega on mugav ja ohutu töötada.

Kausaalne ĂŒhtsus (Causal consistency). MÀÀratleme mĂ”isted

Esiteks tahan ma ĂŒldiselt öelda, mis on kausaalne ĂŒhtsus. On kaks tegelast – Leonard ja Penny (sarjast „Suure PĂ€ikese Teooria“):

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Kujutage ette, et Penny on Euroopas ja Leonard soovib talle ĂŒllatust korraldada, nĂ€iteks pidu. Ta ei tule aga midagi paremat pĂ€he, kui kustutada Penny sĂ”bralistist, saata kĂ”igile sĂ”pradele uuendus feedis: "Naeratame Penny!" (ta on Euroopas, magab, ei nĂ€e seda kĂ”ike ja ei saa seda haarata, sest ta ei ole seal). LĂ”puks eemaldab ta selle postituse, kustutab selle "Feedist" ja taastab accessi, et ta ei mĂ€rkaks midagi ja skandaali ei tekiks.
See kĂ”ik on tore, aga oletame, et sĂŒsteem on jaotatud ja asjad ei lĂ€he pĂ€ris nii. NĂ€iteks vĂ”ib juhtuda, et Penny accessi piiramine toimus pĂ€rast seda, kui postitus ilmus, kui sĂŒndmused ei ole omavahel otseselt seotud. Tegelikult on see nĂ€ide, kus on vajalik Kausaalne kooskĂ”la, et tĂ€ita Ă€riĂŒlesanne (antud juhul).

Tegelikult on need ĂŒsna mittetriviaalne omadus andmebaasides – vĂ€ga vĂ€hesed toetavad neid. Liigume nĂŒĂŒd mudelite juurde.

KooskÔla mudelid (Consistency Models)

Mis on konsistentsi mudel andmebaasides? Need on teatud garantiid, mida jaotussĂŒsteem annab seoses sellega, milliseid andmeid ja millises jĂ€rjekorras klient saab.

PĂ”himĂ”tteliselt pĂ”hinevad kĂ”ik konsistentsimudelid sellele, kui sarnane jaotussĂŒsteem on sĂŒsteemile, mis töötab nĂ€iteks ĂŒhel madala taseme seadmel. Ja kui sarnane on sĂŒsteem, mis töötab tuhandetel geograafiliselt jaotatud nod’del, sĂŒlearvutile, kus kĂ”ik need omadused toimivad pĂ”himĂ”tteliselt automaatsetena.

SeetĂ”ttu rakendatakse konsistentsimudeleid ainult jaotussĂŒsteemide puhul. KĂ”ik sĂŒsteemid, mis varem eksisteerisid ja töötasid ĂŒhel vertikaalsel skaleerimisel, selliseid probleeme ei kogenud. Seal oli ĂŒks Buffer Cache ja sealt luges kĂ”ik alati vĂ€lja.

Mudel Strong

Esimene mudel on Strong (vĂ”i jĂ€rjepidevuse mudel, nagu seda sageli nimetatakse). See on konsistentsimudel, mis garanteerib, et iga muudatus, kui selle toimumise kohta on saadud kinnitus, muutub nĂ€htavaks kĂ”igile sĂŒsteemi kasutajatele.

See loob globaalne jĂ€rjestus kĂ”igile sĂŒndmustele andmebaasis. See on vĂ€ga tugev jĂ€rjepidevuse omadus ja ĂŒldiselt on see vĂ€ga kulukas. Siiski on see hĂ€sti toetatud. See on lihtsalt vĂ€ga kallis ja aeglane – seda kasutatakse harva. Seda nimetatakse rise ability.

On veel ĂŒks, tugevam omadus, mida toetab «Spanner» – seda nimetatakse vĂ€liseks jĂ€rjepidevuseks. RÀÀgime sellest natuke hiljem.

Causal

JĂ€rgmine on Causal, just see, mille ĂŒle ma rÀÀkisin. Tugeva ja Causal vahel on veel mitmeid alaliike, millest ma ei hakka rÀÀkima, kuid need kĂ”ik viivad Causal’i. See on oluline mudel, kuna see on kĂ”ige tugevam kĂ”igist mudelitest, kĂ”ige tugevam jĂ€rjepidevus vĂ”rgu vĂ”i jagunemiste korral.

Causals – see tĂ€hendab olukorda, kus sĂŒndmused on omavahel seotud pĂ”hjuslikus seoses. Sageli tĂ”lgendatakse neid kui oma Ă”igusi kliendi vaatenurgast. Kui klient on nĂ€inud mĂ”ningaid vÀÀrtusi, ei saa ta nĂ€ha minevikus olnud vÀÀrtusi. Ta hakkab juba nĂ€gema prefikskohaseid lugemisi. See kĂ”ik viib ikkagi samasse kohta.
Causals nagu kooskĂ”la mudel – osaline sĂŒndmuste jĂ€rjestamine serveris, kus kĂ”ik kliendi sĂŒndmused jĂ€lgitakse samas jĂ€rjestuses. Antud juhul – Leonard ja Penny.

LÔplik

Kolmas mudel on LĂ”plik KooskĂ”la. See on see, mida toetavad kĂ”ik jaotatud sĂŒsteemid, minimaalne mudel, mis mĂ”istuse poolest ĂŒldse olemas on. See tĂ€hendab jĂ€rgmist: kui andmetes toimuvad mingid muutused, siis mingil hetkel muutuvad nad kooskĂ”laliseks.

Selle hetke kohta ei öelda midagi muud, muidu muutuks see VĂ€liseks KooskĂ”laks – see oleks hoopis teine lugu. Sellegipoolest on see vĂ€ga populaarne mudel, kĂ”ige levinum. Vaikimisi kasutavad kĂ”ik jaotatud sĂŒsteemide kasutajad just LĂ”plikku KooskĂ”la.

Tahaksin tuua mÔned vÔrdlevad nÀited:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Mida need nooled tÀhendavad?

  • Latentsus. Konsistentsuse tugevuse suurenedes muutub see arusaadavatel pĂ”hjustel suuremaks: tuleb teha rohkem kirjeid, saada kinnitust kĂ”igilt hostidelt ja sĂ”lmedelt, mis osalevad klastris, et andmed seal juba olemas on. Seega on Eventual Consistency kĂ”ige kiirem vastus, kuna seal on tavaliselt vĂ”imalik isegi mĂ€lus kinnitada ja sellest piisab.
  • Saadavus. Kui seda mĂ”ista kui sĂŒsteemi vĂ”imet vastata, kui esinevad vĂ”rgu katkestused, jaotused vĂ”i mingid tĂ”rked – vigadetaluvus suureneb konsistentsimudeli vĂ€henedes, kuna piisab sellest, et ĂŒks host pĂŒsiks elus ja samal ajal edastaks mĂ”ningaid andmeid. Eventual Consistency ei garanteeri andmete osas ĂŒldse mitte midagi – see vĂ”ib olla mis tahes.
  • Anomaaliad. Samas, loomulikult suureneb anomaaliate arv. Strong Consistency puhul ei tohiks neid peaaegu ĂŒldse olla, samas kui Eventual Consistency puhul vĂ”ivad need olla igasugused. Tekib kĂŒsimus: miks inimesed valivad Eventual Consistency, kui see sisaldab anomaaliaid? Vastus peitub selles, et Eventual Consistency mudelid on rakendatavad ning anomaaliad eksisteerivad nĂ€iteks lĂŒhikese aja jooksul; on vĂ”imalik kasutada peamudi lugemiseks ja enam-vĂ€hem jĂ€rjepidevaid andmeid lugeda; sageli on vĂ”imalus kasutada tugevaid jĂ€rjepidevuse mudeleid. Praktikas toimib see ning sageli on anomaaliate arv ajaliselt piiratud.

CAP teoreem

Kui nĂ€ete sĂ”nu jĂ€rjepidevus, kĂ€tte saadavus – mis teile pĂ€he tuleb? Õige – CAP teoreem! Soovin nĂŒĂŒd mĂŒĂŒti hajutada
 See ei ole minu teema – on Martin Kleppmann, kes on kirjutanud suurepĂ€rase artikli, suurepĂ€rase raamatu.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

CAP-teoreem on 2000-ndatel formuleeritud pĂ”himĂ”te, mis kĂ€sitleb jĂ€rjepidevust, kĂ€ttesaadavust ja jagunemisi: vĂ”tke ĂŒkskĂ”ik millised kaks, kolmandat ei saa valida. See oli teatud pĂ”himĂ”te, mis tĂ”estati teoreemina mĂ”ned aastat hiljem, seda tegid Gilbert ja Lynch. SeejĂ€rel hakkas seda kasutama kui mantrana - sĂŒsteemid jagunesid CA, CP, AP jne.

Tegelikult tĂ”estati see teoreem jĂ€rgmiste olukordade jaoks... Esiteks kĂ€sitleti kĂ€ttesaadavust mitte kui pidevat vÀÀrtust nullist sajani (0 - sĂŒsteem on 'surnud', 100 - reageerib kiiresti; me oleme harjunud seda nii vaatama), vaid kui algoritmi omadust, mis tagab, et kĂ”ikide selle kĂ€ivitamiste kĂ€igus tagastatakse andmed.

KĂ€ivitamise ajast ei rÀÀgita ĂŒldse midagi! On olemas algoritm, mis tagastab andmed 100 aasta pĂ€rast - tĂ€iesti hea kĂ€ttesaadavus-algoritm, mis on osa CAP-teoreemist.
Teiseks: teoreemi tĂ”estamine toimus ĂŒhe ja sama vĂ”tme vÀÀrtuste muutuste puhul, kusjuures need muutused on resizable rida. See tĂ€hendab, et neid ei kasutata praktiliselt, kuna mudelid on muud Eventual Consistency, Strong Consistency (vĂ”ib-olla).

Mille see kÔik on? Ajavahemik CAP teoreemina, nagu see tÔestatud on, ei ole praktiliselt kasutatav, harva kasutatakse. Teoreetilises vormis piirab see mingil moel kÔike. Tekib mingi pÔhimÔte, mis on intuitiivselt Ôige, kuid ei ole tÔestatud.

Kaasne konsistents – kĂ”ige tugevam mudel

See, mis praegu toimub – on vĂ”imalik saada kĂ”ik kolm asja: Konsistents, Saadavus, kasutada Partitions. EelkĂ”ige kaasne konsistents – kĂ”ige tugevam konsistentsi mudel, mis töötas isegi Partitions (sĂŒsteemi katkestuste) olemasolul. SeetĂ”ttu on see nii suur huvi ja me hakkasime sellega tegelema.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Esiteks lihtsustab see rakenduste arendajate tööd. EelkĂ”ige on serveri suur toetus: kui kĂ”ik kirjed, mis toimuvad ĂŒhe kliendi sees, garanteeritult jĂ”uavad teise kliendi juurde Ă”iges jĂ€rjekorras. Teiseks talub see partitions.

MongoDB sisemised protsessid

Kuna on aeg lĂ”unat, liigume kööki. RÀÀgin sĂŒsteemi mudelist, nimelt – mis on MongoDB neile, kes kuulevad sellisest andmebaasist esmakordselt.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

MongoDB (edasi – «MongoDB») on jaotatud sĂŒsteem, mis toetab horisontaalset skaleerimist, st sharding'i; ja iga shard'i sees toetab ta ka andmete ĂŒlemÀÀrasust, st replikatsiooni.

Shardimine «MongoDB's» (mitte-relationaalne andmebaas) teostab automaatset tasakaalustamist, st iga dokumendi kogu (vĂ”i «tabel» relationaalsete andmete terminoloogias) jagatakse tĂŒkkideks, ja server liigub need automaatselt shardi vahel.

KĂŒsimuste marsruuter, mis jaotab pĂ€ringud, on kliendi jaoks teatud klient, mille kaudu ta töötab. Ta juba teab, kus ja millised andmed asuvad ning suunab kĂ”ik pĂ€ringud Ă”igesse shardi.

Veel ĂŒks oluline punkt: MongoDB on single master. On ĂŒks Primaarne – ta vĂ”ib vĂ”tta kirjeid, sĂ€ilitades need vĂ”tmed, mis tal endas on. Multi-master kirjutamist teha ei saa.

Oleme vĂ€lja andnud versiooni 4.2 – seal on ilmunud uusi huvitavaid asju. Esiteks, oleme lisanud Lucene – otsing – nimelt executable java otse «Mongo's», ja seal on nĂŒĂŒd vĂ”imalik teha otsingut lĂ€bi Lucene, sama nagu «Elasticsearchis».

Ja tegime uue toote – Charts, mis on samuti saadaval „Atlasel” (meie enda Cloud „Mongo”). Neil on Free Tier – saad sellega mĂ€ngida. Charts meeldis mulle vĂ€ga – andmete visualiseerimine on vĂ€ga intuitiivne.

Koosseis Causal consistency

Olen kokku lugenud umbes 230 artiklit, mis on selles kĂŒsimuses avaldatud – Leslie Lampertilt. Praegu jagan teiega oma mĂ€lust mĂ”ningaid neist materjalidest.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

KĂ”ik algas Leslie Lamperti artiklist, mis ilmus 1970. aastatel. Nagu nĂ€ete, jĂ€tkatakse selle teema uurimist siiani. Praegu on Causal consistency taas tĂ€helepanu keskmes seoses jaotatud sĂŒsteemide arenguga.

Piirangud

Millised piirangud on olemas? See on tegelikult ĂŒks peamisi punkte, sest tootmissĂŒsteemide kehtestatud piirangud erinevad oluliselt akadeemilistes artiklites esitatud piirangutest. Need on sageli ĂŒsna kunstlikud.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

  • Esiteks, „MongoDB” – see on single master, nagu ma juba ĂŒtlesin (see lihtsustab asju oluliselt).
  • Arvame, et sĂŒsteem peaks toetama umbes 10 000 shard'i. Me ei saa teha mĂ”ningaid arhitektuurilisi otsuseid, mis selgelt piiraksid seda vÀÀrtust.
  • Meil on pilv, kuid me arvame, et inimesel peaks olema vĂ”imalus, kui ta laadib alla binaarfaili, kĂ€ivitab selle oma sĂŒlearvutis ja kĂ”ik töötab suurepĂ€raselt.
  • Me arvame, et Researchis kasutatakse harva: vĂ€lised kliendid vĂ”ivad teha, mida iganes tahavad. «MongoDB» on avatud lĂ€htekoodiga. Seega vĂ”ivad kliendid olla sedavĂ”rd nutikad, halvad – vĂ”ivad soovida kĂ”ike purustada. Me arvame, et vĂ”ib esineda byzantilisi vigu.
  • VĂ€liste klientide jaoks, kes on vĂ€ljaspool perimeetrit – oluline piirang: kui see funktsioon on vĂ€lja lĂŒlitatud, siis ei tohiks esineda mingeid jĂ”udluse langusi.
  • Veel ĂŒks punkt – tĂ€iesti antiakadeemiline: varasemate ja tulevaste versioonide ĂŒhilduvus. Vanad draiverid peavad toetama uusi uuendusi ning andmebaas peab toetama vanu draivereid.

Üldiselt seab see kĂ”ik piiranguid.

Causal consistency komponendid

Kannan rÀÀgin mĂ”nest komponendist. Kui vaadata ĂŒldiselt Causal consistency, vĂ”ib eristada plokke. Valisime vĂ€lja tööd, mis kuuluvad teatud plokkidesse: Dependency Tracking, kellade valimine, kuidas neid kellasid omavahel sĂŒnkroonida ja kuidas me tagame turvalisuse – see on ligikaudne plaan, millest ma rÀÀgin:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

TÀielik sÔltuvuste jÀlgimine (Full Dependency Tracking)

Miks see vajalik on? Selleks, et kui andmed replitseeritakse – igal kirjal, igal andme muutmisel oleks teave selle kohta, milliseid muudatusi need sĂ”ltuvad. KĂ”ige esmane ja naiivsem muudatus on see, et iga sĂ”num, mis sisaldab kirja, sisaldab teavet eelnevate sĂ”numite kohta:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Selles nÀites on sulgudes number kirje number. MÔnikord edastatakse need kirjed vÀÀrtustega isegi tÀielikult, mÔnikord edastatakse mingid versioonid. Oluline on see, et iga muudatus sisaldab teavet eelneva kohta (ilmselt kannab seda endas).

Miks me otsustasime mitte kasutada sellist lĂ€henemist (tĂ€ielik jĂ€lgimine)? Ilmselgelt, sest see lĂ€henemine pole praktiline: iga muutus sotsiaalvĂ”rgustikus sĂ”ltub kĂ”igist varasematest muudatustest selles sotsiaalvĂ”rgustikus, edastades nĂ€iteks "Facebooki" vĂ”i "VKontakte" igas uuenduses. Siiski on palju uuringuid, mis kĂ€sitlevad just Full Dependency Tracking – see on ennetav sĂ”ltuvuste jĂ€lgimine, mis mĂ”nes olukorras tĂ”esti toimib.

Selge sÔltuvuste jÀlgimine (Explicit Dependency Tracking)

JÀrgmine on piiratum. Siin kÀsitletakse samuti informatsiooni edastamist, kuid ainult seda, mis on selgelt sÔltuv. Mida miski sÔltub, mÀÀrab tavaliselt rakendus. Andmeid replikatsiooni kÀigus vÀljastatakse ainult vastuseid, kui eelnevad sÔltuvused on rahuldatud, st nÀhtavaks tehtud. Just nii töötab Causal consistency.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

See nĂ€eb, et sissekanne 5 sĂ”ltub sissekanne 1, 2, 3, 4 – seetĂ”ttu ootab ta, kuni klient pÀÀseb juurde nendele muudatustele, mida Penny juurdepÀÀsu mÀÀruse alusel tehti, kui kĂ”ik eelnevad muudatused on juba andmebaasis lĂ€bitud.

See, we are not satisfied with this either, because there is still too much information, and it will slow things down. There is another approach


Lamporti kella (Lamport Clock)

Needless to say, they are very old. Lamport Clock implies that these dependencies are compressed into a scalar function known as Lamport Clock.

A scalar function is an abstract number. It is often referred to as logical time. With each event, this counter increases. The counter known to the process sends every message. It is clear that the processes can be desynchronized, having completely different times. Nevertheless, this message exchange somehow balances the clocks. What happens in this case?

Ma jagasin selle suure shard'i kahte ossa, et oleks selge: Friends vĂ”ivad elada ĂŒhes sĂ”lmes, mis sisaldab osa kollektsioonist, samas kui Feed – teises sĂ”lmes, kus hoitakse samuti osa sellest kollektsioonist. Kuidas nad siis jĂ€rjekorda ei satu? Esiteks ĂŒtleb Feed: „Replitseeriti”, ja seejĂ€rel – Friends. Kui sĂŒsteem ei tagada, et Feed ei kuvata, kuni Friends kollektsioonis olevad sĂ”ltuvused on samuti esitatud, tekib meil just see olukord, millest ma rÀÀkisin.

Te nÀete, kuidas Feed'i loogiline loendur tÔuseb:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Seega on selle Lamport Clock'i ja Causal consistency (Lamport Clock'i kaudu seletatud) peamine omadus jĂ€rgmine: kui meil on sĂŒndmused A ja B, ja sĂŒndmus B sĂ”ltub sĂŒndmusest A *, siis jĂ€reldub, et Event A loogiline aeg on vĂ€iksem kui Event B loogiline aeg.

* MĂ”nikord öeldakse ka, et A juhtus enne B, st A juhtus enne B – see on suhe, mis osaliselt jĂ€rjestab kogu sĂŒndmuste kogumi, mis kunagi toimus.

Vale suunas on vale. See on tegelikult ĂŒks peamisi Lamporti kella miinuseid – osaline jĂ€rjestus. Seal on mĂ”isted samasuguste sĂŒndmuste kohta, mis tĂ€hendab, et ei (A juhtus enne B), ega (A juhtus pĂ€rast B). NĂ€iteks vĂ”ib tuua paralleelse sĂ”bra lisamise, nĂ€iteks Leonard lisab Sheldonit sĂ”braks.
See ongi omadus, millega sageli töödelda Lamporti kelladega: vaadatakse just funktsiooni ja sellest tehakse jĂ€reldus – vĂ”ib-olla on need sĂŒndmused omavahel seotud. Sest ĂŒhes suunas on see tĂ”si: kui LogicalTime A on vĂ€iksem kui LogicalTime B, siis B ei saa juhtuda enne A; aga kui on suurem, siis vĂ”ib juhtuda.

Vektorkellad (Vector Clock)

Lamporti kella loogiline areng on Vektorkellad. Need erinevad seetÔttu, et igas siin olevas sÔlmes on oma, eraldi kell, ja need edastatakse vektorina.
Antud juhul nĂ€ete, et vektori nullindeks vastab Feedile ja vektori esimene indeks sĂ”pradele (igaĂŒhe jaoks nendes sĂ”lmedes). Ja nĂŒĂŒd hakkavad need suurenema: nullindeksi "Feed" vÀÀrtus suureneb kirjutades – 1, 2, 3:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Miks on vektorkellad paremad? Sest need aitavad mĂ”ista, millised sĂŒndmused toimuvad samaaegselt ja millal need eri noodides aset leiavad. See on vĂ€ga oluline sharding-sĂŒsteemi, nagu "MongoDB", jaoks. Siiski ei valinud me seda, kuigi see oleks olnud suurepĂ€rane lahendus ja toimib suurepĂ€raselt, oleks see meile tĂ”enĂ€oliselt sobinud


Kui meil on 10 tuhat shard'i, ei saa me edastada 10 tuhat komponenti, isegi kui me tihendame vĂ”i leiutame midagi muud – kasulik koormus on siiski mitu korda vĂ€iksem kui kogu selle vektori maht. SeetĂ”ttu, sĂŒdamevaluga ja hambaid peedes, loobusime sellest lĂ€henemisviisist ja lĂ€ksime edasi teise juurde.

Spanner TrueTime. Aatomikellad

Ma ĂŒtlesin, et tuleb jutt "Spannerist". See on Ă€ge asi, otse 21. sajandist: aatomikellad, GPS-sĂŒnkroniseerimine.

Milline on idee? "Spanner" on Google'i sĂŒsteem, mis hiljuti sai isegi inimestele kĂ€ttesaadavaks (nad lisasid sellele SQL-i). Igal tehingul on seal mingi aja mĂ€rgistus. Kuna aeg on sĂŒnkroniseeritud*, saab igale sĂŒndmusele mÀÀrata kindla aja – aatomikelladel on ooteaeg, pĂ€rast mida toimub kindel muudatus ajas.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Seega tagab lihtsalt andmebaasi kirjutamine ja teatud aja ootamine automaatselt sĂŒndmuse serialiseeritavuse. Neil on kĂ”ige tugevam jĂ€rjepidevuse mudel, mida ĂŒldse kujutada vĂ”ib – see on vĂ€line jĂ€rjepidevus.

* See on pĂ”hiprobleem Lamporti kellade puhul – need ei ole kunagi sĂŒnkroonitud jaotatud sĂŒsteemides. Need vĂ”ivad erineda isegi NTP olemasolul, töötavad endiselt mitte eriti hĂ€sti. "Spanner" omab aatomikellasid ja sĂŒnkroniseerimist, tundub, et mikrosekundite tĂ€psusega.

Miks me ei valinud? Me ei eelda, et meie kasutajatel on sisseehitatud aatomikellad. Kui need kunagi tulevad, olles sisseehitatud igasse sĂŒlearvutisse, on olemas mingi superĂ€ge GPS-sĂŒnkroniseerimine – siis jah... Praegu on parim, mis vĂ”imalik – "Amazon", baasjaamad – fĂ€nnide jaoks... Seega kasutasime teisi kellasid.

HĂŒbriidkell (Hybrid Clock)

See on tegelikult see, mis tiksub "MongoDB"-s, pakkudes kausaalset jĂ€rjepidevust. Miks nad on hĂŒbriidsed? HĂŒbriid on skalaarsed vÀÀrtused, kuid koosneb kahest komponendist:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

  • Esimene on unix’i ajastu (kui palju sekundeid on möödunud "arvutimaailma algusest").
  • Teiseks – teatav inkrement, samuti 32-bitine unsigned int.

See ongi kĂ”ik. On olemas lĂ€henemine: osa, mis vastutab aja eest, sĂŒnkroonib pidevalt kelladega; iga kord, kui toimub uuendus, sĂŒnkroonitakse see osa kelladega ja tulemuseks on, et aeg on enam-vĂ€hem Ă”ige, samas kui inkrement vĂ”imaldab eristada sĂŒndmusi, mis toimusid samal hetkel.

Miks on see oluline 'MongoDB'-le? Sest see vĂ”imaldab teha mingit tĂŒĂŒpi varukoopiaid kindlal ajahetkel, st sĂŒndmus indekseeritakse ajaga. See on oluline, kui on vaja teatud sĂŒndmusi; andmebaasi jaoks on sĂŒndmused andmebaasis toimunud muudatused, mis on toimunud teatud aja jooksul.

Ma ĂŒtlen teile vaid kĂ”ige olulisema pĂ”hjuse (palun, Ă€rge öelge seda kellelegi)! Me tegime seda, kuna just niimoodi nĂ€evad vĂ€lja jĂ€rjestatud, indekseeritud andmed MongoDB OpLog-is. OpLog on andmestruktuur, mis sisaldab kĂ”iki muudatusi andmebaasis: need lĂ€hevad esmalt OpLog-i ja seejĂ€rel rakendatakse neid juba Storage'ile, kui tegemist on replikatsioonitud andmete vĂ”i sharding'iga.

See oli peamine pĂ”hjus. On olemas ka praktilised nĂ”uded andmebaasi arendusele, mis tĂ€hendab, et see peab olema lihtne – vĂ”imalikult vĂ€he koodi ja vĂ”imalikult vĂ€he katki minevaid asju, mida tuleb ĂŒmber kirjutada ja testida. Et meie OpLogid osutusid hĂŒbriidhÀÀlte poolt indekseerituks, aitas see palju ja vĂ”imaldas teha Ă”iged valikud. See tĂ”eliselt tasus end Ă€ra ja töötas kuidagi maagiliselt, juba esimesel prototĂŒĂŒbil. Oli tĂ”eliselt Ă€ge!

Kellade sĂŒnkroniseerimine

Teaduslikus kirjanduses on kirjeldatud mitmeid kellade sĂŒnkroniseerimise meetodeid. RÀÀgin sĂŒnkroniseerimisest siis, kui meil on kaks erinevat shard'i. Kui on ĂŒks replika komplekt – ei ole mingit sĂŒnkroniseerimist vaja: see on 'ĂŒhe meistri' situatsioon; meil on OpLog, kuhu kĂ”ik muudatused satuvad – sel juhul on kĂ”ik juba jĂ€rjestatud 'OpLog'is'. Kuid kui meil on kaks erinevat shard'i, on siin aja sĂŒnkroniseerimine oluline. Siin aitasid meile vektorkellad rohkem! Kuid meil neid ei ole.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Teine sobiv variant on „SĂŒdamelöögid“ (Heartbeats). Sa saad jagada teatud signaale, mis toimuvad igas ajaĂŒhikus. Kuid „SĂŒdamelöögid“ on liiga aeglased, me ei saa oma kliendile latentsust tagada.

TĂ”eline aeg on loomulikult imeasi. Kuid see on tĂ”enĂ€oliselt tulevik
 Kuigi „Atlases“ on juba vĂ”imalik kasutada kiireid „Amazoni“ ajasĂŒnkronisaatoreid. Kuid see ei ole kĂ”igile kergesti kĂ€ttesaadav.

Kahese suhtlemine tĂ€hendab, et kĂ”ik sĂ”numid sisaldavad aega. See on umbes see, mida me kasutame. Iga sĂ”num node'ide vahel, draiver, router, andme-node, absoluutselt kĂ”ik MongoDB jaoks – need on mingid elemendid, andmebaasi komponendid, mis sisaldavad endas kellasid, mis kulgevad. Igal pool on hĂŒbriidaja vÀÀrtus, see edastatakse. 64 bitti? See on vĂ”imalik, see töötab.

Kuidas see kÔik koos töötab?

Siin arenen lihtsustatult ĂŒhte replikatsioonisetti. On olemas Primary ja Secondary. Secondary teeb replikatsiooni ja ei ole alati tĂ€ielikult sĂŒnkroonitud Primaryga.

Tegemist on aja vÀÀrtuse sisestamisega 'Prymerys'. See sisestamine suurendab sisemist loendurit kuni 11, kui see on maksimaalne. Vastasel juhul kontrollib see tunni vÀÀrtusi ja sĂŒnkroniseerib need, kui tunni vÀÀrtused on suuremad. See vĂ”imaldab korraldada ajaliselt.

PĂ€rast salvestamist toimub oluline hetk. Tunnid 'MongoDBs' suurenevad ainult siis, kui salvestus toimub 'OpLogis'. Just see on sĂŒndmus, mis muudab sĂŒsteemi seisundit. KĂ”ikides klassikalistes artiklites loetakse sĂŒndmuseks sĂ”numi jĂ”udmist nodi: sĂ”num on saabunud – see tĂ€hendab, et sĂŒsteem on muutnud oma seisundit.

See tuleneb sellest, et uurimise kĂ€igus ei saa alati aru, kuidas seda sĂ”numit tĂ”lgendatakse. Me teame tĂ€pselt, et kui see ei ole 'OpLogis' kajastatud, siis seda ei tĂ”lgendata kuidagi, ja sĂŒsteemi seisundi muutmine on ainult salvestamine 'OpLogisse'. See lihtsustab meie jaoks kĂ”ike: nii mudelit kui ka vĂ”imalust korraldada ĂŒhes replikas komplektis, ja palju muud kasulikku.

Tagastatakse vÀÀrtus, mis on juba salvestatud "Oplogi" – me teame, et "Oplogis" on see vÀÀrtus olemas ja selle aeg on 12. NĂŒĂŒd, ĂŒtleme, et lugemine algab teiselt sĂ”lmpunktilt (Secondary) ja ta edastab juba afterClusterTime sĂ”numis. Ta ĂŒtleb: "Mul on vaja kĂ”ike, mis toimus vĂ€hemalt pĂ€rast 12 vĂ”i tĂ€pselt kell kaksteist" (vt ĂŒlalolevat joonist).

See on see, mida nimetatakse Causal a consistent (CAT). On selline mĂ”isted teoorias, et see on mingi ajas lĂ”ige, mis on enda jaoks jĂ€rjepidev. Antud juhul vĂ”ib öelda, et see on sĂŒsteemi olek, mida jĂ€lgiti ajahetkel 12.

Praegu pole siin veel midagi, sest see simuleerib olukorda, kus on vajalik, et Secondary kopeeriks andmeid Primarylt. Ta ootab... Ja nĂŒĂŒd on andmed saabunud – tagastab tagasi need vÀÀrtused.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Nii umbes kÔik töötab. Peaaegu.

Mis tĂ€hendab «peaaegu»? Oletame, et on mingisugune inimene, kes on lugenud ja aru saanud, kuidas see kĂ”ik töötab. Ta mĂ”istab, et iga kord toimub ClusterTime, see uuendab sisemisi loogilisi kelli, ja siis jĂ€rgmine kirje suurendab seda ĂŒhe vĂ”rra. See funktsioon koosneb 20 reast. Oletame, et see inimene edastab maksimaalselt suure 64-bitise arvu, miinus ĂŒks.

Miks «miinus ĂŒks»? Sest et sisemised kellad seadistatakse sellele vÀÀrtusele (ilmne, et see on kĂ”ige suurem vĂ”imalik ja suurem praegusest ajast), siis toimub kirje «Opilogisse», ja kellad suurenevad veel ĂŒhe vĂ”rra – ning seal on juba maksimaalne vÀÀrtus (seal on lihtsalt kĂ”ik ĂŒhed, enam ei ole kuhugi minna, unsaint int’id).

Selge, et pĂ€rast seda muutub sĂŒsteem tĂ€iesti kĂ€ttesaamatuks. Seda saab ainult vĂ€ljastada, puhastada – palju kĂ€sitööd. TĂ€ielik availability:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Ja kui see veel kuhugi replitseeritakse, siis kukub kogu klaster lihtsalt kokku. Absoluutselt vastuvĂ”etamatu olukord, mille iga inimene saab vĂ€ga kiiresti ja lihtsalt korraldada! SeetĂ”ttu pidasime seda momenti ĂŒheks kĂ”ige olulisemaks. Kuidas seda Ă€ra hoida?

Meie tee on allkirjastada clusterTime

Nii see edastatakse sÔnumis (kuni sinise tekstini). Kuid me hakkasime ka allkirja genereerima (sinine tekst):

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Allkiri genereeritakse vÔtme abil, mis hoitakse andmebaasis, kaitstud perimeetriga; see genereeritakse ja uuendatakse (kasutajad ei nÀe seda). Genereeritakse hash ning iga sÔnum allkirjastatakse loomise hetkel ja valideeritakse vastuvÔtmise hetkel.
Inimestel vĂ”ib tekkida kĂŒsimus: „Kui palju see kĂ”ik aeglustab?” Ma ĂŒtlesin, et see peab kiiresti töötama, eriti kui seda omadust pole.

Mida tÀhendab Causal consistency kasutamine antud juhul? See nÀitab afterClusterTime parameetrit. Ilma selleta edastatakse vÀÀrtusi igal juhul. Gossiping, alates versioonist 3.6, töötab alati.

Kui me jĂ€tame pideva allkirjade genereerimise, siis see aeglustab sĂŒsteemi isegi omaduse puudumisel, mis ei vasta meie lĂ€henemistele ja nĂ”udmistele. Ja mida me tegime?

Tee seda kiiresti!

Piisavalt lihtne asi, kuid trikk on huvitav – jagan, vĂ”ib-olla on kellelegi huvitav.
Meil on hash, kus salvestatakse allkirjastatud andmed. KÔik andmed lÀhevad lÀbi cache'i. Cache ei allkirjasta mitte kindlat aega, vaid Range'i. Kui tuleb mingi vÀÀrtus, genereerime Range'i, varjame viimased 16 bitti ja allkirjastame selle vÀÀrtuse:

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Saades sellise allkirja, kiirendame sĂŒsteemi (tinglikult) 65 000 korda. See töötab suurepĂ€raselt: kui katseid tehti – siis kahanes aeg tĂ”eliselt 10 000 korda, kui meil oli jĂ€rjestikune uuendus. Selge on, et kui nad on erinevas jĂ€rjekorras, siis see ei toimi. Kuid enamikus praktilistes juhtumites töötab see. Range'i allkirja kombinatsioon koos allkirjaga aitas lahendada turvalisuse probleemi.

Mida me Ôppisime?

Õppetunnid, mille me sellest saime:

  • Tuleb lugeda materjale, lugusid, artikleid, sest meil on palju huvitavat. Kui töötame mingi funktsiooni kallal (eriti nĂŒĂŒd, kui me tegime tehinguid jne), tuleb lugeda, aru saada. See vĂ”tab aega, kuid see on tegelikult vĂ€ga kasulik, sest saab aru, kus me oleme. Me ei ole nagu midagi uut vĂ€lja mĂ”elnud – lihtsalt vĂ”tsime koostisosad.

    KĂŒsimus on ĂŒldiselt mĂ”tteviisi erinevuses, kui tegemist on akadeemilise konverentsiga (nĂ€iteks 'Sigmon') – seal keskendutakse uutele ideedele. Mis on meie algoritmi uuenduslik? Siin ei ole suurt uudset. Uudsus seisneb pigem selles, kuidas me kokku segasime olemasolevaid lĂ€henemisviise. SeetĂ”ttu tuleb esmalt lugeda klassikuid, alustades Lampardist.

  • Tootmisprotsessis on tĂ€iesti teised nĂ”udmised. Olen kindel, et paljud teist ei tegele mitte "sfÀÀriliste" andmebaasidega abstraktses vaakumis, vaid tĂ”eliste, normaalse elu probleemidega, kus esinevad availability, latency ja talitlushĂ€ired.
  • Viimane – see, et pidime arvesse vĂ”tma erinevaid ideid ja kombineerima mitmeid tĂ€iesti erinevaid artikleid ĂŒhte lĂ€henemisviisi. NĂ€iteks allkirjastamise idee pĂ€rineb artiklist, mis kĂ€sitles Paxos protokolli, mis on mĂ”eldud mitte-bĂŒtsantslike veakindlate sĂŒsteemide jaoks autoriseerimisprotokollis, bĂŒtsantslike jaoks aga autoriseerimisprotokollist vĂ€ljaspool
 ÜhesĂ”naga, just seda me lĂ”puks ka tegime.

    Siin pole tÔesti midagi uut! Aga kui me kÔike koos segame... See on umbes sama, nagu öelda, et Olivier salati retsept on mÔttetu, kuna munad, majonees ja kurgid on juba vÀlja mÔeldud... See on umbes sama lugu.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Sellega lÔpetan. AitÀh!

KĂŒsimused

KĂŒsimus publikust (edasi – K): – AitĂ€h, Mihhail esitluse eest! Aeg teema on huvitav. Te kasutate Gossiping. Ütlesite, et kĂ”igil on oma aeg, kĂ”ik tunnevad oma lokaalset aega. Ma sain aru, et meil on draiver – kliente koos draiveritega vĂ”ib olla palju, ka query-planner’eid on palju, shard'eid on ka palju
 Kuhu meie sĂŒsteem jĂ”uab, kui Ă€kki tekib lahknevus: keegi arvab, et ta on minut aega ees, keegi – minut aega taga? Kus me oleme?

MT: – Tegelikult vĂ€ga hea kĂŒsimus! Ma tahtsin just shardeist rÀÀkida. Kui ma Ă”igesti aru saan kĂŒsimusest, siis meil on selline olukord: shard 1 ja shard 2, lugemine toimub nende kahe shard'i pealt – neil on lahknevus, nad ei suhtle omavahel, kuna aeg, mida nad tunnevad, on erinev, eriti aeg, mis nende logides eksisteerib.
Oletame, et shard 1 tegi miljon kirjet, shard 2 ei teinud ĂŒldse midagi, ja pĂ€ring tuli kahele shardi. Ja esimesel on afterClusterTime ĂŒle miljoni. Sellises olukorras, nagu ma selgitasin, shard 2 ei vasta kunagi.

K: – Ma tahtsin teada, kuidas nad sĂŒnkroneeruvad ja valitakse ĂŒks loogiline aeg?

MT: – VĂ€ga lihtsalt sĂŒnkroneeritakse. Shard, kui sellele tuleb afterClusterTime ja ta ei leia aega 'Optlog'is – algatab no approved. See tĂ€hendab, et ta tĂ”stab oma aega kĂ€sitsi sellele vÀÀrtusele. See nĂ€itab, et tal ei ole sĂŒndmusi, mis sellele pĂ€ringule vastavad. Ta loob selle sĂŒndmuse kunstlikult ja muutub seelĂ€bi Causal Consistent.

K: – Aga kui tema juurde pĂ€rast seda veel jĂ”uavad mingid sĂŒndmused, mis kuskil vĂ”rgus kaduma lĂ€ksid?

MT: – Shard on kujundatud nii, et need ei jĂ”ua enam, kuna see on single master. Kui ta on juba kirja pannud, siis need ei tule enam ja on pĂ€rast. Ei saa juhtuda nii, et kuskil midagi kinni jÀÀb, siis ta teeb no write ja pĂ€rast jĂ”uavad need sĂŒndmused – ja Causal consistency on rikutud. Kui ta teeb no write, siis kĂ”ik peavad edasi jĂ”udma (ta ootab neid).

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

K: – Mul on mĂ”ned kĂŒsimused jĂ€rjekordade kohta. Causal consistency eeldab, et on olemas teatud tegevuste jĂ€rjekord, mida tuleb tĂ€ita. Mis juhtub, kui meil kaob ĂŒks pakett? Siin tuli 10., 11.. 12. kaob Ă€ra, samas kui kĂ”ik teised ootavad, kuni see tĂ€idetakse. Ja Ă€kki sureb meie masin, me ei saa midagi teha. Kas on olemas maksimaalne jĂ€rjekorra pikkus, mis akumuleerub, enne kui see tĂ€idetakse? Milline fataalne viga toimub, kui mĂ”ni seisund kaob? Eriti kuna me salvestame, et on olemas mingi eelnevalt mÀÀratud seisund, millelt me peame kuidagi tuginema? Ja sellest ei saadudki tuge!

MT: – Samuti suurepĂ€rane kĂŒsimus! Mida me teeme? MongoDB-s on olemas kvoorumite kirjutamise ja lugemise kontseptsioon. Millal vĂ”ib sĂ”num kaduma minna? Kui kirjutamine ei ole kvoorum vĂ”i kui lugemine ei ole kvoorum (ka see vĂ”ib osutuda mingiks prĂŒgiseks).
Seoses Causal consistency oleme lĂ€bi viinud ulatusliku eksperimentaalse kontrolli, mille tulemusena selgus, et juhul, kui kirjutamised ja lugemised on kvoorumita, tekivad Causal consistency rikkumised. Just nii, nagu te ĂŒtlete!

Meie soovitus: kasutada vĂ€hemalt kvoorumi lugemist, kui tegeletakse Causal consistency'ga. Sel juhul ei kao mitte midagi, isegi kui kvoorumi kirjutamine kaob... See on ortogonaalne olukord: kui kasutaja ei soovi, et andmed kaoksid, tuleb kasutada kvoorumi kirjutamist. Causal consistency ei anna pĂŒsivuse garantiid. PĂŒsivuse garantii annab replikatsioon ja replikatsiooniga seotud masinavĂ€rk.

K: – Kui me loome instantsi, mida meie ĆĄardid teostavad (mitte master, vaid slave vastavalt), toetub see oma masina unix-ajale vĂ”i «meistri» ajale; sĂŒnkroniseeritakse esmakordselt vĂ”i perioodiliselt?

MT: – Praegu selgitan. Ć ard (tlk. horisontaalne partitsioon) – seal on alati Primaarne. Ja ĆĄardis vĂ”ib olla «meister» ning vĂ”ivad olla replikatsioonid. Kuid ĆĄard toetab alati kirjutamist, sest see peab toetama mingit domeeni (ĆĄardis on Primaarne).

K: – Nii et kĂ”ik sĂ”ltub tĂ€ielikult «meistrist»? Kas alati kasutatakse «meistri» aega?

MT: – Jah. VĂ”ib öelda, et kell tiksub, kui toimub kirjutamine «meistrisse», «Oplogisse».

K: – Meil on klient, kellel on ĂŒhendus, ja tal ei ole vaja ajast midagi teada?

MT: – Ei ole vaja midagi teada! Kui rÀÀkida, kuidas see kliendil töötab: kliendil, kui ta soovib kasutada Causal consistency, peab ta avama seansi. Praegu on seal kĂ”ik: ka tehingud seansis ja retrieve a rights... Seanss on loogiliste sĂŒndmuste jĂ€rjestamine, mis toimub kliendiga.

Kui ta avab selle seansi ja ĂŒtleb, et soovib Causal consistency (kui seanss toetab Causal consistency vaikimisi), siis kĂ”ik töötab automaatselt. Juhtimisseade salvestab selle aja ja suurendab seda, kui saab uue sĂ”numi. Ta mĂ€letab, millise vastuse eelmisel serverilt saadi, mis andmed tagastati. JĂ€rgmine pĂ€ring sisaldab afterCluster ("aeg, mis on suurem kui see").

Kliendil ei ole vaja tĂ€iesti midagi teada! See on tema jaoks tĂ€iesti lĂ€bipaistmatu. Kui inimesed kasutavad neid funktsioone, mida see vĂ”imaldab? Esiteks, saab ohutult lugeda secondaries: saab kirjutada Primary'le ja lugeda geograafiliselt replitseeritud secondaries'ilt ning olla kindel, et see toimib. Samal ajal saab seanss, mis on salvestatud Primary'le, edastada isegi Secondary'le, st saab kasutada mitte ĂŒhte seanssi, vaid mitu.

K: – Teema Eventual consistency on tihedalt seotud uue taseme Compute science'iga – andmetĂŒĂŒpidega CRDT (Conflict-free Replicated Data Types). Kas olete kaalunud nende andmetĂŒĂŒpide integreerimist andmebaasi ja mida sellest arvate?

MT: – Hea kĂŒsimus! CRDT on mĂ”istlik andmevahetuse konfliktide korral: MongoDB-s on see ĂŒksik meistreid.

K: – Mul on devopsidelt kĂŒsimus. TĂ”elises maailmas esinevad sellised jezuidlikud olukorrad, kus toimub byzantine failure ja kurjad inimesed kaitstud perimeetris hakkavad protokolli segama, saates spetsiaalselt koostatud pakette?

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

MT: – Kurjad inimesed perimeetris on nagu trooja hobune! Perimeetris olevad kurjad inimesed vĂ”ivad teha palju halbu asju.

K: – Loomulikult on vale jĂ€tta serverisse, ĂŒtleme nii, auk, mille kaudu saab lĂ€bi lasta elevantide loomaaeda ja kogu klastrit igaveseks kokku varisemise
 KĂ€esolevaks taastamiseks on vajalik aeg
 See on pehmelt öeldes vale. Teisest kĂŒljest, huvitav on, et pĂ€riselus, praktikas esinevad sarnased sisemised rĂŒnnakud?

MT: – Kuna ma ei puutu tihti kokku turvarikkumisega, ei saa ma öelda – vĂ”ib-olla need tĂ”esti juhtuvad. Aga kui rÀÀkida arendajate filosoofiast, siis meie arvates on asi nii: meil on perimeeter, mis tagab turva, – see on lukud, sein; ja perimeetri sees vĂ”ib teha kĂ”ike, mida soovid. Loomulikult on kasutajaid, kellel on vaid vaatamisĂ”igus, ja on ka kasutajaid, kellel on Ă”igus katalooge kustutada.

SĂ”ltuvalt Ă”igustest vĂ”ib kasutaja tekitada kahju kas hiirega vĂ”i isegi elevandiga. On selge, et kasutaja tĂ€ieĂ”iguslike Ă”igustega saab teha kĂ”ik, mida soovib. Kasutaja, kelle Ă”igused on piiratud, vĂ”ib tekitada oluliselt vĂ€hem kahju. EelkĂ”ige ei saa ta sĂŒsteemi purustada.

K: – Kaitstud perimeetri sees vĂ”ib keegi hakata vormima ootamatuid protokolle serveri jaoks, et serverit nurka suruda, ja kui vedasi, siis vĂ”ib kogu klaster
 Kas selliseid olukordi ka juhtub?

MT: – Ma ei ole kunagi sellistest asjadest kuulnud. Et serverit saab niimoodi kokku kukutada – see ei ole saladus. Kukkuda seespool, olles protokollist, kui autoriseeritud kasutaja, kes saab sĂ”numisse midagi sellist kirjutada... Tegelikult ei saa, sest see peab ikkagi valideeruma. On vĂ”imalus keelata see autentimine kasutajatele, kes ei soovi – see siis on nende probleem; nad on, n-ö, ise seinad lĂ”hkunud ja sinna saab sisestada elevandi, kes kĂ”ik tallab... Ja tegelikult, vĂ”ib end remontijana riidesse panna, tulla ja vĂ€lja vĂ”tta!

K: – AitĂ€h ettekande eest. Sergei („Yandex”). „Monges” on konstandina, mis piirab hÀÀletavate liikmete arvu Replica Set’is, ja see konstant on 7 (seitsme). Miks see on konstant? Miks see ei ole mingi parameeter?

MT: – Replica Set on meil ka 40 noodiga. Seal on alati enamuse reegel. Ma ei tea, mis versioon see on


K: – Replica Set’is vĂ”ib olla ka hÀÀletamata liikmeid, kuid hÀÀletavate – maksimaalselt 7. Kuidas sel juhul taluda vĂ€ljalĂŒlitamist, kui meil Replica Set on hajutatud kolme andmekeskuse peale? Üks andmekeskus vĂ”ib lihtsalt vĂ€lja lĂŒlituda ja ĂŒks masin veel vĂ€lja langeda.

MT: – See on juba veidi vĂ€ljaspool ettekannet. See on ĂŒldine kĂŒsimus. VĂ”ib-olla saan sellest hiljem rÀÀkida.

HighLoad++, Mihhail Tjulenev (MongoDB): Kausalne jÀrjepidevus: teooriast praktikani

Vaata videot

Veidi reklaami 🙂

AitĂ€h, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite nĂ€ha rohkem huvitavaid materjale? Toetage meid, tehes tellimuse vĂ”i soovitades meid tuttavatele. pilve VPS arendajatele alates $4,99, ainulaadne sisenemise taseme serverite analoog, mille oleme teie jaoks vĂ€lja mĂ”elnud: Kogu tĂ”de VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps alates $19 vĂ”i kuidas Ă”ieti serverit jagada? (saadaval on RAID1 ja RAID10 variandid, kuni 24 sĂŒdamikku ja kuni 40GB DDR4).

Kas Dell R730xd on kaks korda odavam Equinixi Tier IV andmete keskuses Amsterdamis? Ainult meie juures 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199 Hollandi turul! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — alates $99! Lugege, kuidas Luua ettevĂ”tte tasemel infrastruktuur Dell R730xd E5-2650 v4 serveritega, mille hind on 9000 eurot, madala hinnaga?

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster