HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

NÀsta HighLoad++-konferens kommer att hÄllas den 6 och 7 april 2020 i St. Petersburg.
Detaljer och biljetter ĐżĐŸ ссылĐșĐ”. HighLoad++ Sibirien 2019. Hall "Krasnoyarsk". 25 juni, 12:00. Avhandlingar och presentation.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Det hÀnder att praktiska krav kommer i konflikt med teori, dÀr aspekter som Àr viktiga för en kommersiell produkt inte beaktas. Detta föredrag presenterar en process för att vÀlja ut och kombinera olika tillvÀgagÄngssÀtt för att skapa orsakssammanhangskomponenter baserade pÄ akademisk forskning baserad pÄ kraven pÄ en kommersiell produkt. Lyssnarna kommer att lÀra sig om befintliga teoretiska tillvÀgagÄngssÀtt för logiska klockor, beroendespÄrning, systemsÀkerhet, klocksynkronisering och varför MongoDB bestÀmde sig för vissa lösningar.

Mikhail Tyulenev (nedan kallad MT): – Jag kommer att prata om orsakskonsistens - det hĂ€r Ă€r en funktion som vi arbetade med i MongoDB. Jag arbetar i en grupp av distribuerade system, vi gjorde det för ungefĂ€r tvĂ„ Ă„r sedan.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

I processen var jag tvungen att bekanta mig med mycket akademisk forskning, eftersom denna egenskap har studerats ganska vÀl. Det visade sig att inte en enda artikel passar in i vad som krÀvs i en produktionsdatabas pÄ grund av mycket specifika krav som förmodligen finns i nÄgon produktionsapplikation.

Jag kommer att prata om hur vi som konsumenter av akademisk forskning förbereder nÄgot av den som vi sedan kan presentera för vÄra anvÀndare som en fÀrdigrÀtt som Àr bekvÀm och sÀker att anvÀnda.

Orsakskonsistens. LĂ„t oss definiera begreppen

Till att börja med vill jag sÀga i allmÀnna termer vad kausal konsistens Àr. Det finns tvÄ karaktÀrer - Leonard och Penny (TV-serien "The Big Bang Theory"):

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

LÄt oss sÀga att Penny Àr i Europa och Leonard vill ordna en överraskningsfest för henne. Och han kan inte tÀnka sig nÄgot bÀttre Àn att kasta bort henne frÄn sin vÀnlista och skicka alla sina vÀnner en uppdatering om flödet: "LÄt oss göra Penny glad!" (hon Àr i Europa, medan hon sover, hon ser inte allt detta och kan inte se det, för hon Àr inte dÀr). I slutÀndan tar hon bort det hÀr inlÀgget, raderar det frÄn flödet och ÄterstÀller Ätkomsten sÄ att hon inte mÀrker nÄgot och det finns ingen skandal.
Det hÀr Àr vÀl och bra, men lÄt oss anta att systemet Àr distribuerat och att det gick lite fel. Det kan till exempel hÀnda att Pennys ÄtkomstbegrÀnsning intrÀffade efter att detta inlÀgg dök upp, om hÀndelserna inte Àr relaterade till orsak och verkan. Egentligen Àr detta ett exempel pÄ nÀr Causal konsekvens krÀvs för att utföra en affÀrsfunktion (i detta fall).

Faktum Àr att dessa Àr ganska icke-triviala egenskaper hos databasen - vÀldigt fÄ mÀnniskor stöder dem. LÄt oss gÄ vidare till modellerna.

Konsistensmodeller

Vad Àr egentligen en konsistensmodell i databaser? Det Àr nÄgra av de garantier som ett distribuerat system ger om vilken data klienten kan ta emot och i vilken ordningsföljd.

I princip kommer alla konsistensmodeller ner pÄ hur likt ett distribuerat system Àr ett system som körs till exempel pÄ en nod pÄ en bÀrbar dator. Och sÄ liknar ett system som körs pÄ tusentals geodistribuerade "noder" en bÀrbar dator, dÀr alla dessa egenskaper i princip utförs automatiskt.

DÀrför tillÀmpas konsistensmodeller endast pÄ distribuerade system. Alla system som tidigare funnits och fungerade i samma vertikala skala upplevde inte sÄdana problem. Det fanns en buffertcache, och allt lÀstes alltid frÄn den.

Modell stark

Egentligen Àr den allra första modellen Strong (eller rise ability line, som den ofta kallas). Detta Àr en konsistensmodell som sÀkerstÀller att varje förÀndring, nÀr den har bekrÀftats att den har skett, Àr synlig för alla anvÀndare av systemet.

Detta skapar en global ordning av alla hÀndelser i databasen. Detta Àr en mycket stark konsistensegenskap, och den Àr i allmÀnhet mycket dyr. Det stöds dock vÀldigt bra. Det Àr bara vÀldigt dyrt och lÄngsamt - det anvÀnds bara sÀllan. Detta kallas höjningsförmÄga.

Det finns en annan, starkare egenskap som stöds i Spanner - kallad External Consistency. Vi ska prata om det lite senare.

orsaks~~POS=TRUNC

NÀsta Àr Causal, vilket Àr precis vad jag pratade om. Det finns flera undernivÄer mellan Stark och Causal som jag inte kommer att prata om, men de kokar alla ner till Causal. Detta Àr en viktig modell eftersom den Àr den starkaste av alla modeller, den starkaste konsistensen i nÀrvaro av ett nÀtverk eller partitioner.

Causals Àr faktiskt en situation dÀr hÀndelser Àr kopplade till ett orsak-verkan-samband. Mycket ofta uppfattas de som LÀs dina rÀttigheter ur kundens synvinkel. Om klienten har observerat nÄgra vÀrden kan han inte se vÀrden som fanns i det förflutna. Han börjar redan se prefixavlÀsningar. Allt handlar om samma sak.
Causals som konsistensmodell Àr en partiell ordning av hÀndelser pÄ servern, dÀr hÀndelser frÄn alla klienter observeras i samma sekvens. I det hÀr fallet Leonard och Penny.

Eventuell

Den tredje modellen Àr Eventuell konsistens. Detta Àr vad absolut alla distribuerade system stödjer, den minimala modellen som överhuvudtaget Àr vettig. Det betyder följande: nÀr vi har nÄgra förÀndringar i data, nÄgon gÄng blir de konsekventa.

