Kujutage ette. Toas on kinni 5 kassi ja et minna Ă€ratama peremeest, peavad nad kĂ”ik koos omavahel kokku leppima, sest nad saavad ukse avada ainult siis, kui kĂ”ik viis koondavad oma jĂ”ud selle peale. Kui ĂŒks kass on Schrödingeri kass ja teised kassid ei tea tema otsusest, tekib kĂŒsimus: "Kuidas nad seda teha saavad?"
Selles artiklis selgitan lihtsas keeles ja selgelt teoreetilisi aluseid ja printsiibu, mis puudutavad jaotatud sĂŒsteeme. Samuti vaatame pinnapealselt Paxosi peamist ideed.

Kui arendajad kasutavad pilveteenuseid, erinevaid andmebaase ja töötavad suure arvu sÔlmedega klastris, usuvad nad, et andmed on kogu aeg terved, ohutud ja alati kergesti kÀttesaadavad. Aga kust tulenevad need garantiid?
Koheselt on meil olemas olemasolevad garantiid, ning need on tarnija garantii. Need on dokumenteeritud enam-vÀhem jÀrgmiselt: "See teenus on piisavalt usaldusvÀÀrne, tal on mÀÀratud SLA, Àrge muretsege, kÔik töötab jaotatult nagu te ootate."
Me kalduvad uskuma parimat, kuna suured ettevĂ”tted on meid veennud, et kĂ”ik on hĂ€sti. Me ei kĂŒsige endalt: miks see ĂŒldse vĂ”iks toimida? Kas on olemas mingid formaalsed pĂ”hjendused selliste sĂŒsteemide korrektsuse jaoks?
Hiljuti kĂ€isin ja see inspireeris mind vĂ€ga. Koolis toimunud loengud meenutasid pigem matemaatilise analĂŒĂŒsi tunde kui midagi seoses arvutite sĂŒsteemidega. Kuid just nii on ajalooliselt tĂ”estatud olulisi algoritme, mida me kasutame igapĂ€evaselt, ja ei kahtle selles.
Enamikus kaasaegsetes jaotatud sĂŒsteemides on kasutusel Paxosi konsensuse algoritm ja selle erinevad modifikatsioonid. Mis on kĂ”ige huvitavam, on see, et algoritmi olemasolu ja selle Ă”igustamine on vĂ”imalik tĂ”estada lihtsalt pliiatsi ja paberiga. Samuti rakendatakse algoritmi praktikas suurtes sĂŒsteemides, mis töötavad tohutu arvu sĂ”lmedega pilves.
Kerge illustratsioon sellest, millest edaspidi rÀÀgitakse: kahe kindraliga ĂŒlesanne.Alustame soojenduseks .
Meil on kaks armeed â punased ja valged. Valged vĂ€ed asuvad piiratavas linnas. Punased vĂ€ed, mida juhivad kindralid A1 ja A2, on paigutatud linna mĂ”lemale poole. Punaste eesmĂ€rk on rĂŒnnata valget linna ja vĂ”ita. Kuid iga punase kindrali vĂ€gi on eraldi vĂ€iksem valgete omast.

