HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Nākamā HighLoad++ konference notiks 6. gada 7. un 2020. aprīlī Sanktpēterburgā.
SÄ«kāka informācija un biļetes ŠæŠ¾ ссыŠ»ŠŗŠµ. HighLoad++ SibÄ«rija 2019. Halle "Krasnojarska". 25. jÅ«nijā 12:00. Tēzes un prezentācija.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Gadās, ka praktiskās prasÄ«bas konfliktē ar teoriju, kur netiek ņemti vērā komerciālam produktam svarÄ«gi aspekti. Å ajā runā ir aprakstÄ«ts process dažādu pieeju atlasei un apvienoÅ”anai, lai radÄ«tu cēloņsakarÄ«bas komponentus, pamatojoties uz akadēmiskiem pētÄ«jumiem, kuru pamatā ir komerciāla produkta prasÄ«bas. KlausÄ«tāji uzzinās par esoÅ”ajām teorētiskajām pieejām loÄ£iskajiem pulksteņiem, atkarÄ«bas izsekoÅ”anu, sistēmas droŔību, pulksteņu sinhronizāciju un to, kāpēc MongoDB izvēlējās noteiktus risinājumus.

Mihails Tjuļeņevs (turpmāk tekstā MT): ā€“ Es runāŔu par cēloņsakarÄ«bu konsekvenci ā€“ tā ir funkcija, pie kuras mēs strādājām MongoDB. Es strādāju sadalÄ«to sistēmu grupā, mēs to darÄ«jām apmēram pirms diviem gadiem.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Å ajā procesā man bija jāiepazÄ«stas ar daudziem akadēmiskiem pētÄ«jumiem, jo ā€‹ā€‹Å”Ä« iezÄ«me ir diezgan labi izpētÄ«ta. IzrādÄ«jās, ka ne viens vien raksts neietilpst ražoÅ”anas datubāzē prasÄ«tajā ļoti specifisku prasÄ«bu dēļ, kas, iespējams, ir jebkurā ražoÅ”anas lietojumprogrammā.

Es runāŔu par to, kā mēs, akadēmisko pētÄ«jumu patērētāji, no tā pagatavojam kaut ko, ko pēc tam varam pasniegt saviem lietotājiem kā gatavu ēdienu, kuru ir ērti un droÅ”i lietot.

Cēloņsakarība. Definēsim jēdzienus

Sākumā es vēlos vispārīgi pateikt, kas ir cēloņsakarība. Ir divi varoņi - Leonards un Penija (seriāls "Lielā sprādziena teorija"):

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Pieņemsim, ka Penija ir Eiropā un Leonards vēlas viņai sarÄ«kot pārsteiguma ballÄ«ti. Un viņŔ nevar iedomāties neko labāku kā izmest viņu no sava draugu saraksta un nosÅ«tÄ«t visiem draugiem jaunumus par plÅ«smu: ā€œPadarÄ«sim Peniju laimÄ«gu!ā€ (viņa ir Eiropā, kamēr guļ, viņa to visu neredz un nevar redzēt, jo viņas tur nav). Galu galā viņa izdzÄ“Å” Å”o ziņu, izdzÄ“Å” to no plÅ«smas un atjauno piekļuvi, lai viņa neko nepamanÄ«tu un nerastos skandāls.
Tas viss ir labi, taču pieņemsim, ka sistēma ir izplatÄ«ta un viss nogāja greizi. Piemēram, var gadÄ«ties, ka Pennijas piekļuves ierobežojums notika pēc Ŕīs ziņas parādÄ«Å”anās, ja notikumi nav saistÄ«ti ar cēloņiem un sekām. Faktiski Å”is ir piemērs, kad, lai veiktu uzņēmējdarbÄ«bas funkciju (Å”ajā gadÄ«jumā), ir nepiecieÅ”ama cēloņsakarÄ«ba.

Faktiski Ŕīs ir diezgan nenozÄ«mÄ«gas datu bāzes Ä«paŔības - ļoti maz cilvēku tos atbalsta. Pāriesim pie modeļiem.

Konsekvences modeļi

Kas īsti ir konsekvences modelis datu bāzēs? Šīs ir dažas no garantijām, ko izkliedētā sistēma sniedz par to, kādus datus klients var saņemt un kādā secībā.

Principā visi konsekvences modeļi ir saistÄ«ti ar to, cik lÄ«dzÄ«ga izplatÄ«tā sistēma ir sistēmai, kas darbojas, piemēram, vienā klēpjdatora mezglā. Un Ŕādi sistēma, kas darbojas uz tÅ«kstoÅ”iem Ä£eogrāfiski sadalÄ«tu ā€œmezgluā€, ir lÄ«dzÄ«ga klēpjdatoram, kurā visas Ŕīs Ä«paŔības principā tiek veiktas automātiski.

Tāpēc konsekvences modeļi tiek piemēroti tikai sadalÄ«tajām sistēmām. Visām sistēmām, kas iepriekÅ” pastāvēja un darbojās ar tādu paÅ”u vertikālo mērogoÅ”anu, Ŕādas problēmas nebija. Bija viena bufera keÅ”atmiņa, un no tās vienmēr tika nolasÄ«ts viss.

Modelis Spēcīgs

Faktiski pats pirmais modelis ir Strong (vai pieauguma spēju lÄ«nija, kā to bieži sauc). Å is ir konsekvences modelis, kas nodroÅ”ina, ka visas izmaiņas, tiklÄ«dz tās ir apstiprinātas, ir redzamas visiem sistēmas lietotājiem.

Tādējādi tiek izveidota visu datubāzes notikumu globāla secÄ«ba. Tas ir ļoti spēcÄ«gas konsekvences Ä«paÅ”ums, un tas parasti ir ļoti dārgs. Tomēr tas ir ļoti labi atbalstÄ«ts. Tas vienkārÅ”i ir ļoti dārgs un lēns ā€“ to vienkārÅ”i izmanto reti. To sauc par pieauguma spēju.

Ir vēl viens, spēcÄ«gāks Ä«paÅ”ums, kas tiek atbalstÄ«ts Spanner ā€” ar nosaukumu Ārējā konsekvence. Mēs par to runāsim nedaudz vēlāk.

Cēloņsakarība

Nākamais ir Causal, par ko es runāju tieÅ”i. Starp SpēcÄ«go un CēloņsakarÄ«bu ir vēl vairāki apakÅ”lÄ«meņi, par kuriem es nerunāŔu, bet tie visi ir saistÄ«ti ar cēloņsakarÄ«bu. Å is ir svarÄ«gs modelis, jo tas ir spēcÄ«gākais no visiem modeļiem, spēcÄ«gākā konsekvence tÄ«kla vai nodalÄ«jumu klātbÅ«tnē.

Cēloņi patiesÄ«bā ir situācija, kurā notikumus saista cēloņu un seku attiecÄ«bas. Ä»oti bieži tās tiek uztvertas kā LasÄ«t savas tiesÄ«bas no klienta viedokļa. Ja klients ir ievērojis kādas vērtÄ«bas, viņŔ nevar redzēt vērtÄ«bas, kas bijuÅ”as pagātnē. ViņŔ jau sāk redzēt prefiksu rādÄ«jumus. Tas viss ir saistÄ«ts ar vienu un to paÅ”u.
Cēloņi kā konsekvences modelis ir daļēja notikumu sakārtoÅ”ana serverÄ«, kurā notikumi no visiem klientiem tiek novēroti vienā secÄ«bā. Å ajā gadÄ«jumā Leonards un Penija.