I ett sĂ„dant ögonblick sĂ€ger hon ingenting, annars skulle hon förvandlas till Extern Konsistens - det skulle vara en helt annan historia. ÄndĂ„ Ă€r detta en mycket populĂ€r modell, den vanligaste. Som standard anvĂ€nder alla anvĂ€ndare av distribuerade system Eventuell konsistens.

Jag vill ge nÄgra jÀmförande exempel:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Vad betyder dessa pilar?

  • Latens. NĂ€r konsistensstyrkan ökar blir den större av förklarliga skĂ€l: du behöver göra fler poster, fĂ„ bekrĂ€ftelse frĂ„n alla vĂ€rdar och noder som deltar i klustret att datan redan finns dĂ€r. Följaktligen har Eventuell konsistens det snabbaste svaret, för dĂ€r, som regel, kan du till och med förbinda det till minnet och det kommer i princip att rĂ€cka.
  • TillgĂ€nglighet. Om vi ​​förstĂ„r detta som systemets förmĂ„ga att reagera i nĂ€rvaro av nĂ€tverksavbrott, partitioner eller nĂ„gon form av fel, ökar feltoleransen nĂ€r konsistensmodellen minskar, eftersom det rĂ€cker för oss att en vĂ€rd lever och samtidigt tiden producerar vissa data. Eventuell konsistens garanterar inte nĂ„gonting om uppgifterna alls - det kan vara vad som helst.
  • Anomalier. Samtidigt ökar förstĂ„s antalet anomalier. I Strong Consistency borde de nĂ€stan inte existera alls, men i Eventual Consistency kan de vara vad som helst. FrĂ„gan uppstĂ„r: varför vĂ€ljer mĂ€nniskor Eventuell konsistens om den innehĂ„ller anomalier? Svaret Ă€r att Eventual Consistency-modeller Ă€r tillĂ€mpliga och anomalier finns till exempel under en kort tidsperiod; det Ă€r möjligt att anvĂ€nda guiden för att lĂ€sa och mer eller mindre lĂ€sa konsekventa data; Det Ă€r ofta möjligt att anvĂ€nda starka konsistensmodeller. I praktiken fungerar detta, och ofta Ă€r antalet anomalier tidsbegrĂ€nsat.

CAP-sats

NĂ€r du ser orden konsekvens, tillgĂ€nglighet – vad tĂ€nker du pĂ„? Det stĂ€mmer - CAP-teorem! Nu vill jag skingra myten... Det Ă€r inte jag - det Ă€r Martin Kleppmann, som skrev en underbar artikel, en underbar bok.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

CAP-satsen Àr en princip som formulerades pÄ 2000-talet att Konsistens, TillgÀnglighet, Partitioner: ta vilka tvÄ som helst och du kan inte vÀlja tre. Det var en viss princip. Det bevisades som ett teorem nÄgra Är senare av Gilbert och Lynch. Sedan började detta anvÀndas som ett mantra - system började delas upp i CA, CP, AP och sÄ vidare.

Denna sats bevisades faktiskt för följande fall... För det första ansÄgs tillgÀnglighet inte vara ett kontinuerligt vÀrde frÄn noll till hundratals (0 - systemet Àr "dött", 100 - svarar snabbt; vi Àr vana vid att betrakta det sÄ) , men som en egenskap hos algoritmen , som garanterar att den returnerar data för alla dess exekveringar.

Det finns inte ett ord om svarstid alls! Det finns en algoritm som returnerar data efter 100 Ă„r – en helt underbar tillgĂ€nglig algoritm, som Ă€r en del av CAP-satsen.
För det andra: satsen bevisades för förÀndringar i vÀrdena för samma nyckel, trots att dessa förÀndringar kan Àndras i storlek. Detta betyder att de i verkligheten praktiskt taget inte anvÀnds, eftersom modellerna Àr olika Eventuell konsistens, stark konsistens (kanske).

Vad Àr allt detta till för? Dessutom Àr CAP-satsen i exakt den form som den bevisades praktiskt taget inte tillÀmplig och anvÀnds sÀllan. I teoretisk form begrÀnsar det pÄ nÄgot sÀtt allt. Det visar sig en viss princip som Àr intuitivt korrekt, men i allmÀnhet inte har bevisats.

Orsakskonsistens Àr den starkaste modellen

Vad som hÀnder nu Àr att du kan fÄ alla tre sakerna: Konsistens, TillgÀnglighet med hjÀlp av partitioner. I synnerhet Àr orsakskonsistens den starkaste konsistensmodellen, som fortfarande fungerar i nÀrvaro av partitioner (avbrott i nÀtverket). Det Àr dÀrför det Àr av sÄ stort intresse, och det Àr dÀrför vi tog upp det.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

För det första förenklar det arbetet för applikationsutvecklare. I synnerhet nÀrvaron av bra stöd frÄn servern: nÀr alla poster som förekommer inuti en klient garanterat kommer fram i samma sekvens pÄ en annan klient. För det andra tÄl den skiljevÀggar.

MongoDB inre kök

NÀr vi kommer ihÄg att det Àr lunch flyttar vi till köket. Jag ska berÀtta om systemmodellen, nÀmligen vad MongoDB Àr för de som hör talas om en sÄdan databas för första gÄngen.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

MongoDB (hÀdanefter kallat "MongoDB") Àr ett distribuerat system som stöder horisontell skalning, det vill sÀga skÀrning; och inom varje skÀrva stöder den ocksÄ dataredundans, det vill sÀga replikering.

Sharding i MongoDB (inte en relationsdatabas) utför automatisk balansering, det vill sÀga varje samling av dokument (eller "tabell" i termer av relationsdata) Àr uppdelad i bitar, och servern flyttar dem automatiskt mellan skÀrvor.

FrÄgeroutern, som distribuerar förfrÄgningar, för en klient Àr en klient genom vilken den fungerar. Den vet redan var och vilken data som finns och dirigerar alla förfrÄgningar till rÀtt skÀrva.

En annan viktig punkt: MongoDB Àr en enda master. Det finns en primÀr - den kan ta poster som stöder nycklarna som den innehÄller. Du kan inte skriva Multi-master.