Punaste vĂ”idu tingimused: mĂ”lemad kindralid peavad rĂŒndama samaaegselt, et omada ĂŒlekaalu valgete ĂŒle. Selleks peavad kindralid A1 ja A2 omavahel kokku leppima. Kui igaĂŒks rĂŒndab eraldi, kaotavad punased.
Kokkuleppimiseks saavad kindralid A1 ja A2 saata sĂ”numitoojaid valge linna territooriumi kaudu. SĂ”numitooja vĂ”ib edukalt jĂ”uda liitlase kindrali juurde vĂ”i vĂ”ib protivnik teda tabada. KĂŒsimus: kas on selline suhtlemise jĂ€rjestus punaste kindralite vahel (sĂ”numitoojate saatmise jĂ€rjestus A1-st A2-sse ja A2-st A1-sse), millega nad garanteeritult kokku leppida rĂŒnnaku ajaks X. Siin mĂ”istetakse garantii all, et mĂ”lemad kindralid saavad ĂŒheselt kinnitust, et liitlane (teine kindral) rĂŒndab kindlalt mÀÀratud ajal X.
Oletame, et A1 saadab A2-le sĂ”numitooja, kes toob sĂ”numi: "RĂŒndame tĂ€na keskööl!". Kindral A1 ei saa rĂŒnnata ilma kinnituse saanud A2-lt. Kui A1 sĂ”numitooja jĂ”uab kohale, saadab kindral A2 kinnituse sĂ”numiga: "Jah, rĂŒndame tĂ€na valgeid". Kuid nĂŒĂŒd ei tea kindral A2, kas tema vasta sĂ”numitooja jĂ”udis kohale vĂ”i mitte, tal ei ole garanteeritud rĂŒnnaku samaaegsust. NĂŒĂŒd peab ĂŒldiselt A2-le uuesti kinnitus olema.
Kui analĂŒĂŒsida nende suhtlust edasi, selgub midagi sellist: ĂŒkskĂ”ik, kui palju sĂ”numivahetus tsĂŒkleid toimub, ei ole viisi, kuidas kummagi kindrali sĂ”numeid garanteeritult kĂ€tte toimetada (eeldusel, et ĂŒkskĂ”ik milline sĂ”numitooja vĂ”ib olla tabatud).
Kahe kindrali ĂŒlesanne on suurepĂ€rane illustreerimine vĂ€ga lihtsast jaotatud sĂŒsteemist, kus on kaks sĂ”lme ebausaldusvÀÀrse suhtlemisega. See tĂ€hendab, et meil ei ole 100% garantiid, et nad sĂŒnkroniseeruvad. Sellistelt probleemidelt rÀÀgitakse tĂ€iendavalt artikli suuremal hulgal.
Sissejuhatus jaotatud sĂŒsteemide mĂ”istesse.
Jagatud sĂŒsteem on arvutite rĂŒhm (edaspidi nimetame neid sĂ”lmedeks), mis saavad vahetada sĂ”numeid. Iga eraldi sĂ”lm on autonoomne entiteet. SĂ”lm suudab iseseisvalt tĂ¶Ă¶ĂŒlesandeid tĂ€ita, kuid teiste sĂ”lmedega suhtlemiseks peab ta saatma ja vastuvĂ”tma sĂ”numeid.
Kuidas sĂ”numid tĂ€pselt teostatakse, milliseid protokolle kasutatakse â see meid antud kontekstis ei huvita. Oluline on, et jagatud sĂŒsteemi sĂ”lmed saavad vahetada andmeid, saates teineteisele sĂ”numeid.
Isegi kui mÀÀratlemine tundub lihtne, tuleb arvestada, et jagatud sĂŒsteemil on rida atribuutide, mis on meie jaoks olulised.
Jagatud sĂŒsteemide atribuudid
- Samaegne töötlus â vĂ”imalus, et sĂŒsteemis esinevad samaaegsed vĂ”i konkurentsed sĂŒndmused. Veelgi enam, me arvestame, et sĂŒndmused, mis toimuvad kahel erineval sĂ”lmel, on potentsiaalselt konkurentsed, kuni meil pole selget sĂŒndmuste jĂ€rjekorda. Ja tavaliselt pole meil seda.
- Globaalsete kellade puudumine. Meil ei ole sĂŒndmuste selget jĂ€rjekorda, kuna globaalsed kellad puuduvad. Tavalises inimestemaailmas oleme harjunud, et meil on kellad ja aeg on absoluutne. KĂ”ik muutub, kui rÀÀkida jagatud sĂŒsteemidest. Ieven kui supertĂ€psetel aatomikelladel on drift, vĂ”ivad esineda olukorrad, kus me ei suuda öelda, kumb kahest sĂŒndmusest toimus esimesena. SeetĂ”ttu ei saa me ka ajale toetuda.
- SĂ”lmede sĂ”ltumatu rike sĂŒsteemis. On veel ĂŒks probleem: midagi vĂ”ib lihtsalt valesti minna, kuna meie sĂ”lmed ei ole igavesed. KĂ”vaketas vĂ”ib rikkuda, virtuaalkompuuter vĂ”ib pilves taaskĂ€ivituda, vĂ”rk vĂ”ib vahelduda ja sĂ”numid vĂ”ivad kaduda. Veelgi enam, vĂ”ivad esineda olukorrad, kus sĂ”lmed töötavad, kuid tegutsevad sĂŒsteemi vastu. Selle viimase klassi probleem on isegi saadud eraldi nime: . KĂ”ige populaarsem nĂ€ide jagatud sĂŒsteemist, kus esineb selline probleem, on Blockchain. Kuid tĂ€na me seda spetsiaalset probleemide klassi ei kĂ€sitle. Meid huvitavad olukorrad, kus lihtsalt ĂŒks vĂ”i mitu sĂ”lme vĂ”ivad rikke pĂ”hjustada.
- Kommunikatsioonimudelid (sĂ”numite vahetuse mudelid) sĂ”lmede vahel. Oleme juba tuvastanud, et sĂ”lmed suhtlevad sĂ”numite vahetamise kaudu. On kaks tuntud sĂ”numite vahetuse mudelit: sĂŒnkroonne ja asĂŒnkroonne.
Jagatud sĂŒsteemide sĂ”lmede vahelised kommunikatsioonimudelid
SĂŒnkroonne mudel â me teame tĂ€pselt, et olemas on lĂ”plik tuntud ajavahemik, mille jooksul sĂ”num jĂ”uab garantii alusel ĂŒhest sĂ”lmest teise. Kui see aeg on möödas ja sĂ”num pole saabunud, saame julgelt öelda, et sĂ”lm on vĂ€lja langenud. Sellises mudelis on meil etteennustatav ooteaeg.
AsĂŒnkroonne mudel â asĂŒnkroonsetes mudelites eeldame, et ooteaeg on piiratud, kuid ei ole olemas sellist ajavahemikku, pĂ€rast mida saab garantii, et sĂ”lm on vĂ€lja langenud. See tĂ€hendab, et sĂ”numi ooteaeg sĂ”lmest vĂ”ib olla piiratud ajatu. See on oluline mÀÀratlemine ja me rÀÀgime sellest hiljem.
Konsensuse mĂ”isted jagatud sĂŒsteemides
Enne kui mÀÀratleme konsensuse mĂ”iste formaalselt, vaatame nĂ€idet olukorrast, kus see on vajalik, nimelt â State Machine Replication.
Meil on teatud jagatud logi. Me tahaksime, et see oleks jĂ€rjepidev ja sisaldaks identseid andmeid kĂ”igis jagatud sĂŒsteemi sĂ”lmedes. Kui mĂ”ni sĂ”lm saab teada uue vÀÀrtuse, mille ta tahab logisse kirjutada, on tema ĂŒlesanne see vÀÀrtus kĂ”igile teistele sĂ”lmedele ettepanekuna esitada, et logi uuendataks kĂ”igil sĂ”lmedel ning sĂŒsteem lĂ€heks uude jĂ€rjepidevasse olekusse. Oluline on, et sĂ”lmed oleksid omavahel kokku leppinud: kĂ”ik sĂ”lmed on nĂ”ustunud, et ettepanek uus vÀÀrtus on Ă”ige, kĂ”ik sĂ”lmed on selle vÀÀrtuse vastu vĂ”tnud, ja ainult sel juhul saavad kĂ”ik logisse uue vÀÀrtuse kirjutada.
TeisisĂ”nu: ĂŒkski sĂ”lm ei vaidanud, et tal on aktuaalsem teave ja ettepanek, et vÀÀrtus on vale. SĂ”lmede vaheline kokkulepe ja konsensus ĂŒhiselt aktsepteeritud vÀÀrtuste osas on see, mis on konsensus jagatud sĂŒsteemis. Edasi rÀÀgime algoritmidest, mis vĂ”imaldavad jagatud sĂŒsteemil garanteeritult konsensusele jĂ”uda.