Iespējams

TreÅ”ais modelis ir galÄ«gā konsekvence. Tas ir tas, ko atbalsta absolÅ«ti visas izplatÄ«tās sistēmas, minimālais modelis, kam vispār ir jēga. Tas nozÄ«mē sekojoÅ”o: kad mums ir dažas izmaiņas datos, kādā brÄ«dÄ« tās kļūst konsekventas.

Tādā brÄ«dÄ« viņa neko nesaka, citādi viņa pārvērstos par Ārēju konsekvenci ā€“ tas bÅ«tu pavisam cits stāsts. Tomēr Å”is ir ļoti populārs modelis, visizplatÄ«tākais. Pēc noklusējuma visi izplatÄ«to sistēmu lietotāji izmanto iespējamo konsekvenci.

Es vēlos sniegt dažus salÄ«dzinoÅ”us piemērus:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Ko nozÄ«mē Ŕīs bultiņas?

  • Latentums. Palielinoties konsekvences stiprumam, tas acÄ«mredzamu iemeslu dēļ kļūst lielāks: jums ir jāveic vairāk ierakstu, jāsaņem apstiprinājums no visiem resursdatoriem un mezgliem, kas piedalās klasterÄ«, ka dati jau ir tur. AttiecÄ«gi Eventual Consistency ir ātrākā atbilde, jo tur, kā likums, to var pat ierakstÄ«t atmiņā un ar to principā pietiks.
  • PieejamÄ«ba. Ja mēs to saprotam kā sistēmas spēju reaģēt tÄ«kla pārtraukumu, nodalÄ«jumu vai kāda veida kļūmju klātbÅ«tnē, kļūdu tolerance palielinās, samazinoties konsekvences modelim, jo ā€‹ā€‹mums pietiek ar to, ka dzÄ«vo viens resursdators un tajā paŔā laikā. laiks rada dažus datus. GalÄ«gā konsekvence negarantē neko par datiem - tas var bÅ«t jebkas.
  • Anomālijas. Tajā paŔā laikā, protams, palielinās anomāliju skaits. SpēcÄ«gā konsekvencē tiem gandrÄ«z nemaz nevajadzētu pastāvēt, bet galÄ«gajā konsekvenci tie var bÅ«t jebkas. Rodas jautājums: kāpēc cilvēki izvēlas GalÄ«go konsekvenci, ja tajā ir anomālijas? Atbilde ir tāda, ka ir piemērojami GalÄ«gās konsekvences modeļi un anomālijas pastāv, piemēram, Ä«sā laika periodā; ir iespējams izmantot vedni, lai nolasÄ«tu un vairāk vai mazāk nolasÄ«tu konsekventus datus; Bieži vien ir iespējams izmantot spēcÄ«gas konsekvences modeļus. Praksē tas darbojas, un bieži vien anomāliju skaits ir ierobežots laikā.

CAP teorēma

Kad redzat vārdus konsekvence, pieejamÄ«ba ā€“ kas jums ienāk prātā? TieÅ”i tā - CAP teorēma! Tagad es vēlos kliedēt mÄ«tu... Tas neesmu es ā€” tas esmu Martins Kleppmans, kurÅ” uzrakstÄ«ja brÄ«niŔķīgu rakstu, brÄ«niŔķīgu grāmatu.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

KLP teorēma ir 2000. gados formulēts princips, ka konsekvence, pieejamība, starpsienas: ņemiet jebkurus divus, un jūs nevarat izvēlēties trīs. Tas bija zināms princips. Dažus gadus vēlāk to kā teorēmu pierādīja Gilberts un Linčs. Tad to sāka izmantot kā mantru - sistēmas sāka dalīt CA, CP, AP un tā tālāk.

Å Ä« teorēma faktiski tika pierādÄ«ta Ŕādiem gadÄ«jumiem... Pirmkārt, PieejamÄ«ba netika uzskatÄ«ta par nepārtrauktu vērtÄ«bu no nulles lÄ«dz simtiem (0 - sistēma ir "mirusi", 100 - reaģē ātri; mēs esam pieraduÅ”i to uzskatÄ«t tā) , bet gan kā algoritma Ä«paŔība , kas garantē, ka visām tā izpildēm tas atgriež datus.

Par reakcijas laiku vispār nav ne vārda! Ir algoritms, kas atgriež datus pēc 100 gadiem ā€“ absolÅ«ti brÄ«niŔķīgs pieejamais algoritms, kas ir daļa no KLP teorēmas.
Otrkārt: teorēma tika pierādÄ«ta vienas un tās paÅ”as atslēgas vērtÄ«bu izmaiņām, neskatoties uz to, ka Ŕīs izmaiņas ir maināmas. Tas nozÄ«mē, ka reāli tos praktiski neizmanto, jo modeļi ir dažādi GalÄ«gā konsistence, Strong Consistency (varbÅ«t).

PriekÅ” kam tas viss? Turklāt KLP teorēma tieÅ”i tādā formā, kādā tā tika pierādÄ«ta, praktiski nav piemērojama un tiek izmantota reti. Teorētiskā formā tas kaut kā visu ierobežo. Izrādās zināms princips, kas intuitÄ«vi ir pareizs, bet kopumā nav pierādÄ«ts.

Cēloņsakarība ir spēcīgākais modelis

Tagad notiek tas, ka jūs varat iegūt visas trīs lietas: konsekvenci, pieejamību, izmantojot nodalījumus. Konkrēti, cēloņsakarības konsekvence ir spēcīgākais konsekvences modelis, kas joprojām darbojas starpsienu (tīkla pārtraukumu) klātbūtnē. Tāpēc tas rada tik lielu interesi, un tāpēc mēs to pieņēmām.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Pirmkārt, tas vienkārÅ”o lietojumprogrammu izstrādātāju darbu. Jo Ä«paÅ”i liela atbalsta klātbÅ«tne no servera: kad visi ieraksti, kas notiek vienā klientā, tiek garantēti tādā paŔā secÄ«bā nonākuÅ”i citā klientā. Otrkārt, tas iztur starpsienas.

MongoDB iekŔējā virtuve

Atceroties, ka ir pusdienas, virzāmies uz virtuvi. Es pastāstÄ«Å”u par sistēmas modeli, proti, kas ir MongoDB tiem, kas par Ŕādu datu bāzi dzird pirmo reizi.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

MongoDB (turpmāk tekstā ā€œMongoDBā€) ir izplatÄ«ta sistēma, kas atbalsta horizontālo mērogoÅ”anu, tas ir, sadalÄ«Å”anu; un katrā shardā tas atbalsta arÄ« datu dublÄ“Å”anu, tas ir, replikāciju.