Vi gjorde release 4.2 - nya intressanta saker dök upp dÀr. Framför allt infogade man Lucene - sök - nÀmligen körbar java direkt i Mongo och dÀr blev det möjligt att utföra sökningar genom Lucene, samma som i Elastica.

Och de gjorde en ny produkt - Charts, den finns Àven pÄ Atlas (Mongos egna moln). De har en gratis nivÄ - du kan leka med den. Jag gillade verkligen Charts - datavisualisering, vÀldigt intuitivt.

Ingredienser Orsakskonsistens

Jag rĂ€knade till cirka 230 artiklar som har publicerats i detta Ă€mne – frĂ„n Leslie Lampert. Nu frĂ„n mitt minne kommer jag att förmedla nĂ„gra delar av detta material till dig.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Allt började med en artikel av Leslie Lampert, som skrevs pÄ 1970-talet. Som du kan se pÄgÄr en del forskning om detta Àmne fortfarande. Nu upplever Causal konsekvens intresse i samband med utveckling av distribuerade system.

BegrÀnsningar

Vilka restriktioner finns det? Detta Àr faktiskt en av huvudpunkterna, eftersom de restriktioner som ett produktionssystem inför skiljer sig mycket frÄn de restriktioner som finns i akademiska artiklar. De Àr ofta ganska konstgjorda.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

  • För det första Ă€r "MongoDB" en enda mĂ€stare, som jag redan sa (detta förenklar avsevĂ€rt).
  • Vi anser att systemet bör stödja cirka 10 tusen skĂ€rvor. Vi kan inte fatta nĂ„gra arkitektoniska beslut som explicit begrĂ€nsar detta vĂ€rde.
  • Vi har ett moln, men vi antar att en person fortfarande ska ha möjligheten nĂ€r han laddar ner binĂ€r, startar den pĂ„ sin bĂ€rbara dator och allt fungerar utmĂ€rkt.
  • Vi utgĂ„r frĂ„n nĂ„got som Research sĂ€llan antar: externa kunder kan göra vad de vill. MongoDB Ă€r öppen kĂ€llkod. Följaktligen kan klienter vara sĂ„ smarta och arga - de kan vilja bryta allt. Vi spekulerar i att bysantinska felorer kan ha sitt ursprung.
  • För externa klienter som Ă€r utanför omkretsen finns det en viktig begrĂ€nsning: om den hĂ€r funktionen Ă€r inaktiverad bör ingen prestandaförsĂ€mring observeras.
  • En annan punkt Ă€r generellt anti-akademisk: kompatibiliteten mellan tidigare versioner och framtida. Gamla drivrutiner mĂ„ste stödja nya uppdateringar, och databasen mĂ„ste stödja gamla drivrutiner.

I allmÀnhet innebÀr allt detta restriktioner.

Orsakskonsistenskomponenter

Jag ska nu prata om nĂ„gra av komponenterna. Om vi ​​övervĂ€ger kausal konsistens i allmĂ€nhet kan vi vĂ€lja block. Vi valde bland verk som hör till ett visst block: BeroendespĂ„rning, val av klockor, hur dessa klockor kan synkroniseras med varandra och hur vi sĂ€kerstĂ€ller sĂ€kerhet - det hĂ€r Ă€r en grov översikt av vad jag kommer att prata om:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

FullstÀndig spÄrning av beroende

Varför behövs det? SÄ att nÀr data replikeras innehÄller varje post, varje dataÀndring information om vilka förÀndringar den beror pÄ. Den allra första och naiva förÀndringen Àr nÀr varje meddelande som innehÄller en post innehÄller information om tidigare meddelanden:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

I det hÀr exemplet Àr numret inom parentes rekordsiffrorna. Ibland överförs dessa poster med vÀrden till och med i sin helhet, ibland överförs vissa versioner. Summan av kardemumman Àr att varje förÀndring innehÄller information om den föregÄende (uppenbarligen bÀr allt detta inom sig).

Varför valde vi att inte anvĂ€nda detta tillvĂ€gagĂ„ngssĂ€tt (fullstĂ€ndig spĂ„rning)? Uppenbarligen, eftersom det hĂ€r tillvĂ€gagĂ„ngssĂ€ttet Ă€r opraktiskt: varje förĂ€ndring av ett socialt nĂ€tverk beror pĂ„ alla tidigare förĂ€ndringar i det sociala nĂ€tverket, överföring, sĂ€g, Facebook eller VKontakte i varje uppdatering. ÄndĂ„ finns det mycket forskning om Full Dependency Tracking – det hĂ€r Ă€r försociala nĂ€tverk; för vissa situationer fungerar det verkligen.

SpÄrning av explicit beroende

NĂ€sta Ă€r mer begrĂ€nsad. Även hĂ€r beaktas överföring av information, men endast det som Ă€r klart beroende. Vad som beror pĂ„ vad bestĂ€ms i regel av Ansökan. NĂ€r data replikeras, returnerar frĂ„gan endast svar nĂ€r tidigare beroenden har uppfyllts, det vill sĂ€ga visas. Detta Ă€r kĂ€rnan i hur kausal konsistens fungerar.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Hon ser att post 5 beror pÄ posterna 1, 2, 3, 4 - följaktligen vÀntar hon innan klienten har tillgÄng till Àndringarna som gjorts av Pennys Ätkomstbeslut, nÀr alla tidigare Àndringar redan har passerat databasen.

Det hÀr passar inte oss heller, eftersom det fortfarande finns för mycket information, och det kommer att sakta ner. Det finns ett annat tillvÀgagÄngssÀtt...

Lamport klocka

De Àr vÀldigt gamla. Lamport Clock innebÀr att dessa beroenden vikas till en skalÀr funktion, som kallas Lamport Clock.

En skalĂ€r funktion Ă€r ett abstrakt tal. Det kallas ofta för logisk tid. Med varje hĂ€ndelse ökar denna rĂ€knare. RĂ€knaren, som för nĂ€rvarande Ă€r kĂ€nd för processen, skickar varje meddelande. Det Ă€r klart att processer kan vara osynkroniserade, de kan ha helt andra tider. ÄndĂ„ balanserar systemet pĂ„ nĂ„got sĂ€tt klockan med sĂ„dana meddelanden. Vad hĂ€nder i det hĂ€r fallet?