Rohkem formaalselt saame konsensuse algoritmi (vĂ”i lihtsalt konsensuse algoritmi) mÀÀratleda kui mingit funktsiooni, mis viib jaotatud sĂŒsteemi seisundist A seisundisse B. Oluline on, et see seisund oleks kĂ”ikide sĂ”lmede poolt aktsepteeritud ja kĂ”ik sĂ”lmed suudaksid seda kinnitada. Nagu selgub, ei ole see ĂŒlesanne sugugi nii triviaalne, nagu esmapilgul vĂ”ib paista.
Konsensuse algoritmi omadused
Konsensuse algoritmil peavad olema kolm omadust, et sĂŒsteem saaks jĂ€tkata eksisteerimist ja omada mingit progressi seisundist seisundisse liikumisel:
- Leppimine â kĂ”ik Ă”igesti töötavad sĂ”lmed peavad aktsepteerima sama vÀÀrtust (selles artiklis nimetatakse seda omadust ka ohutuse omaduseks). KĂ”ik sĂ”lmed, mis praegu töötavad (ei ole rikki lĂ€inud ega kaotanud ĂŒhendust teistega) peavad omavahel leppima ja aktsepteerima mingit lĂ”plikku ĂŒhist vÀÀrtust.
Siinkohal on oluline mĂ”ista, et sĂ”lmedes arutletavas jaotatud sĂŒsteemis on soovi leppida kokku. PĂŒĂŒame rÀÀkida sĂŒsteemidest, kus vĂ”ib juhtuda, et midagi ebaĂ”nnestub (nt mĂ”ni sĂ”lm ebaĂ”nnestub), kuid selles sĂŒsteemis ei ole sĂ”lmi, mis töötavad teadlikult teiste vastu (biitantsed generaatorid). TĂ€nu sellele omadusele jÀÀb sĂŒsteem jĂ€rjekindlaks.
- Integreerimine â kui kĂ”ik Ă”igesti töötavad sĂ”lmed pakuvad sama vÀÀrtust v, siis peab iga Ă”igesti töötav sĂ”lm selle vÀÀrtuse aktsepteerima v.
- LĂ”petamine â kĂ”ik Ă”igesti töötavad sĂ”lmed lĂ”puks aktsepteerivad mingi vÀÀrtuse (elavuse omadus), mis vĂ”imaldab algoritmil sĂŒsteemis edeneda. Iga eraldi Ă”igesti töötav sĂ”lm peab mingil hetkel aktsepteerima lĂ”pliku vÀÀrtuse ja kinnitama: âMinule â see vÀÀrtus on tĂ”ene, nĂ”ustun kogu sĂŒsteemiga.â
Konsensuse algoritmi nÀide
Kuna algoritmi omadused vĂ”ivad esialgu olla arusaamatud, illustreerime seda kĂ”ige lihtsama konsensuse algoritmi nĂ€itega, mis lĂ€bib etappe sĂŒmpaatiliselt ĂŒlesehitatud sĂ”numitevahetussĂŒsteemis, kus kĂ”ik sĂ”lmed toimivad nagu peab, sĂ”numid ei kao ja mitte midagi ei riku (kas see tĂ”esti juhtuda vĂ”ib?).
- KĂ”ik algab ettepanekust (Propose). Oletame, et sĂ”lmele nimega âSĂ”lm 1â on ĂŒhendatud klient, kes alustas tehingut ning edastas sĂ”lmele uue vÀÀrtuse â O. Alates sellest punktist hakkame âSĂ”lme 1â nimetama proposer. Kuidas proposer, peab âSĂ”lm 1â nĂŒĂŒd teavitama kogu sĂŒsteemi, et tal on vĂ€rsked andmed, ja saadab teistele sĂ”lmedele sĂ”numid: âVaadake! Mul on tulnud vÀÀrtus âOâ ja ma soovin selle salvestada! Palun kinnitage, et ka teie salvestate âOâ oma logisse.â