DalÄ«Å”ana MongoDB (nevis relāciju datu bāzē) veic automātisku lÄ«dzsvaroÅ”anu, tas ir, katra dokumentu kolekcija (vai ā€œtabulaā€ relāciju datu izteiksmē) tiek sadalÄ«ta gabalos, un serveris tos automātiski pārvieto starp fragmentiem.

Vaicājumu marÅ”rutētājs, kas izplata pieprasÄ«jumus klientam, ir daži klienti, caur kuriem tas darbojas. Tas jau zina, kur un kādi dati atrodas, un novirza visus pieprasÄ«jumus uz pareizo shardu.

Vēl viens svarÄ«gs punkts: MongoDB ir viens meistars. Ir viens primārais ā€” tas var uzņemt ierakstus, kas atbalsta tajā esoŔās atslēgas. JÅ«s nevarat rakstÄ«t vairāku galveno funkciju.

Mēs izveidojām 4.2 versiju - tur parādÄ«jās jaunas interesantas lietas. Jo Ä«paÅ”i viņi ievietoja Lucene - meklÄ“Å”anu - proti, izpildāmo java tieÅ”i Mongo, un tur kļuva iespējams veikt meklÄ“Å”anu, izmantojot Lucene, tāpat kā Elastica.

Un viņi izveidoja jaunu produktu - Charts, tas ir pieejams arÄ« Atlas (Mongo paÅ”u mākonis). Viņiem ir bezmaksas lÄ«menis ā€” jÅ«s varat ar to spēlēties. Man ļoti patika Charts ā€“ datu vizualizācija, ļoti intuitÄ«va.

Sastāvdaļas Cēloņsakarības konsekvence

Es saskaitÄ«ju apmēram 230 rakstus, kas ir publicēti par Å”o tēmu - no Leslijas Lampertes. Tagad no savas atmiņas es jums nodoÅ”u dažas Å”o materiālu daļas.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Viss sākās ar Leslijas Lampertas rakstu, kas tapis 1970. gados. Kā redzat, daži pētÄ«jumi par Å”o tēmu joprojām turpinās. Tagad Causal konsekvence piedzÄ«vo interesi saistÄ«bā ar sadalÄ«to sistēmu attÄ«stÄ«bu.

Ierobežojumi

Kādi ierobežojumi pastāv? Tas patiesÄ«bā ir viens no galvenajiem punktiem, jo ā€‹ā€‹ierobežojumi, ko uzliek ražoÅ”anas sistēma, ļoti atŔķiras no ierobežojumiem, kas pastāv akadēmiskajos rakstos. Tie bieži ir diezgan mākslÄ«gi.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

  • Pirmkārt, ā€œMongoDBā€ ir viens meistars, kā jau teicu (tas ievērojami vienkārÅ”o).
  • Mēs uzskatām, ka sistēmai bÅ«tu jāatbalsta aptuveni 10 tÅ«kstoÅ”i lauskas. Mēs nevaram pieņemt nekādus arhitektÅ«ras lēmumus, kas nepārprotami ierobežotu Å”o vērtÄ«bu.
  • Mums ir mākonis, bet mēs pieņemam, ka cilvēkam joprojām ir jābÅ«t iespējai, kad viņŔ lejupielādē bināro failu, palaiž to savā klēpjdatorā, un viss darbojas lieliski.
  • Mēs pieņemam kaut ko tādu, ko Research reti pieņem: ārējie klienti var darÄ«t visu, ko vēlas. MongoDB ir atvērtā koda. AttiecÄ«gi klienti var bÅ«t tik gudri un dusmÄ«gi ā€“ var vēlēties visu lauzt. Mēs domājam, ka bizantieÅ”u feilori varētu bÅ«t cēluÅ”ies.
  • Ārējiem klientiem, kas atrodas ārpus perimetra, ir svarÄ«gs ierobežojums: ja Ŕī funkcija ir atspējota, veiktspējas pasliktināŔanās nav novērojama.
  • Vēl viens jautājums kopumā ir pret akadēmiskumu: iepriekŔējo un nākamo versiju saderÄ«ba. Vecajiem draiveriem ir jāatbalsta jauni atjauninājumi, un datu bāzei jāatbalsta vecie draiveri.

Kopumā tas viss uzliek ierobežojumus.

Cēloņsakarības komponenti

Tagad es runāŔu par dažām sastāvdaļām. Ja ņemam vērā cēloņsakarÄ«bu kopumā, mēs varam atlasÄ«t blokus. Mēs izvēlējāmies no darbiem, kas pieder noteiktam blokam: AtkarÄ«bas izsekoÅ”ana, pulksteņu izvēle, kā Å”os pulksteņus var sinhronizēt savā starpā un kā mēs nodroÅ”inām droŔību - tas ir aptuvens izklāsts par to, par ko es runāŔu:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Pilnīga atkarības izsekoŔana

Kāpēc tas ir vajadzÄ«gs? Lai, kad dati tiek replicēti, katrs ieraksts, katra datu maiņa satur informāciju par to, no kurām izmaiņām tas ir atkarÄ«gs. Pati pirmā un naivā izmaiņa ir tad, kad katrs ziņojums, kurā ir ieraksts, satur informāciju par iepriekŔējiem ziņojumiem:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Å ajā piemērā skaitlis cirtainajās iekavās ir ierakstu skaitļi. Dažreiz Å”ie ieraksti ar vērtÄ«bām tiek pārsÅ«tÄ«ti pat pilnÄ«bā, dažreiz tiek pārsÅ«tÄ«tas dažas versijas. BÅ«tÄ«ba ir tāda, ka katra izmaiņa satur informāciju par iepriekŔējo (to visu acÄ«mredzami nes sevÄ«).

Kāpēc mēs nolēmām neizmantot Å”o pieeju (pilnÄ«ga izsekoÅ”ana)? AcÄ«mredzot tāpēc, ka Ŕī pieeja ir nepraktiska: jebkuras izmaiņas sociālajā tÄ«klā ir atkarÄ«gas no visām iepriekŔējām izmaiņām Å”ajā sociālajā tÄ«klā, pārsÅ«tot, piemēram, Facebook vai VKontakte katrā atjauninājumā. Tomēr ir daudz pētÄ«jumu par pilnas atkarÄ«bas izsekoÅ”anu ā€” tie ir pirmssociālie tÄ«kli; dažās situācijās tas patieŔām darbojas.

Skaidra atkarības izsekoŔana

Nākamais ir ierobežotāks. Å eit tiek aplÅ«kota arÄ« informācijas nodoÅ”ana, bet tikai tā, kas ir nepārprotami atkarÄ«ga. Kas ir atkarÄ«gs no tā, ko parasti nosaka Pieteikums. Kad dati tiek replicēti, vaicājums atgriež atbildes tikai tad, ja iepriekŔējās atkarÄ«bas ir izpildÄ«tas, tas ir, parādÄ«tas. Å Ä« ir cēloņsakarÄ«bas konsekvences darbÄ«bas bÅ«tÄ«ba.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Viņa redz, ka 5. ieraksts ir atkarÄ«gs no 1., 2., 3., 4. ieraksta - attiecÄ«gi viņa gaida, pirms klients var piekļūt Pennijas piekļuves lēmuma veiktajām izmaiņām, kad visas iepriekŔējās izmaiņas jau ir izgājuÅ”as cauri datu bāzei.