Jag delar den stora skĂ€rvan i tvĂ„ för att göra det tydligt: ​​VĂ€nner kan bo i en nod, som innehĂ„ller en del av samlingen, och Feed kan bo i en annan nod, som innehĂ„ller en del av den hĂ€r samlingen. Är det tydligt hur de kan komma ur linjen? First Feed kommer att sĂ€ga: "Replicated" och sedan Friends. Om systemet inte ger nĂ„gon form av garanti för att flödet inte kommer att visas förrĂ€n Ă€ven Friends-beroendena i Friends-samlingen har levererats, sĂ„ kommer vi att ha exakt den situation som jag nĂ€mnde.

Du ser hur rÀknartiden pÄ Feed logiskt ökar:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

SÄ huvudegenskapen för denna Lamport-klocka och orsakskonsistens (förklarad genom Lamport-klocka) Àr denna: om vi har hÀndelser A och B, och hÀndelse B beror pÄ hÀndelse A*, sÄ följer det att den logiska tiden för hÀndelse A Àr mindre Àn Àn LogicalTime frÄn hÀndelse B.

* Ibland sÀger de ocksÄ att A hÀnde före B, det vill sÀga A hÀnde före B - detta Àr en viss relation som delvis ordnar hela uppsÀttningen av hÀndelser som hÀnde i allmÀnhet.

Motsatsen Àr felaktig. Detta Àr faktiskt en av de största nackdelarna med Lamport Clock - delordning. Det finns ett koncept om samtidiga hÀndelser, det vill sÀga hÀndelser dÀr varken (A hÀnde före B) eller (A hÀnde före B). Ett exempel skulle vara Leonards parallella tillÀgg av nÄgon annan som vÀn (inte ens Leonard, utan Sheldon, till exempel).
Det hÀr Àr egenskapen som ofta anvÀnds nÀr man arbetar med Lamport-klockor: de tittar specifikt pÄ funktionen och frÄn detta drar de slutsatsen att dessa hÀndelser kanske Àr beroende. Eftersom ett sÀtt Àr sant: om LogicalTime A Àr mindre Àn LogicalTime B, kan B inte hÀnda före A; och om mer, sÄ kanske.

Vektor klocka

Den logiska utvecklingen av Lamport-klockan Àr Vector Clock. De skiljer sig Ät genom att varje nod som finns hÀr innehÄller sin egen separata klocka, och de sÀnds som en vektor.
I det hÀr fallet ser du att det nollte indexet för vektorn Àr ansvarigt för Feed, och det första indexet för vektorn Àr för Friends (var och en av dessa noder). Och nu kommer de att öka: nollindexet för "Feed" ökar nÀr du skriver - 1, 2, 3:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Varför Àr Vector Clock bÀttre? Eftersom de lÄter dig ta reda pÄ vilka hÀndelser som Àr samtidiga och nÀr de intrÀffar pÄ olika noder. Detta Àr mycket viktigt för ett skÀrningssystem som MongoDB. Vi valde dock inte detta, Àven om det Àr en underbar grej, och det fungerar utmÀrkt, och det skulle nog passa oss...

Om vi ​​har 10 tusen skĂ€rvor kan vi inte överföra 10 tusen komponenter, Ă€ven om vi komprimerar det eller kommer pĂ„ nĂ„got annat - nyttolasten kommer fortfarande att vara flera gĂ„nger mindre Ă€n volymen för hela denna vektor. DĂ€rför, med att bita ihop vĂ„ra hjĂ€rtan och tĂ€nder, övergav vi detta tillvĂ€gagĂ„ngssĂ€tt och gick vidare till ett annat.

Nyckel TrueTime. Atomklocka

Jag sa att det skulle finnas en historia om Spanner. Det hÀr Àr en cool sak, direkt frÄn XNUMX-talet: atomur, GPS-synkronisering.

Vad Àr tanken? "Spanner" Àr ett Google-system som nyligen till och med blev tillgÀngligt för mÀnniskor (de lade till SQL till det). Varje transaktion dÀr har en tidsstÀmpel. Eftersom tiden Àr synkroniserad* kan varje hÀndelse tilldelas en specifik tid - atomklockor har en vÀntetid, varefter en annan tid garanteras "hÀnde".

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

SĂ„ledes, genom att helt enkelt skriva till databasen och vĂ€nta en viss tid, garanteras evenemangets serialiseringsbarhet automatiskt. De har den starkaste Konsistensmodellen man kan tĂ€nka sig i princip – det Ă€r Extern Konsistens.

* Detta Àr huvudproblemet med Lampart-klockor - de Àr aldrig synkrona pÄ distribuerade system. De kan skilja sig Ät; Àven med NTP fungerar de fortfarande inte sÀrskilt bra. "Spanner" har en atomklocka och synkroniseringen verkar vara mikrosekunder.

Varför valde vi inte? Vi utgÄr inte frÄn att vÄra anvÀndare har en inbyggd atomklocka. NÀr de dyker upp, som Àr inbyggda i varje bÀrbar dator, kommer det att finnas nÄgon sorts supercool GPS-synkronisering - dÄ ja... Men för tillfÀllet Àr det bÀsta som Àr möjligt Amazon, Base Stations - för fanatiker... SÄ vi anvÀnde andra klockor .

Hybrid klocka

Detta Àr faktiskt vad som tickar i MongoDB nÀr man sÀkerstÀller orsakskonsistens. Hur Àr de hybrider? Hybrid Àr ett skalÀrt vÀrde, men det har tvÄ komponenter:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

  • Den första Ă€r Unix-epoken (hur mĂ„nga sekunder har gĂ„tt sedan "datorvĂ€rldens början").
  • Det andra Ă€r ett steg, ocksĂ„ en 32-bitars osignerad int.

Det Àr allt, faktiskt. Det finns detta tillvÀgagÄngssÀtt: den del som Àr ansvarig för tiden synkroniseras med klockan hela tiden; varje gÄng en uppdatering sker synkroniseras denna del med klockan och det visar sig att tiden alltid Àr mer eller mindre korrekt, och inkrement gör att du kan skilja mellan hÀndelser som intrÀffade vid samma tidpunkt.