- JĂ€rgmine etapp on hÀÀletamine pakutud vÀÀrtuse ĂŒle (Voting). Miks see vajalik on? VĂ”ib juhtuda, et teistel sĂ”lmedel on saanud vĂ€rskemat teavet ja neil on selle sama tehinguga seotud andmeid.

Kui sĂ”lm âSĂ”lm 1â saadab oma ettepaneku, siis vaatavad teised sĂ”lmed oma logidest selle sĂŒndmuse andmeid. Kui vastuolusid ei esine, teatavad sĂ”lmed: âJah, minult ei tule selle sĂŒndmuse kohta teisi andmeid. VÀÀrtus âOâ on kĂ”ige vĂ€rskem info, mille me oleme saanud.âMuudel juhtudel vĂ”ivad sĂ”lmed vastata âSĂ”lm 1â jaoks: âKuule! Mul on selle tehingu kohta vĂ€rskemaid andmeid. Mitte âOâ, vaid midagi paremat.â
HÀÀletuse etapis jÔuavad sÔlmed otsusele: kas kÔik aktsepteerivad sama vÀÀrtuse vÔi keegi neist hÀÀletab vastu, mÀrgides, et tal on vÀrskemaid andmeid.
- Kui hÀÀletusvoor on Ă”nnestunud, ja kĂ”ik olid âjaâ, siis liigub sĂŒsteem jĂ€rgmisse etappi â vÀÀrtuse aktsepteerimine (Accept). âSĂ”lm 1â kogub teiste sĂ”lmede kĂ”ik vastused ja teatab: âKĂ”ik on nĂ”ustunud vÀÀrtusega âOâ! NĂŒĂŒdsest kuulutan ma ametlikult, et âOâ on meie uus vÀÀrtus, kĂ”igi jaoks ĂŒhine! Salvestage see endale, Ă€rge unustage. Salvestage oma logisse!â