Tas arī mums neder, jo joprojām ir pārāk daudz informācijas, un tas palēninās darbu. Ir arī cita pieeja...

Lamporta pulkstenis

Viņi ir ļoti veci. Lamporta pulkstenis nozÄ«mē, ka Ŕīs atkarÄ«bas ir salocÄ«tas skalārā funkcijā, ko sauc par Lamport pulksteni.

Skalārā funkcija ir kāds abstrakts skaitlis. To bieži sauc par loÄ£isko laiku. Ar katru notikumu Å”is skaitÄ«tājs palielinās. SkaitÄ«tājs, kas paÅ”laik ir zināms procesam, nosÅ«ta katru ziņojumu. Skaidrs, ka procesi var bÅ«t nesinhronizēti, tiem var bÅ«t pavisam citi laiki. Tomēr sistēma kaut kādā veidā lÄ«dzsvaro pulksteni ar Ŕādu ziņojumapmaiņu. Kas notiek Å”ajā gadÄ«jumā?

Es sadalÄ«ju Å”o lielo Ŕķembu divās daļās, lai bÅ«tu skaidrs: draugi var dzÄ«vot vienā mezglā, kurā ir daļa no kolekcijas, un Feed var dzÄ«vot citā mezglā, kurā ir daļa no Ŕīs kolekcijas. Vai ir skaidrs, kā viņi var izkļūt no ierindas? Pirmajā plÅ«smā tiks teikts: ā€œReplicatedā€ un pēc tam ā€” Draugi. Ja sistēma nesniegs kaut kādu garantiju, ka plÅ«sma netiks rādÄ«ta, kamēr netiks piegādātas arÄ« Friends atkarÄ«bas no Friends kolekcijas, tad mums bÅ«s tieÅ”i tāda situācija, kā es minēju.

Jūs redzat, kā plūsmas skaitītāja laiks loģiski palielinās:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Tātad Ŕī Lamporta pulksteņa un cēloņsakarÄ«bas konsekvences galvenā Ä«paŔība (to izskaidro ar Lamporta pulksteni) ir Ŕāda: ja mums ir notikumi A un B un notikums B ir atkarÄ«gs no notikuma A*, tad notikuma A loÄ£iskais laiks ir mazāks par LogicalTime no notikuma B.

* Dažreiz viņi arÄ« saka, ka A notika pirms B, tas ir, A notika pirms B - Ŕī ir noteikta sakarÄ«ba, kas daļēji sakārto visu notikumu kopumu, kas kopumā notika.

Pretēji ir nepareizi. Tas patiesÄ«bā ir viens no galvenajiem Lamport pulksteņa trÅ«kumiem ā€“ daļēja kārtÄ«ba. Pastāv jēdziens par vienlaicÄ«giem notikumiem, tas ir, notikumiem, kuros ne (A notika pirms B), ne (A notika pirms B). Kā piemēru varētu minēt Leonarda paralēlo pievienoÅ”anu kādam citam draugam (pat ne Leonardam, bet, piemēram, Å eldonam).
Å Ä« ir Ä«paŔība, ko bieži izmanto, strādājot ar Lamport pulksteņiem: tie Ä«paÅ”i aplÅ«ko funkciju un no tā secina, ka, iespējams, Å”ie notikumi ir atkarÄ«gi. Jo viens veids ir patiess: ja LogicalTime A ir mazāks par LogicalTime B, tad B nevar notikt pirms A; un ja vairāk, tad varbÅ«t.

Vektoru pulkstenis

Lamport pulksteņa loÄ£iskā attÄ«stÄ«ba ir Vector Clock. Tie atŔķiras ar to, ka katrs Å”eit esoÅ”ais mezgls satur savu atseviŔķu pulksteni, un tie tiek pārraidÄ«ti kā vektors.
Å ajā gadÄ«jumā jÅ«s redzat, ka vektora nulles indekss ir atbildÄ«gs par plÅ«smu, bet vektora pirmais indekss ir paredzēts draugiem (katrs no Å”iem mezgliem). Un tagad tie palielināsies: rakstot palielinās ā€œPlÅ«smasā€ nulles indekss - 1, 2, 3:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Kāpēc Vector Clock ir labāks? Jo tie ļauj noskaidrot, kuri notikumi ir vienlaicÄ«gi un kad tie notiek dažādos mezglos. Tas ir ļoti svarÄ«gi sadalÄ«Å”anas sistēmai, piemēram, MongoDB. Tomēr mēs neizvēlējāmies Å”o, lai gan tā ir brÄ«niŔķīga lieta, un tas darbojas lieliski, un tas, iespējams, mums derētu...

Ja mums ir 10 tÅ«kstoÅ”i Ŕķembu, mēs nevaram pārsÅ«tÄ«t 10 tÅ«kstoÅ”us komponentu, pat ja mēs to saspiežam vai izdomājam kaut ko citu - lietderÄ«gā slodze joprojām bÅ«s vairākas reizes mazāka nekā visa Ŕī vektora tilpums. Tāpēc, sakodot sirdi un zobus, mēs atteicāmies no Ŕīs pieejas un pārgājām uz citu.

Uzgriežņu atslēga TrueTime. Atompulkstenis

Es teicu, ka bÅ«s stāsts par Spanneru. Å Ä« ir forÅ”a lieta, tieÅ”i no XNUMX. gadsimta: atompulksteņi, GPS sinhronizācija.

Kāda ir ideja? ā€œSpannerā€ ir Google sistēma, kas nesen pat kļuva pieejama cilvēkiem (tie pievienoja tai SQL). Katram darÄ«jumam ir noteikts laika zÄ«mogs. Tā kā laiks tiek sinhronizēts*, katram notikumam var pieŔķirt noteiktu laiku ā€“ atompulksteņiem ir gaidÄ«Å”anas laiks, pēc kura tiek garantēts, ka ā€œnotiksā€ cits laiks.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Tādējādi, vienkārÅ”i ierakstot datu bāzē un gaidot kādu laiku, notikuma serializējamÄ«ba tiek automātiski garantēta. Viņiem ir visspēcÄ«gākais Konsekvences modelis, kādu principā var iedomāties ā€“ tā ir Ārējā konsekvence.

* Å Ä« ir galvenā problēma ar Lampart pulksteņiem - tie nekad nav sinhroni sadalÄ«tajās sistēmās. Tie var atŔķirties; pat ar NTP tie joprojām nedarbojas ļoti labi. "Spanner" ir atompulkstenis un sinhronizācija, Ŕķiet, ir mikrosekundes.

Kāpēc mēs neizvēlējāmies? Mēs neuzskatām, ka mÅ«su lietotājiem ir iebÅ«vēts atompulkstenis. Kad tie parādÄ«sies, katrā portatÄ«vajā datorā iebÅ«vēti, bÅ«s kaut kāda superforÅ”a GPS sinhronizācija - tad jā... Bet pagaidām labākais, kas iespējams ir Amazon, Base Stations - fanātiÄ·iem... Tā nu izmantojām citus pulksteņus .

Hibrīda pulkstenis