Varför Àr detta viktigt för MongoDB? Eftersom det lÄter dig göra nÄgon form av reservrestauranger vid en viss tidpunkt, det vill sÀga att hÀndelsen indexeras efter tid. Detta Àr viktigt nÀr vissa hÀndelser behövs; För en databas Àr hÀndelser Àndringar i databasen som intrÀffade med vissa tidsintervall.

Jag kommer bara att berÀtta den viktigaste anledningen för dig (snÀlla, berÀtta inte för nÄgon)! Vi gjorde detta eftersom det Àr sÄ organiserad, indexerad data ser ut i MongoDB OpLog. OpLog Àr en datastruktur som innehÄller absolut alla Àndringar i databasen: de gÄr först till OpLog, och sedan appliceras de pÄ sjÀlva lagringen i fallet nÀr det Àr ett replikerat datum eller fragment.

Detta var huvudorsaken. ÄndĂ„ finns det ocksĂ„ praktiska krav för att utveckla en databas, vilket gör att den ska vara enkel – lite kod, sĂ„ fĂ„ trasiga saker som möjligt som behöver skrivas om och testas. Det faktum att vĂ„ra oploggar indexerades av hybridklockor hjĂ€lpte mycket och gjorde att vi kunde göra rĂ€tt val. Det lönade sig verkligen och pĂ„ nĂ„got magiskt sĂ€tt fungerade det pĂ„ den allra första prototypen. Det var vĂ€ldigt coolt!

Klocksynkronisering

Det finns flera synkroniseringsmetoder som beskrivs i den vetenskapliga litteraturen. Jag pratar om synkronisering nÀr vi har tvÄ olika skÀrvor. Om det finns en replikuppsÀttning finns det inget behov av nÄgon synkronisering: detta Àr en "single master"; vi har en OpLog, i vilken alla Àndringar faller - i det hÀr fallet Àr allt redan sekventiellt bestÀllt i sjÀlva "Oplog". Men om vi har tvÄ olika skÀrvor Àr tidssynkronisering viktig hÀr. Det var hÀr vektorklockan hjÀlpte mer! Men vi har dem inte.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Den andra Àr lÀmplig - det hÀr Àr "Heartbeats". Det Àr möjligt att utbyta nÄgra signaler som uppstÄr varje tidsenhet. Men hjÀrtslagen Àr för lÄngsamma, vi kan inte tillhandahÄlla latens till vÄr klient.

Sann tid Ă€r naturligtvis en underbar sak. Men Ă„terigen, det hĂ€r Ă€r förmodligen framtiden... Även om det redan kan göras i Atlas, finns det redan snabba "Amazon"-tidssynkroniserare. Men det kommer inte att vara tillgĂ€ngligt för alla.

Skvaller Àr nÀr alla meddelanden inkluderar tid. Detta Àr ungefÀr vad vi anvÀnder. Varje meddelande mellan noder, en drivrutin, en datanod-router, absolut allt för MongoDB Àr nÄgot slags element, en databaskomponent som innehÄller en klocka som körs. De har betydelsen av hybridtid överallt, den överförs. 64 bitar? Detta tillÄter, detta Àr möjligt.

Hur fungerar det hela ihop?

HÀr tittar jag pÄ en replikuppsÀttning för att göra det lite enklare. Det finns primÀra och sekundÀra. SekundÀr replikerar och Àr inte alltid helt synkroniserad med primÀr.

En infogning sker i "Primery" med ett visst tidsvÀrde. Denna infogning ökar det interna antalet med 11, om detta Àr max. Eller sÄ kommer den att kontrollera klockvÀrdena och synkronisera med klockan om klockvÀrdena Àr högre. Detta gör att du kan organisera efter tid.

Efter att han gjort inspelningen intrÀffar ett viktigt ögonblick. Klockan Àr i "MongoDB" och ökas endast vid skrivning till "Oplog". Detta Àr den hÀndelse som Àndrar systemets tillstÄnd. I absolut alla klassiska artiklar anses en hÀndelse vara nÀr ett meddelande trÀffar en nod: meddelandet har kommit, vilket betyder att systemet har Àndrat tillstÄnd.

Detta beror pÄ att det under forskning inte Àr helt klart hur detta budskap kommer att tolkas. Vi vet med sÀkerhet att om det inte Äterspeglas i "Oplog", sÄ kommer det inte att tolkas pÄ nÄgot sÀtt, och en förÀndring i systemets tillstÄnd Àr bara en post i "Oplog". Detta förenklar allt för oss: modellen förenklar det och lÄter oss organisera det i en replikuppsÀttning och mÄnga andra anvÀndbara saker.

VÀrdet som redan Àr skrivet till "Oplog" returneras - vi vet att "Oplog" redan innehÄller detta vÀrde, och dess tid Àr 12. Nu börjar sÀg att lÀsa frÄn en annan nod (SekundÀr), och den sÀnder afterClusterTime i budskapet. Han sÀger: "Jag behöver allt som hÀnde Ätminstone efter 12 eller under tolv" (se bilden ovan).

Detta Àr vad som kallas Causal a consistent (CAT). Det finns ett sÄdant koncept i teorin att detta Àr en del av tiden, vilket Àr konsekvent i sig. I det hÀr fallet kan vi sÀga att detta Àr tillstÄndet för systemet som observerades vid tidpunkten 12.

Nu finns det inget hÀr Ànnu, eftersom den hÀr typen av simulerar situationen nÀr du behöver sekundÀren för att replikera data frÄn primÀren. Han vÀntar... Och nu har uppgifterna kommit - han returnerar dessa vÀrden tillbaka.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Det Àr ungefÀr sÄ det hela fungerar. NÀstan.

Vad betyder "nÀstan"? LÄt oss anta att det finns nÄgon person som har lÀst och förstÄtt hur allt detta fungerar. Jag insÄg att varje gÄng ClusterTime intrÀffar uppdaterar den den interna logiska klockan, och sedan ökar nÀsta post med en. Denna funktion tar 20 rader. LÄt oss sÀga att den hÀr personen sÀnder det största 64-bitarsnumret, minus ett.