- Teised sĂ”lmed saadavad kinnituse (Accepted), et nad on salvestanud vÀÀrtuse âOâ, ei ole midagi uut sisse tulnud (omaette kahefaasiline kinnitamine). PĂ€rast seda mĂ€rkimisvÀÀrset sĂŒndmust loeme, et jaotatud tehing on tĂ€idetud.
Nii koosneb konsensuse algoritm lihtsas vormis neljast sammust: ettepanek, hÀÀletamine, aktsepteerimine, aktsepteerimise kinnitamine.
Kui mÔnes etapis ei Ônnestunud jÔuda konsensusele, kÀivitub algoritm uuesti, arvestades teavet, mida annavad sÔlmed, kes ei nÔustunud pakutud vÀÀrtust kinnitama.
Konsensuse algoritm asĂŒnkronses sĂŒsteemis
Kuni kĂ”ik oli sujuv, rÀÀkisime sĂŒnkroonsest sĂ”numivahetusmudelile. Kuid me teame, et tĂ€napĂ€eva maailmas oleme kĂ”ik harjunud tegema asĂŒnkroonselt. Kuidas siis sarnane algoritm töötab sĂŒsteemis, kus on asĂŒnkroonse sĂ”numivahetuse mudel, kus me arvame, et vastuse ootamine sĂ”lmele vĂ”ib olla lĂ”pmatult pikk (muide, sĂ”lme rike vĂ”ib samuti olla nĂ€ide, kui sĂ”lm vĂ”ib vastata lĂ”pmatult kaua).
NĂŒĂŒd, kui me teame, kuidas pĂ”himĂ”tteliselt konsensusalgoritm töötab, on kĂŒsimus neile uudishimulikele lugejatele, kes on siia jĂ”udnud: kui palju sĂ”lmi N sĂ”lmest asĂŒnkroonses sĂ”numivahetussĂŒsteemis vĂ”ib rikki minna, et sĂŒsteem saaks endiselt konsensusele jĂ”uda?
Ăige vastus ja pĂ”hjendus on spoileris.Ăige vastus: 0. Kui vĂ€hemalt ĂŒks sĂ”lm asĂŒnkroonses sĂŒsteemis rikki lĂ€heb, ei suuda sĂŒsteem konsensusele jĂ”uda. Seda vĂ€idet tĂ”estatakse tuntud teoreemi FLP (1985, Fischer, Lynch, Paterson) puhul, mille originaali link on artikli lĂ”pus: "Rikkumise korral ei saa saavutada jaotatud konsensust, kui vĂ€hemalt ĂŒks sĂ”lm on rikki lĂ€inud."