Tas faktiski ir tas, kas atzÄ«mē MongoDB, nodroÅ”inot cēloņsakarÄ«bas konsekvenci. Kā tie ir hibrÄ«di? HibrÄ«ds ir skalāra vērtÄ«ba, bet tai ir divas sastāvdaļas:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

  • Pirmais ir Unix laikmets (cik sekundes ir pagājuÅ”as kopÅ” ā€œdatoru pasaules sākumaā€).
  • Otrais ir neliels pieaugums, arÄ« 32 bitu neparakstÄ«ts int.

Tas arÄ« viss, patiesÄ«bā. Ir Ŕāda pieeja: daļa, kas ir atbildÄ«ga par laiku, visu laiku tiek sinhronizēta ar pulksteni; katru reizi, kad notiek atjauninājums, Ŕī daļa tiek sinhronizēta ar pulksteni, un izrādās, ka laiks vienmēr ir vairāk vai mazāk pareizs, un pieaugums ļauj atŔķirt notikumus, kas notikuÅ”i vienā un tajā paŔā laika posmā.

Kāpēc tas ir svarÄ«gi MongoDB? Jo tas ļauj noteiktā laika brÄ«dÄ« izveidot kaut kādus rezerves restorānus, tas ir, pasākums tiek indeksēts pēc laika. Tas ir svarÄ«gi, ja nepiecieÅ”ami noteikti pasākumi; Datu bāzei notikumi ir izmaiņas datu bāzē, kas notikuÅ”as noteiktos laika intervālos.

VissvarÄ«gāko iemeslu es pastāstÄ«Å”u tikai jums (lÅ«dzu, nevienam nesakiet)! Mēs to darÄ«jām, jo ā€‹ā€‹Å”ādi MongoDB OpLog izskatās sakārtoti, indeksēti dati. OpLog ir datu struktÅ«ra, kas satur pilnÄ«gi visas izmaiņas datu bāzē: tās vispirms nonāk OpLog, un tad tās tiek lietotas paŔā krātuvē, ja tas ir replicēts datums vai fragments.

Tas bija galvenais iemesls. Tomēr datu bāzes izveidei ir arÄ« praktiskas prasÄ«bas, kas nozÄ«mē, ka tai jābÅ«t vienkārÅ”ai - maz koda, pēc iespējas mazāk bojātu lietu, kas jāpārraksta un jāpārbauda. Tas, ka mÅ«su oplogus indeksēja hibrÄ«dpulksteņi, ļoti palÄ«dzēja un ļāva izdarÄ«t pareizo izvēli. Tas patieŔām atmaksājās un kaut kā maÄ£iski strādāja pie paÅ”a pirmā prototipa. Tas bija ļoti forÅ”i!

Pulksteņa sinhronizācija

Zinātniskajā literatÅ«rā ir aprakstÄ«tas vairākas sinhronizācijas metodes. Es runāju par sinhronizāciju, kad mums ir divas dažādas shards. Ja ir viena kopiju kopa, sinhronizācija nav nepiecieÅ”ama: tas ir ā€œviens galvenaisā€; mums ir OpLog, kurā ietilpst visas izmaiņas - Å”ajā gadÄ«jumā viss jau ir secÄ«gi sakārtots paŔā ā€œOplogā€. Bet, ja mums ir divas dažādas shards, Å”eit ir svarÄ«ga laika sinhronizācija. Å eit vairāk palÄ«dzēja vektora pulkstenis! Bet mums tādu nav.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Otrais ir piemērots - tas ir ā€œSirdspukstiā€. Ir iespējams apmainÄ«ties ar dažiem signāliem, kas rodas katrā laika vienÄ«bā. Bet sirdsdarbÄ«ba ir pārāk lēna, mēs nevaram nodroÅ”ināt klientam latentumu.

Patiesais laiks, protams, ir brÄ«niŔķīga lieta. Bet, atkal, tā laikam ir nākotne... Lai gan to jau var izdarÄ«t Atlasā, jau ir ātrie ā€œAmazonā€ laika sinhronizatori. Bet tas nebÅ«s pieejams visiem.

Tenkas ir tad, kad visos ziņojumos ir iekļauts laiks. Tas ir aptuveni tas, ko mēs lietojam. Katrs ziņojums starp mezgliem, draiveri, datu mezgla marÅ”rutētāju, absolÅ«ti viss MongoDB ir kaut kāds elements, datu bāzes komponents, kas satur pulksteni, kas darbojas. Viņiem visur ir hibrÄ«dlaika nozÄ«me, tas tiek pārraidÄ«ts. 64 biti? Tas ļauj, tas ir iespējams.

Kā tas viss darbojas kopā?

Šeit es aplūkoju vienu kopiju komplektu, lai to nedaudz atvieglotu. Ir primārais un sekundārais. Sekundārā veic replikāciju un ne vienmēr ir pilnībā sinhronizēta ar primāro.

IevietoÅ”ana notiek ā€œPrimeryā€ ar noteiktu laika vērtÄ«bu. Å is ieliktnis palielina iekŔējo skaitu par 11, ja tas ir maksimālais. Vai arÄ« tas pārbaudÄ«s pulksteņa vērtÄ«bas un sinhronizēs ar pulksteni, ja pulksteņa vērtÄ«bas ir lielākas. Tas ļauj sakārtot pēc laika.

Pēc tam, kad viņŔ veic ierakstu, notiek svarÄ«gs brÄ«dis. Pulkstenis atrodas "MongoDB" un tiek palielināts tikai tad, ja tiek rakstÄ«ts uz "Oplog". Å is ir notikums, kas maina sistēmas stāvokli. PilnÄ«gi visos klasiskajos rakstos par notikumu tiek uzskatÄ«ts, kad ziņojums nokļūst mezglā: ziņojums ir pienācis, kas nozÄ«mē, ka sistēma ir mainÄ«jusi savu stāvokli.

Tas ir saistÄ«ts ar faktu, ka izpētes laikā nav pilnÄ«bā skaidrs, kā Å”is ziņojums tiks interpretēts. Mēs noteikti zinām, ka, ja tas nav atspoguļots ā€œOplogā€, tad tas nekādā veidā netiks interpretēts, un sistēmas stāvokļa izmaiņas ir tikai ieraksts ā€œOplogā€. Tas mums visu vienkārÅ”o: modelis to vienkārÅ”o un ļauj sakārtot vienā kopiju komplektā, kā arÄ« daudzas citas noderÄ«gas lietas.

Tiek atgriezta vērtÄ«ba, kas jau ir ierakstÄ«ta ā€œOplogā€ ā€” mēs zinām, ka ā€œOplogā€ jau satur Å”o vērtÄ«bu, un tās laiks ir 12. Tagad, teiksim, nolasÄ«Å”ana sākas no cita mezgla (sekundārā) un pārraida pēcClusterTime in ziņa. ViņŔ saka: ā€œMan vajag visu, kas notika vismaz pēc pulksten 12 vai divpadsmitosā€ (skat. attēlu augstāk).

To sauc par konsekventu cēloņsakarÄ«bu (CAT). Teorētiski pastāv tāds jēdziens, ka tas ir kaut kāds laika posms, kas pats par sevi ir konsekvents. Å ajā gadÄ«jumā mēs varam teikt, ka tas ir sistēmas stāvoklis, kas tika novērots 12. laikā.