Varför "minus ett"? Eftersom den interna klockan kommer att ersÀttas med detta vÀrde (uppenbarligen Àr detta den största möjliga och större Àn den aktuella tiden), dÄ kommer en ingÄng att ske i "Oplog", och klockan kommer att ökas med en annan enhet - och det kommer redan vara ett maximalt vÀrde (det finns helt enkelt alla enheter, det finns ingen annanstans att ta vÀgen), ohelgon ints).

Det Àr tydligt att systemet efter detta blir absolut otillgÀngligt för nÄgonting. Den kan bara lastas av och rengöras - mycket manuellt arbete. Full tillgÀnglighet:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Dessutom, om detta replikeras nÄgon annanstans, faller hela klustret helt enkelt ner. En absolut oacceptabel situation som vem som helst kan organisera mycket snabbt och enkelt! DÀrför ansÄg vi detta ögonblick som ett av de viktigaste. Hur kan man förhindra det?

VÄrt sÀtt Àr att signera clusterTime

SÄ hÀr sÀnds det i meddelandet (före den blÄ texten). Men vi började ocksÄ skapa en signatur (blÄ text):

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Signaturen genereras av en nyckel som lagras inuti databasen, inom en sÀker omkrets; sjÀlv genereras och uppdateras (anvÀndarna ser inget om det). En hash genereras och varje meddelande signeras nÀr det skapas och valideras nÀr det tas emot.
FrÄgan uppstÄr förmodligen i mÀnniskors medvetande: "Hur mycket saktar detta upp saker?" Jag sa till dig att det borde fungera snabbt, sÀrskilt i frÄnvaro av denna funktion.

Vad innebÀr det att anvÀnda orsakskonsistens i det hÀr fallet? Detta Àr för att visa afterClusterTime-parametern. Utan detta kommer det helt enkelt att passera vÀrden ÀndÄ. Skvaller, frÄn och med version 3.6, fungerar alltid.

Om vi ​​lĂ€mnar den stĂ€ndiga genereringen av signaturer kommer det att bromsa systemet Ă€ven i frĂ„nvaro av en funktion, som inte uppfyller vĂ„ra tillvĂ€gagĂ„ngssĂ€tt och krav. SĂ„ vad gjorde vi?

Gör det snabbt!

Det Ă€r en ganska enkel sak, men tricket Ă€r intressant – jag delar det, kanske nĂ„gon Ă€r intresserad.
Vi har en hash som lagrar den signerade datan. All data gÄr genom cachen. Cachen anger inte den specifika tiden, utan Range. NÀr nÄgot vÀrde anlÀnder genererar vi ett intervall, maskerar de sista 16 bitarna, och vi signerar detta vÀrde:

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Genom att ta emot en sÄdan signatur snabbar vi upp systemet (relativt) 65 tusen gÄnger. Det fungerar utmÀrkt: nÀr vi utförde experiment minskade tiden faktiskt med 10 tusen gÄnger nÀr vi hade en sekventiell uppdatering. Det Àr klart att nÀr de Àr osams sÄ fungerar inte detta. Men i de flesta praktiska fall fungerar det. Kombinationen av Range-signaturen tillsammans med signaturen löste sÀkerhetsproblemet.

Vad har vi lÀrt oss?

LÀrdomar vi lÀrde oss av detta:

  • Vi behöver lĂ€sa material, berĂ€ttelser, artiklar, för vi har mĂ„nga intressanta saker. NĂ€r vi arbetar med nĂ„gon funktion (sĂ€rskilt nu, nĂ€r vi gjorde transaktioner, etc.), mĂ„ste vi lĂ€sa och förstĂ„. Det tar tid, men det Ă€r faktiskt vĂ€ldigt anvĂ€ndbart eftersom det gör det tydligt var vi Ă€r. Vi verkade inte komma pĂ„ nĂ„got nytt – vi tog bara ingredienserna.

    Generellt Ă€r det en viss skillnad i tĂ€nkandet nĂ€r det Ă€r en akademisk konferens (Sigmon till exempel) – alla fokuserar pĂ„ nya idĂ©er. Vad Ă€r nytt med vĂ„r algoritm? Det finns ingen speciell nyhet hĂ€r. Nyheten ligger snarare i hur vi kombinerade befintliga tillvĂ€gagĂ„ngssĂ€tt. DĂ€rför Ă€r det första att lĂ€sa klassikerna, börja med Lampart.

  • I produktionen Ă€r kraven helt andra. Jag Ă€r sĂ€ker pĂ„ att mĂ„nga av er inte stĂ„r inför "sfĂ€riska" databaser i ett abstrakt vakuum, utan med normala, verkliga saker som har problem med tillgĂ€nglighet, latens och feltolerans.
  • Det sista Ă€r att vi var tvungna att titta pĂ„ olika idĂ©er och kombinera flera helt olika artiklar till ett tillvĂ€gagĂ„ngssĂ€tt, tillsammans. IdĂ©n om att skriva pĂ„ kom till exempel generellt frĂ„n en artikel som övervĂ€gde Paxos-protokollet, som för icke-bysantinska misslyckanden Ă€r inom auktoriseringsprotokollet, för bysantinska - utanför auktorisationsprotokollet... Generellt sett Ă€r det precis vad vi slutade göra.

    Det Àr absolut inget nytt hÀr! Men sÄ fort vi blandat ihop allt... Det Àr samma sak som att sÀga att Olivier-salladsreceptet Àr nonsens, för Àgg, majonnÀs och gurka har redan uppfunnits... Det Àr ungefÀr samma historia.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

Jag avslutar med det hÀr. Tack!

frÄgor

FrĂ„ga frĂ„n publiken (nedan kallad B): – Tack, Mikhail, för rapporten! Ämnet om tid Ă€r intressant. Du anvĂ€nder Gossiping. De sa att alla har sin egen tid, alla kĂ€nner sin lokala tid. Som jag förstĂ„r det har vi en drivrutin - det kan finnas mĂ„nga klienter med drivrutiner, frĂ„geplanerare ocksĂ„, skĂ€rvor ocksĂ„... Och vad kommer systemet till om vi plötsligt har en diskrepans: nĂ„gon bestĂ€mmer att det Ă€r för en minut före, nĂ„gon minut efter? Var hamnar vi?