Poisid, siis on meil probleem, me oleme harjunud, et kĂ”ik on asĂŒnkroone. Ja nĂŒĂŒd on selline asjaolu. Kuidas edasi elada?
Me rÀÀkisime praegu teooriast, matemaatikast. Mida tĂ€hendab "konsensus ei saa olla saavutatud", tĂ”lkides matemaatilisest keelest meie â insenerikeelde? See tĂ€hendab, et "ei pruugi alati olla saavutatud", st on olemas selline juhtum, kus konsensus ei ole saavutatav. Mis juhtum see siis on?
See on tĂ€pselt liveness property rikkumine, mida eespool kirjeldati. Meil ei ole ĂŒhisele nĂ”usolekule, ning sĂŒsteem ei saa edusamme teha (ei saa lĂ”ppeda piiratud ajas) juhul, kui meil ei ole kĂ”igilt sĂ”lmedelt vastust. Sest asĂŒnkroonses sĂŒsteemis ei ole meil ennustatavat vastusaega ja me ei saa teada, kas sĂ”lm on rikki lĂ€inud vĂ”i lihtsalt vastab pika aja jooksul.
Kuid praktikas saame lahenduse leida. Oletame, et meie algoritm vĂ”ib vigastuste korral kaua töötada (potentsiaalselt vĂ”ib töötada lĂ”putult). Kuid enamikus olukordades, kus enamus sĂ”lmi töötab tĂ”rgeteta, saavutame sĂŒsteemis edusamme.
Praktikas puutume kokku osaliselt sĂŒnkroonsete kommunikatsioonimudelitega. Osalist sĂŒnkroonsust mĂ”istetakse nii: tavaliselt on meil asĂŒnkroonne mudel, kuid ametlikult tuuakse sisse mingi mĂ”iste "global stabilization time" mingist ajast.
See ajamoment vĂ”ib mitte tulla lĂ”putult kaua, kuid ĂŒhel pĂ€eval peab see kindlasti toimuma. Virtuaalne Ă€ratus heliseb ja alates sellest hetkest saame ennustada ajavahemikku, mille jooksul sĂ”numid kohale jĂ”uavad. Sellest hetkest muutub asĂŒnkroonne sĂŒsteem sĂŒnkroonses sĂŒsteemiks. Praktikas puutume kokku just selliste sĂŒsteemidega.
Paxos algoritm lahendab konsensuse probleemid
â see on algoritmide perekond, mis lahendab konsensuse probleemi osaliselt sĂŒnkroonses sĂŒsteemis, eeldusel, et mĂ”ned sĂ”lmed vĂ”ivad rikki minna. Paxose autor on Ta esitas 1989. aastal algoritmi olemasolu ja Ă”igsuse ametliku tĂ”estuse.
Kuid tĂ”estamine osutus kaugel lihtsaks. Esimene publikatsioon ilmus alles 1998. aastal (33 lehekĂŒlge), kus kirjeldati algoritmi. Nagu selgus, oli see ÀÀrmiselt keeruline mĂ”ista, ja 2001. aastal ilmus artikli selgitus, mis hĂ”ivas 14 lehte. Publikatsioonide mahud on toodud selleks, et nĂ€idata, et tegelikult on konsensuse probleem ĂŒsna keeruline ning selliste algoritmide taga on tohutu töö kĂ”ige targemate inimeste poolt.
Huvitav, et Leslie Lamport ise mĂ€rkis oma loengus, et teises selgitavas artiklis on ĂŒks vĂ€ide, ĂŒks rida (ta ei tĂ€psustanud, milline), mille tĂ”lgendamine vĂ”ib olla erinev. Ja seetĂ”ttu toimib suur hulk tĂ€napĂ€evaseid Paxose rakendusi mitte tĂ€iesti korrektselt.
Paxose toimimise ĂŒksikasjalik analĂŒĂŒs vÀÀrib mitut artiklit, seetĂ”ttu pĂŒĂŒan vĂ€ga lĂŒhidalt edastada algoritmi pĂ”hikontseptsiooni. Artikli lĂ”pus leiate viiteid aine sĂŒgavamaks uurimiseks.
Rollen Paxoses
Paxose algoritmis on olemas rollide mÔisted. Vaatame kolme peamist (on ka modifikatsioone, kus on lisarolle):
- Proposers (vĂ”ivad esineda ka terminid: liidrid vĂ”i koordinaatorid).Need on inimesed, kes saavad teada mĂ”ne uuest vÀÀrtusest kasutajalt ja vĂ”tavad juhtrolli. Nende ĂŒlesanne on kĂ€ivitada uue vÀÀrtuse ettepaneku voor ja koordineerida edasised toimingud sĂ”lmedega. Paxos lubab teatud olukordades mitu liidrit.
- Acceptors (Voters). Need on sĂ”lmed, mis hÀÀletavad, kas aktsepteerida vĂ”i tagasi lĂŒkata teatud vÀÀrtus. Nende roll on vĂ€ga oluline, kuna just nemad otsustavad, milliseks olekuks sĂŒsteem lĂ€heb (vĂ”i ei lĂ€he) pĂ€rast konsensuse algoritmi jĂ€rgmiste etappide lĂ€biviimist.
- Kasutajad. Need on sĂ”lmed, mis lihtsalt aktsepteerivad ja salvestavad uut aktsepteeritud vÀÀrtust, kui sĂŒsteemi olek muutub. Nad ei tee otsuseid, vaid saavad andmeid ja saavad neid edasi anda lĂ”ppkasutajale.
Ăks sĂ”lm vĂ”ib erinevates olukordades tĂ€ita mitmeid rolle.
Kvoorumi mÔisted
Eeldame, et meie sĂŒsteem koosneb N sĂ”lmest. Ja neist vĂ”ib maksimum F sĂ”lme minna vĂ€lja. Kui F sĂ”lme suudab halveneda, peab meie klastris olema vĂ€hemalt 2F + 1 aktsepteerijat.
See on vajalik, et meil oleks alati, isegi halvima olukorra korral, âheadâ, korralikult töötavad sĂ”lmed, kes moodustavad enamuse. See tĂ€hendab, et on vĂ€hemalt F + 1 âheadâ sĂ”lme, kes on selle poolt, ja lĂ”plik vÀÀrtus vĂ”etakse vastu. Vastasel korral vĂ”ib juhtuda, et meie erinevad kohalikud grupid vĂ”tavad vastu erinevaid vÀÀrtusi ja ei suuda omavahel kokku leppida. SeepĂ€rast vajame absoluutset enamust, et vĂ”ita hÀÀletusel.
Paxos konsensuse algoritmi ĂŒldine idee
Paxose algoritm koosneb kahest suurest faasist, mis jagunevad omakorda kaheks samaksmiseks:
- Faas 1a: Ettevalmistamine. Ettevalmistuse etapis teatab liider (proposser) kĂ”ikidele sĂ”lmedele: âAlustame uut hÀÀletusfaasi. Meil on uus voor. Selle vooru number on n. NĂŒĂŒd hakkame hÀÀletamaâ. Praegu teatab ta lihtsalt uue tsĂŒkli algusest, kuid ei ava uut vÀÀrtust. Loomise ĂŒlesanne on alustada uut vooru ja anda kĂ”igile selle unikaalne number. Vooru number on oluline, see peab olema suurem kui kĂ”ik eelnevad hÀÀletusnumbrid kĂ”igilt eelnevatelt liidritelt. Just tĂ€nu vooru numbrile mĂ”istavad teised sĂŒsteemi loksud, kui vĂ€rsked andmed liider on. TĂ”enĂ€oliselt on teistel sĂ”lmedel juba hilisema vooru hÀÀletamise tulemused ja nad teatavad lihtsalt liidrile, et ta on maha jÀÀnud.
- Faas 1b: Lubadus. Kui aktsepteerivad sÔlmed on saanud uue hÀÀletusfaasi numbri, on kaks vÔimalikku tulemust:
- Uue hÀÀletuse number n on suurem kui ĂŒkskĂ”ik milline eelnevate hÀÀletuste number, milles aktsepteerija osales. Siis saadab aktsepteerija liidri lubaduse, et ta ei osale enam hÀÀletustes, kus numbri vÀÀrtus on vĂ€iksem kui n. Kui aktsepteerija on juba millegi poolt hÀÀletanud (st on juba teises faasis mingit vÀÀrtust aktsepteerinud), siis lisab ta oma lubadusele aktsepteeritud vÀÀrtuse ja hÀÀletuse numbri, milles ta osales.
- Teisest kĂŒljest, kui aktsepteerija teab hÀÀletusest, mille number on suurem, vĂ”ib ta lihtsalt ettevalmistuse etapi ignoreerida ning liidri kĂŒsimusele ei vasta.
- Faas 2a: Aktsepteerimine. Liider peab ootama kvora (sĂŒsteemis olevate sĂ”lmede enamuse) vastust ja, kui vajalik number vastuseid on saadud, on tal kaks vĂ”imalikku vĂ€ljundit:
- MĂ”ned aktsepteerijad saatsid vÀÀrtusi, mille poolt nad juba hÀÀletasid. Sellisel juhul valib liider vÀÀrtuse hÀÀletusest, mille number on suurim. Nimega x, ja saadab kĂ”ikidele sĂ”lmedele sĂ”numit kujul: âAktsepteeri (n, x)â, kus esimene vÀÀrtus on hÀÀletuse number oma sama Propose'i etapist, ja teine vÀÀrtus on see, mille pĂ€rast kĂ”ik kokku tulid, st vÀÀrtus, mille kohta hÀÀletatakse.
- Kui ĂŒkski aktsepteerija ei saatnud mingeid vÀÀrtusi, vaid lihtsalt lubasid hÀÀletada selle vooru jooksul, vĂ”ib liider neile pakkuda hÀÀletada oma vÀÀrtuse ĂŒle, selle ĂŒle, mille pĂ€rast ta isegi liider sai. Nimega y. Ta saadab kĂ”ikidele sĂ”lmedele sĂ”numit kujul: âAktsepteeri (n, y)â, sarnaselt eelmistele vĂ€ljunditele.
- Faas 2b: Aktsepteeritud. Edasi, aktsepteerivad sĂ”lmed, saadud sĂ”numiga âAktsepteeri(âŠ)â liiderelt nĂ”ustuvad temaga (saadavad kĂ”igile sĂ”lmedele kinnituse, et nad on uue vÀÀrtusega nĂ”us) ainult siis, kui nad ei ole lubanud mingile (teisele) liidrile osaleda hÀÀletustes, mille vooru number nâ > n, vastasel juhul ignoreerivad nad kinnituse pĂ€ringut.
Kui liidrile on vastanud enamuse sÔlmedest, ja kÔik nad on uut vÀÀrtust kinnitanud, loetakse uus vÀÀrtus aktsepteerituks. Hurraa! Kui aga enamust ei saavutata vÔi on sÔlmed, kes keeldusid uue vÀÀrtuse vastuvÔtmisest, algab kÔik uuesti.
Nii töötab Paxose algoritm. Igal neist etappidest on palju nĂŒansse, me ei kĂ€sitlenud praktiliselt erinevaid rikke tĂŒĂŒpe, mitmerealise liidri probleeme ja palju muud, kuid selle artikli eesmĂ€rk on tutvustada lugejat jagatud arvutuse maailma pealiskaudselt.
Oluline on mÀrkida, et Paxos ei ole ainus oma liigis, on ka teisi algoritme, nÀiteks , kuid see on juba teema teiseks artikliks.
Viidatud materjalid edasiseks uurimiseks
Novice tase:
- , Preethi Kasireddy, blogiarutelu Mediumis
- , Adi Kancherla, blogiarutelu Mediumis
- , Ittai Abraham, blogi
- , Ittai Abraham, blogiarutelu
Leslie Lamporti tase:
- , Fischer, Lynch ja Paterson, teadustöö, 1985
- , Leslie Lamport, teadustöö, 1998
- , Leslie Lamport, teadustöö, 2001
Allikas: habr.com