Tagad Å”eit vēl nav nekā, jo tas simulē situāciju, kad jums ir nepiecieÅ”ams sekundārais, lai replicētu datus no primārā. ViņŔ gaida... Un tagad ir saņemti dati - viņŔ atgriež Ŕīs vērtÄ«bas.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Gandrīz tā tas viss darbojas. Gandrīz.

Ko nozÄ«mē ā€œgandrÄ«zā€? Pieņemsim, ka ir kāds, kurÅ” ir izlasÄ«jis un sapratis, kā tas viss darbojas. Es sapratu, ka katru reizi, kad notiek ClusterTime, tas atjaunina iekŔējo loÄ£isko pulksteni, un tad nākamais ieraksts palielinās par vienu. Å Ä« funkcija aizņem 20 rindiņas. Pieņemsim, ka Ŕī persona pārraida lielāko 64 bitu numuru, no kura atskaitÄ«ts viens.

Kāpēc "mÄ«nus viens"? Tā kā iekŔējais pulkstenis tiks aizstāts ar Å”o vērtÄ«bu (acÄ«mredzot, tas ir lielākais iespējamais un lielāks par paÅ”reizējo laiku), tad ā€œOplogā€ tiks ievadÄ«ts ieraksts, un pulkstenis tiks palielināts par citu vienÄ«bu - un tas jau bÅ«s ir maksimālā vērtÄ«ba (vienkārÅ”i ir visas mērvienÄ«bas, nav kur citur iet) , unsaint ints).

Ir skaidrs, ka pēc tam sistēma kļūst absolūti nepieejama nekam. To var tikai izkraut un iztīrīt - daudz roku darba. Pilna pieejamība:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Turklāt, ja tas tiek atkārtots kaut kur citur, viss klasteris vienkārÅ”i nokrÄ«t. AbsolÅ«ti nepieņemama situācija, kuru ikviens var organizēt ļoti ātri un vienkārÅ”i! Tāpēc mēs Å”o brÄ«di uzskatÄ«jām par vienu no vissvarÄ«gākajiem. Kā to novērst?

Mūsu veids ir parakstīt clusterTime

Tādā veidā tas tiek pārraidīts ziņojumā (pirms zilā teksta). Bet mēs arī sākām ģenerēt parakstu (zils teksts):

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Parakstu Ä£enerē atslēga, kas tiek glabāta datubāzē, droŔā perimetrā; pati tiek Ä£enerēta un atjaunināta (lietotāji par to neko neredz). Tiek Ä£enerēts jaucējkods, un katrs ziņojums tiek parakstÄ«ts, kad tas ir izveidots, un apstiprināts, kad tas tiek saņemts.
DroÅ”i vien cilvēku prātos rodas jautājums: "Cik tas palēnina lietas?" Es jums teicu, ka tam vajadzētu darboties ātri, it Ä«paÅ”i, ja Ŕīs funkcijas nav.

Ko Å”ajā gadÄ«jumā nozÄ«mē lietot cēloņsakarÄ«bas konsekvenci? Tas ir paredzēts, lai parādÄ«tu parametru afterClusterTime. Bez tā tas tik un tā vienkārÅ”i nodos vērtÄ«bas. Tenkas, sākot ar versiju 3.6, vienmēr darbojas.

Ja mēs atstāsim pastāvÄ«gu parakstu Ä£enerÄ“Å”anu, tas palēninās sistēmu pat tad, ja nebÅ«s funkcijas, kas neatbilst mÅ«su pieejām un prasÄ«bām. Tātad, ko mēs darÄ«jām?

Dariet to ātri!

Diezgan vienkārÅ”a lieta, bet triks ir interesants ā€“ padalÄ«Å”os, varbÅ«t kādam tas interesēs.
Mums ir hash, kas saglabā parakstÄ«tos datus. Visi dati iet caur keÅ”atmiņu. KeÅ”atmiņā neparakstÄ«ts konkrēts laiks, bet diapazons. Kad tiek saņemta kāda vērtÄ«ba, mēs Ä£enerējam diapazonu, maskējam pēdējos 16 bitus un parakstām Å”o vērtÄ«bu:

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Saņemot Ŕādu parakstu, mēs paātrinām sistēmu (nosacÄ«ti) 65 tÅ«kstoÅ”us reižu. Tas darbojas lieliski: kad mēs veicām eksperimentus, laiks faktiski samazinājās par 10 tÅ«kstoÅ”iem reižu, kad mums bija secÄ«ga atjaunināŔana. Ir skaidrs, ka, ja tie ir pretrunā, tas nedarbojas. Bet vairumā praktisko gadÄ«jumu tas darbojas. Diapazona paraksta un paraksta kombinācija atrisināja droŔības problēmu.

Ko mēs esam iemācÄ«juÅ”ies?

Mācības, ko mēs no tā guvām:

  • Jālasa materiāli, stāsti, raksti, jo mums ir daudz interesanta. Kad mēs strādājam pie kādas funkcijas (it Ä«paÅ”i tagad, kad veicām darÄ«jumus utt.), mums ir jālasa un jāsaprot. Tas prasa laiku, bet patiesÄ«bā ir ļoti noderÄ«gi, jo ļauj saprast, kur mēs atrodamies. Å Ä·iet, ka mēs neko jaunu neizdomājām - mēs vienkārÅ”i paņēmām sastāvdaļas.

    Vispār jau ir zināma atŔķirÄ«ba domāŔanā, kad notiek akadēmiskā konference (Sigmon, piemēram) ā€“ visi koncentrējas uz jaunām idejām. Kas jauns mÅ«su algoritmā? Å eit nav nekā Ä«paÅ”i jauna. Jaunums drÄ«zāk slēpjas tajā, kā mēs apvienojām esoŔās pieejas. Tāpēc pirmā lieta ir izlasÄ«t klasiku, sākot ar Lampart.

  • RažoÅ”anā prasÄ«bas ir pavisam citas. Esmu pārliecināts, ka daudzi no jums nesaskaras ar ā€œsfēriskāmā€ datu bāzēm abstraktā vakuumā, bet gan ar normālām, reālām lietām, kurām ir problēmas ar pieejamÄ«bu, latentumu un kļūdu toleranci.
  • Pēdējā lieta ir tāda, ka mums bija jāaplÅ«ko dažādas idejas un jāapvieno vairāki pilnÄ«gi atŔķirÄ«gi raksti vienā pieejā, kopā. Ideja par parakstÄ«Å”anu, piemēram, vispār radās no raksta, kurā tika aplÅ«kots Paxos protokols, kas nebizantieÅ”u neveiksminiekiem ir autorizācijas protokolā, bizantieÅ”iem - ārpus autorizācijas protokola... Kopumā mēs tieÅ”i tā arÄ« esam. beidzās darÄ«t.

    Å eit nav absolÅ«ti nekā jauna! Bet tiklÄ«dz mēs to visu sajaucām kopā... Tas ir tas pats, kas teikt, ka Olivier salātu recepte ir muļķības, jo olas, majonēze un gurÄ·i jau ir izdomāti... Runa ir par to paÅ”u stāstu.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Es pabeigŔu ar Ŕo. Paldies!