MT: – Verkligen bra frĂ„ga! Jag ville bara prata om skĂ€rvor. Om jag förstĂ„r frĂ„gan rĂ€tt har vi följande situation: det finns skĂ€rva 1 och skĂ€rva 2, lĂ€sning sker frĂ„n dessa tvĂ„ skĂ€rvor - de har en diskrepans, de interagerar inte med varandra, eftersom tiden som de kĂ€nner till Ă€r olika, speciellt den tid som de finns i oplogs.
LÄt oss sÀga att shard 1 gjorde en miljon rekord, shard 2 gjorde ingenting alls, och begÀran kom till tvÄ shards. Och den första har en afterClusterTime pÄ över en miljon. I en sÄdan situation, som jag förklarade, kommer shard 2 aldrig att svara alls.

PÅ: – Jag ville veta hur de synkroniserar och vĂ€ljer en logisk tidpunkt?

MT: - Mycket lÀtt att synkronisera. Shard, nÀr afterClusterTime kommer till honom och han inte hittar tid i "Oploggen", initierar ingen godkÀnd. Det vill sÀga, han höjer sin tid med hÀnderna till detta vÀrde. Det betyder att det inte har nÄgra hÀndelser som matchar denna begÀran. Han skapar denna hÀndelse artificiellt och blir dÀrmed kausalkonsistent.

PÅ: – TĂ€nk om efter detta kommer nĂ„gra andra hĂ€ndelser till honom som gĂ„tt förlorade nĂ„gonstans i nĂ€tverket?

MT: – Shard Ă€r designad pĂ„ ett sĂ„dant sĂ€tt att de inte kommer igen, eftersom det Ă€r en enda mĂ€stare. Har han redan anmĂ€lt sig sĂ„ kommer de inte utan kommer senare. Det kan inte hĂ€nda att nĂ„got fastnar nĂ„gonstans, dĂ„ skriver han inget, och sedan kommer dessa hĂ€ndelser - och den kausala konsistensen bryts. NĂ€r han inte skriver, bör de alla komma hĂ€rnĂ€st (han vĂ€ntar pĂ„ dem).

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

PÅ: – Jag har flera frĂ„gor angĂ„ende köerna. OrsaksöverensstĂ€mmelse förutsĂ€tter att det finns en specifik kö av Ă„tgĂ€rder som mĂ„ste utföras. Vad hĂ€nder om ett av vĂ„ra paket försvinner? HĂ€r kommer den 10:e, 11:e... den 12:e har försvunnit, och alla andra vĂ€ntar pĂ„ att det ska bli verklighet. Och plötsligt dog vĂ„r bil, vi kan inte göra nĂ„gonting. Finns det en maximal lĂ€ngd pĂ„ kön som ackumuleras innan den exekveras? Vilket dödligt misslyckande intrĂ€ffar nĂ€r nĂ„gon stat gĂ„r förlorad? Dessutom, om vi skriver ner att det finns nĂ„got tidigare tillstĂ„nd, borde vi pĂ„ nĂ„got sĂ€tt utgĂ„ frĂ„n det? Men de knuffade honom inte!

MT: – OcksĂ„ en bra frĂ„ga! Vad gör vi? MongoDB har begreppet kvorum skriver, kvorum lĂ€ser. I vilka fall kan ett meddelande gĂ„ förlorat? NĂ€r en skrivning inte Ă€r beslutför eller nĂ€r en lĂ€sning inte Ă€r beslutför (nĂ„gon sorts skrĂ€p kan ocksĂ„ fastna).
NÀr det gÀller kausal överensstÀmmelse genomfördes ett stort experimentellt test, vars resultat var att i fallet nÀr skrivningar och lÀsningar Àr icke-quorum, intrÀffar krÀnkningar av kausal konsistens. Precis vad du sÀger!

VÄrt rÄd: anvÀnd Ätminstone kvorumlÀsning nÀr du anvÀnder kausal konsistens. I det hÀr fallet kommer ingenting att gÄ förlorat, Àven om kvorumposten gÄr förlorad... Detta Àr en ortogonal situation: om anvÀndaren inte vill att data ska gÄ förlorade mÄste han anvÀnda en kvorumpost. Orsakskonsistens garanterar inte hÄllbarhet. HÄllbarhet garanteras av replikering och maskineriet i samband med replikering.

PÅ: – NĂ€r vi skapar en instans som utför sharding Ă„t oss (inte master, men slav, respektive), förlitar den sig pĂ„ Unix-tiden för sin egen maskin eller pĂ„ tiden för "mĂ€staren"; Synkas den för första gĂ„ngen eller periodvis?

MT: – Jag ska förtydliga nu. Shard (dvs horisontell partition) – det finns alltid en primĂ€r dĂ€r. Och en skĂ€rva kan ha en "mĂ€stare" och det kan finnas repliker. Men skĂ€rvan stöder alltid inspelning, eftersom den mĂ„ste stödja nĂ„gon domĂ€n (skĂ€rvan har PrimĂ€r).

PÅ: – SĂ„ allt beror enbart pĂ„ "mĂ€staren"? AnvĂ€nds alltid mĂ€startid?

MT: - Ja. Du kan bildligt talat sÀga: klockan tickar nÀr ett intrÀde i "master", i "Oplog" intrÀffar.

PÅ: – Vi har en kund som ansluter och inte behöver veta nĂ„got om tiden?

MT: – Du behöver inte veta nĂ„got alls! Om vi ​​pratar om hur det fungerar pĂ„ klienten: nĂ€r klienten vill anvĂ€nda Causal konsekvens mĂ„ste han öppna en session. Nu finns allt dĂ€r: transaktioner i sessionen, och hĂ€mta en rĂ€ttighet... En session Ă€r bestĂ€llningen av logiska hĂ€ndelser som intrĂ€ffar med klienten.

Om han öppnar den hÀr sessionen och dÀr sÀger att han vill ha orsakskonsistens (om sessionen stöder orsakskonsistens som standard), fungerar allt automatiskt. Föraren kommer ihÄg denna tid och ökar den nÀr den fÄr ett nytt meddelande. Den kommer ihÄg vilket svar den föregÄende returnerade frÄn servern som returnerade data. NÀsta begÀran kommer att innehÄlla afterCluster("tid lÀngre Àn detta").