jautājumi

KlausÄ«tāju jautājums (turpmāk tekstā B): ā€“ Paldies, Mihail, par ziņojumu! Tēma par laiku ir interesanta. JÅ«s izmantojat Tenkas. Viņi teica, ka katram ir savs laiks, katrs zina savu vietējo laiku. Cik es saprotu, mums ir draiveris - var bÅ«t daudz klientu ar draiveriem, vaicājumu plānotājiem arÄ«, Ŕķembām arÄ«... Un ko sistēma noved, ja pēkŔņi rodas neatbilstÄ«ba: kāds nolemj, ka tas ir paredzēts minÅ«ti priekŔā, kāds minÅ«ti atpaliek? Kur mēs nonāksim?

MT: ā€“ TieŔām lielisks jautājums! Es tikai gribēju runāt par lauskas. Ja es pareizi saprotu jautājumu, mums ir Ŕāda situācija: ir 1 un 2, nolasÄ«Å”ana notiek no Ŕīm divām Ŕķembām - tām ir nesakritÄ«ba, tās savstarpēji nesadarbojas, jo laiks, ko viņi zina, ir atŔķirÄ«gs, it Ä«paÅ”i laiks, kad tie pastāv oplogos.
Pieņemsim, ka shard 1 izveidoja miljonu ierakstu, shard 2 vispār neko nedarīja, un pieprasījums tika saņemts līdz diviem shardiem. Un pirmajam ir afterClusterTime vairāk nekā miljons. Šādā situācijā, kā jau paskaidroju, shard 2 nekad neatbildēs.

In: ā€“ Gribēju zināt, kā viņi sinhronizējas un izvēlas vienu loÄ£isko laiku?

MT: - Ä»oti viegli sinhronizēt. Shard, kad pēcClusterTime nāk pie viņa un viņŔ neatrod laiku ā€œOplogā€, iniciē nav apstiprināts. Tas ir, viņŔ paceļ savu laiku ar rokām lÄ«dz Å”ai vērtÄ«bai. Tas nozÄ«mē, ka tajā nav neviena notikuma, kas atbilstu Å”im pieprasÄ«jumam. ViņŔ rada Å”o notikumu mākslÄ«gi un tādējādi kļūst par cēloņsakarÄ«bu konsekventu.

In: ā€“ Ko darÄ«t, ja pēc tam viņam atnāks kādi citi notikumi, kas pazuda kaut kur tÄ«klā?

MT: ā€“ Shard ir veidots tā, lai tie vairs nenāktu, jo tas ir viens meistars. Ja viņŔ jau ir pierakstÄ«jies, tad viņi nenāks, bet nāks vēlāk. Nevar gadÄ«ties, ka kaut kas kaut kur iestrēgst, tad viņŔ neraksta, un tad pienāk Å”ie notikumi - un cēloņsakarÄ«ba tiek salauzta. Kad viņŔ neraksta, viņiem visiem jānāk nākamajiem (viņŔ tos gaidÄ«s).

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

In: ā€“ Man ir vairāki jautājumi par rindām. CēloņsakarÄ«ba paredz, ka ir noteikta darbÄ«bu rinda, kas jāveic. Kas notiks, ja kāda no mÅ«su pakām pazÅ«d? Å eit nāk 10., 11.... 12. ir pazudis, un visi pārējie gaida, kad tas piepildÄ«sies. Un pēkŔņi mÅ«su automaŔīna nomira, mēs neko nevaram darÄ«t. Vai ir maksimālais rindas garums, kas uzkrājas pirms izpildes? Kāda nāvējoÅ”a neveiksme notiek, ja tiek zaudēts kāds no stāvokļiem? Turklāt, ja pierakstām, ka ir kāds iepriekŔējais stāvoklis, tad no tā kaut kā jāsāk? Bet viņi viņu neatgrÅ«da!

MT: ā€“ ArÄ« lielisks jautājums! Ko mēs darām? MongoDB ir kvoruma rakstÄ«Å”anas un kvoruma lasÄ«Å”anas jēdziens. Kādos gadÄ«jumos ziņa var pazust? Ja rakstÄ«Å”ana nav kvorums vai lasÄ«Å”ana nav kvorums (var pieÄ·erties arÄ« kāda veida atkritumi).
AttiecÄ«bā uz cēloņsakarÄ«bu konsekvenci tika veikts liels eksperimentāls tests, kura rezultāts bija tāds, ka gadÄ«jumā, ja rakstÄ«Å”ana un lasÄ«Å”ana nav kvoruma, rodas cēloņsakarÄ«bas konsekvences pārkāpumi. TieÅ”i tā, ko tu saki!

Mūsu padoms: izmantojot cēloņsakarību, izmantojiet vismaz kvoruma nolasījumu. Šajā gadījumā nekas netiks zaudēts, pat ja tiek zaudēts kvoruma ieraksts... Šī ir ortogonāla situācija: ja lietotājs nevēlas, lai dati tiktu zaudēti, viņam ir jāizmanto kvoruma ieraksts. Cēloņsakarība negarantē izturību. Izturību garantē replikācija un ar replikāciju saistītās iekārtas.

In: ā€“ Kad mēs izveidojam instanci, kas veic sadalÄ«Å”anu mÅ«su vietā (nevis galvenais, bet attiecÄ«gi vergs), tā paļaujas uz savas maŔīnas Unix laiku vai uz ā€œmasterā€ laiku; Vai tas tiek sinhronizēts pirmo reizi vai periodiski?

MT: ā€“ Es tagad precizÄ“Å”u. Shard (t.i., horizontālais nodalÄ«jums) ā€“ tur vienmēr ir primārais. Un skaidai var bÅ«t ā€œsaimnieksā€, un var bÅ«t kopijas. Bet shard vienmēr atbalsta ierakstÄ«Å”anu, jo tam ir jāatbalsta kāds domēns (shardam ir primārais).

In: ā€“ Tātad viss ir atkarÄ«gs tikai no ā€œsaimniekaā€? Vai vienmēr tiek izmantots meistara laiks?

MT: - Jā. Tēlaini var teikt: pulkstenis tikŔķ, kad notiek ieieÅ”ana ā€œsaimniekāā€, ā€œOplogā€.

In: ā€“ Mums ir klients, kurÅ” pieslēdzas un kuram par laiku nekas nav jāzina?

MT: ā€“ Tev vispār nekas nav jāzina! Ja mēs runājam par to, kā tas darbojas uz klientu: kad klients vēlas izmantot cēloņsakarÄ«bu, viņam ir jāatver sesija. Tagad viss ir: transakcijas sesijā un tiesÄ«bu izgÅ«Å”ana... Sesija ir loÄ£isku notikumu sakārtoÅ”ana, kas notiek ar klientu.

Ja viņŔ atver Å”o sesiju un saka, ka vēlas cēloņsakarÄ«bu (ja sesija pēc noklusējuma atbalsta cēloņsakarÄ«bu), viss darbojas automātiski. VadÄ«tājs atceras Å”o laiku un palielina to, saņemot jaunu ziņojumu. Tas atceras, kādu atbildi iepriekŔējā atgrieza no servera, kas atgrieza datus. Nākamajā pieprasÄ«jumā bÅ«s ietverts afterCluster ("laiks, kas lielāks par Å”o").

Klientam absolÅ«ti nekas nav jāzina! Tas viņam ir pilnÄ«gi necaurspÄ«dÄ«gs. Ja cilvēki izmanto Ŕīs funkcijas, ko viņi var darÄ«t? Pirmkārt, varat droÅ”i lasÄ«t sekundāros: varat rakstÄ«t primārajā un lasÄ«t no Ä£eogrāfiski replicētām sekundārajām programmām, un bÅ«t pārliecināts, ka tas darbojas. Tajā paŔā laikā sesijas, kas tika ierakstÄ«tas primārajā, var pat pārsÅ«tÄ«t uz sekundāro, t.i., jÅ«s varat izmantot nevis vienu sesiju, bet vairākas.

In: ā€“ Jauns skaitļoÅ”anas zinātnes slānis ā€” CRDT (bezkonflikta replicēti datu tipi) datu tipi ā€” ir cieÅ”i saistÄ«ts ar tematu par iespējamo konsekvenci. Vai esat apsvēris iespēju integrēt Ŕāda veida datus datu bāzē, un ko jÅ«s par to varat teikt?

MT: - Labs jautājums! CRDT ir jēga rakstÄ«Å”anas konfliktiem: MongoDB ir viens galvenais.

In: ā€“ Man ir jautājums no devops. Reālajā pasaulē ir tādas jezuÄ«tiskas situācijas, kad notiek bizantieÅ”u neveiksme, un ļaunie cilvēki aizsargājamā perimetrā sāk bāzties protokolā, Ä«paŔā veidā sÅ«tÄ«t amatniecÄ«bas pakas?

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

MT: ā€“ Ä»aunie cilvēki perimetrā ir kā Trojas zirgs! Ä»aunie cilvēki perimetrā var izdarÄ«t daudz sliktu lietu.

In: ā€“ Skaidrs, ka atstājot, rupji sakot, robu serverÄ«, pa kuru var ielikt ziloņu zoodārzu un sabrukt visu klasteru uz visiem laikiem... Manuāla atkopÅ”ana prasÄ«s laiku... Tas, maigi izsakoties, ir nepareizi. No otras puses, tas ir interesanti: reālajā dzÄ«vē, praksē, ir situācijas, kad dabiski notiek lÄ«dzÄ«gi iekŔējie uzbrukumi?

MT: ā€“ Tā kā reālajā dzÄ«vē ar droŔības pārkāpumiem saskaros reti, nevaru pateikt, vai tie notiek. Bet, ja mēs runājam par attÄ«stÄ«bas filozofiju, mēs domājam Ŕādi: mums ir perimetrs, kas nodroÅ”ina puiÅ”us, kas veic apsardzi - tā ir pils, mÅ«ris; un iekŔā perimetrā var darÄ«t ko gribi. Ir skaidrs, ka ir lietotāji, kuriem ir iespēja tikai skatÄ«t, un ir lietotāji, kuriem ir iespēja izdzēst direktoriju.

AtkarÄ«bā no tiesÄ«bām lietotāji var nodarÄ«t kaitējumu, ko var nodarÄ«t pele vai zilonis. Skaidrs, ka lietotājs ar pilnām tiesÄ«bām vispār var darÄ«t jebko. Lietotājs ar ierobežotām tiesÄ«bām var nodarÄ«t ievērojami mazāku kaitējumu. Jo Ä«paÅ”i tas nevar izjaukt sistēmu.

In: ā€“ Aizsargātajā perimetrā kāds mēģināja izveidot neparedzētus protokolus serverim, lai pilnÄ«bā iznÄ«cinātu serveri un, ja paveicas, visu klasteru... Vai tas kādreiz sanāk tik ā€œlabiā€?

MT: "Es nekad neesmu dzirdējis par tādām lietām." Tas, ka Ŕādā veidā var avarēt serveri, nav noslēpums. Neveiksme iekŔā, esot no protokola, bÅ«t autorizētam lietotājam, kurÅ” var kaut ko tādu ierakstÄ«t ziņojumā... PatiesÄ«bā tas nav iespējams, jo tas vēl tiks pārbaudÄ«ts. Å o autentifikāciju ir iespējams atslēgt lietotājiem, kuri to nevēlas ā€“ tad tā ir viņu problēma; viņi, rupji sakot, paÅ”i izpostÄ«ja sienas un tur var iegrÅ«st ziloni, kurÅ” mÄ«dÄ«s... Bet vispār var pārģērbties par remontētāju, nāc un izrauj!

In: ā€“ Paldies par ziņojumu. Sergejs (Yandex). Mong ir konstante, kas ierobežo balsstiesÄ«go dalÄ«bnieku skaitu repliku komplektā, un Ŕī konstante ir 7 (septiņi). Kāpēc tā ir konstante? Kāpēc tas nav kaut kāds parametrs?

MT: - Mums ir reprodukcijas komplekti ar 40 mezgliem. Vienmēr ir vairākums. Nezinu kura versija...

In: ā€“ Reprodukcijas komplektā varat vadÄ«t dalÄ«bniekus, kuriem nav balsstiesÄ«bu, taču ir ne vairāk kā 7 balsstiesÄ«gi dalÄ«bnieki. Kā mēs varam pārdzÄ«vot slēgÅ”anu Å”ajā gadÄ«jumā, ja mÅ«su kopiju komplekts ir sadalÄ«ts 3 datu centros? Viens datu centrs var viegli izslēgties, un cita iekārta var izkrist.

MT: ā€“ Tas jau ir nedaudz ārpus ziņojuma jomas. Tas ir vispārÄ«gs jautājums. VarbÅ«t es par to pastāstÄ«Å”u vēlāk.

HighLoad++, Mihails Tjuļeņevs (MongoDB): cēloņsakarība: no teorijas līdz praksei

Dažas reklāmas šŸ™‚

Paldies, ka palikāt kopā ar mums. Vai jums patīk mūsu raksti? Vai vēlaties redzēt interesantāku saturu? Atbalsti mūs, pasūtot vai iesakot draugiem, mākoņa VPS izstrādātājiem no 4.99 USD, unikāls sākuma līmeņa serveru analogs, ko mēs jums izgudrojām: Visa patiesība par VPS (KVM) E5-2697 v3 (6 kodoli) 10GB DDR4 480GB SSD 1Gbps no 19$ vai kā koplietot serveri? (pieejams ar RAID1 un RAID10, līdz 24 kodoliem un līdz 40 GB DDR4).

Dell R730xd 2x lētāk Equinix Tier IV datu centrā Amsterdamā? Tikai Å”eit 2x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV no 199$ NÄ«derlandē! Dell R420 ā€” 2x E5-2430 2.2 GHz 6C 128 GB DDR3 2x960 GB SSD 1 Gbps 100 TB ā€” no 99 USD! LasÄ«t par Kā izveidot infrastruktÅ«ras uzņēmumu klase ar Dell R730xd E5-2650 v4 serveru izmantoÅ”anu 9000 eiro par santÄ«mu?

Avots: www.habr.com

Pievieno komentāru