Kunden behöver inte veta absolut nÄgonting! Detta Àr helt ogenomskinligt för honom. Om mÀnniskor anvÀnder dessa funktioner, vad kan de göra? För det första kan du sÀkert lÀsa sekundÀrer: du kan skriva till PrimÀr och lÀsa frÄn geografiskt replikerade sekundÀrer och vara sÀker pÄ att det fungerar. Samtidigt kan sessioner som spelades in pÄ Primary till och med överföras till Secondary, d.v.s. du kan anvÀnda inte en session, utan flera.

PÅ: – Ett nytt lager av berĂ€kningsvetenskap – CRDT (Conflict-free Replicated Data Types) datatyper – Ă€r starkt relaterat till Ă€mnet Eventuell konsekvens. Har du funderat pĂ„ att integrera den hĂ€r typen av data i databasen och vad kan du sĂ€ga om det?

MT: - Bra frÄga! CRDT Àr vettigt för skrivkonflikter: i MongoDB, single master.

PÅ: – Jag har en frĂ„ga frĂ„n devops. I den verkliga vĂ€rlden finns det sĂ„dana jesuitiska situationer nĂ€r det bysantinska misslyckandet intrĂ€ffar, och onda mĂ€nniskor innanför den skyddade omkretsen börjar peta in i protokollet, skicka hantverkspaket pĂ„ ett speciellt sĂ€tt?

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

MT: – Onda mĂ€nniskor innanför omkretsen Ă€r som en trojansk hĂ€st! Onda mĂ€nniskor innanför omkretsen kan göra mĂ„nga dĂ„liga saker.

PÅ: – Det Ă€r tydligt att lĂ€mna, grovt sett, ett hĂ„l i servern genom vilket man kan trycka en djurpark av elefanter och kollapsa hela klungan för alltid... Det kommer att ta tid för manuell Ă„terstĂ€llning... Detta, milt uttryckt, Ă€r fel. Å andra sidan Ă€r detta intressant: i verkligheten, i praktiken, finns det situationer nĂ€r naturligt liknande interna attacker intrĂ€ffar?

MT: – Eftersom jag sĂ€llan stöter pĂ„ sĂ€kerhetsintrĂ„ng i verkliga livet kan jag inte sĂ€ga om de intrĂ€ffar. Men om vi pratar om utvecklingsfilosofin tĂ€nker vi sĂ„ hĂ€r: vi har en omkrets som ger killarna som gör sĂ€kerhet - det hĂ€r Ă€r ett slott, en mur; och innanför omkretsen kan du göra vad du vill. Det Ă€r tydligt att det finns anvĂ€ndare med möjligheten att bara visa, och det finns anvĂ€ndare med möjlighet att radera katalogen.

Beroende pÄ rÀttigheterna kan skadan som anvÀndare kan göra vara en mus, eller det kan vara en elefant. Det Àr tydligt att en anvÀndare med fullstÀndiga rÀttigheter kan göra vad som helst. En anvÀndare med begrÀnsade rÀttigheter kan orsaka betydligt mindre skada. I synnerhet kan det inte bryta systemet.

PÅ: – I den skyddade omkretsen försökte nĂ„gon skapa ovĂ€ntade protokoll för servern för att fullstĂ€ndigt förstöra servern, och om du har tur, hela klustret... Blir det nĂ„gonsin sĂ„ "bra"?

MT: "Jag har aldrig hört talas om sÄdana saker." Att du kan krascha en server pÄ detta sÀtt Àr ingen hemlighet. Misslyckas inuti, Àr frÄn protokollet, Àr en auktoriserad anvÀndare som kan skriva nÄgot liknande i meddelandet... Det Àr faktiskt omöjligt, eftersom det fortfarande kommer att verifieras. Det Àr möjligt att inaktivera denna autentisering för anvÀndare som inte vill ha den - dÄ Àr det deras problem; de, grovt sett, förstörde sjÀlva vÀggarna och du kan trycka in en elefant dÀr, som kommer att trampa... Men generellt sett kan du klÀ ut dig till en reparatör, kom och dra ut den!

PÅ: – Tack för rapporten. Sergey (Yandex). Det finns en konstant i Mong som begrĂ€nsar antalet röstberĂ€ttigade medlemmar i replikuppsĂ€ttningen, och denna konstant Ă€r 7 (sju). Varför Ă€r detta en konstant? Varför Ă€r inte detta nĂ„gon slags parameter?

MT: – Vi har Replica Sets med 40 noder. Det finns alltid en majoritet. Jag vet inte vilken version...

PÅ: – I Replica Set kan du köra medlemmar som inte har röstrĂ€tt, men det finns maximalt 7 röstberĂ€ttigade medlemmar. Hur kan vi överleva avstĂ€ngningen i det hĂ€r fallet om vĂ„r Replica Set Ă€r spridd över 3 datacenter? Ett datacenter kan enkelt stĂ€ngas av, och en annan maskin kan ramla ut.

MT: – Det hĂ€r ligger redan lite utanför rapportens ram. Detta Ă€r en allmĂ€n frĂ„ga. Jag kanske kan berĂ€tta om det senare.

HighLoad++, Mikhail Tyulenev (MongoDB): Orsakskonsistens: frÄn teori till praktik

NĂ„gra annonser 🙂

Tack för att du stannar hos oss. Gillar du vĂ„ra artiklar? Vill du se mer intressant innehĂ„ll? Stöd oss ​​genom att lĂ€gga en bestĂ€llning eller rekommendera till vĂ€nner, moln VPS för utvecklare frĂ„n $4.99, en unik analog av ingĂ„ngsservrar, som uppfanns av oss för dig: Hela sanningen om VPS (KVM) E5-2697 v3 (6 kĂ€rnor) 10GB DDR4 480GB SSD 1Gbps frĂ„n $19 eller hur delar man en server? (tillgĂ€nglig med RAID1 och RAID10, upp till 24 kĂ€rnor och upp till 40 GB DDR4).

Dell R730xd 2 gÄnger billigare i Equinix Tier IV datacenter i Amsterdam? Bara hÀr 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV frÄn $199 i NederlÀnderna! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - frÄn $99! LÀs om Hur man bygger infrastructure corp. klass med anvÀndning av Dell R730xd E5-2650 v4-servrar vÀrda 9000 XNUMX euro för en slant?

KĂ€lla: will.com

LĂ€gg en kommentar