Å odien mÄs piedÄvÄjam jÅ«su uzmanÄ«bai sarežģīta raksta tulkojumu par izplatÄ«tÄs bloÄ·ÄÅ”anas ievieÅ”anu, izmantojot Redis, un aicinÄm jÅ«s runÄt par Redis izredzÄm kÄ tÄmu. AttiecÄ«gÄ Redloka algoritma analÄ«ze no Martina Klepmana, grÄmatas autora "Lietojumprogrammas ar lielu slodzi", dota Å”eit.
SadalÄ«tÄ bloÄ·ÄÅ”ana ir ļoti noderÄ«gs primitÄ«vs lÄ«dzeklis, ko izmanto daudzÄs vidÄs, kur dažÄdiem procesiem ir jÄdarbojas ar kopÄ«giem resursiem, savstarpÄji izslÄdzot.
Ir vairÄkas bibliotÄkas un ziÅas, kurÄs aprakstÄ«ts, kÄ ieviest DLM (Distributed Lock Manager), izmantojot Redis, taÄu katrai bibliotÄkai ir atŔķirÄ«ga pieeja, un to sniegtÄs garantijas ir diezgan vÄjas, salÄ«dzinot ar to, kas ir sasniedzams ar nedaudz sarežģītÄku dizainu.
Å ajÄ rakstÄ mÄs mÄÄ£inÄsim aprakstÄ«t nosacÄ«to kanonisko algoritmu, kas parÄda, kÄ Ä«stenot izplatÄ«to bloÄ·ÄÅ”anu, izmantojot Redis. MÄs runÄsim par algoritmu, ko sauc Redlock, tas ievieÅ” izplatÄ«tu bloÄ·ÄÅ”anas pÄrvaldnieku, un, mÅ«suprÄt, Å”is algoritms ir droÅ”Äks par parasto vienas instances pieeju. MÄs ceram, ka kopiena to analizÄs, sniegs atsauksmes un izmantos to kÄ sÄkumpunktu sarežģītÄkiem vai alternatÄ«viem projektiem.
ÄŖstenoÅ”ana
Pirms pÄriet uz algoritma aprakstu, mÄs sniedzam vairÄkas saites uz gatavÄm implementÄcijÄm. Tos var izmantot atsaucei.
Redlock-rb (ievieÅ”ana Ruby). Ir arÄ« dakÅ”a Redlock-rb, kas pievieno paketi (gem) izplatÄ«Å”anas ÄrtÄ«bai, un ne tikai tam.
mezgls-redlock (NodeJS ievieÅ”ana). Ietver atbalstu slÄdzeÅu pagarinÄÅ”anai.
DroŔības un pieejamības garantijas
MÄs modelÄsim savu dizainu tikai ar trim Ä«paŔībÄm, kas, mÅ«suprÄt, nodroÅ”ina minimÄlÄs garantijas, kas nepiecieÅ”amas, lai efektÄ«vi izmantotu sadalÄ«to bloÄ·ÄÅ”anu.
DroŔības Ä«paÅ”ums: savstarpÄja izslÄgÅ”ana. JebkurÄ laikÄ slÄdzeni var turÄt tikai viens klients.
PieejamÄ«bas rekvizÄ«ts A: nav strupceļu. VienmÄr ir iespÄjams iegÅ«t bloÄ·ÄÅ”anu, pat ja klients, kurÅ” bloÄ·Äja resursu, neizdodas vai nonÄk citÄ diska segmentÄ.
PieejamÄ«bas rekvizÄ«ts B: kļūdu tolerance. KamÄr lielÄkÄ daļa Redis mezglu darbojas, klienti var iegÅ«t un atbrÄ«vot slÄdzenes.
KÄpÄc Å”ajÄ gadÄ«jumÄ nepietiek ar ievieÅ”anu, kuras pamatÄ ir kļūmes atgÅ«Å”ana
Lai saprastu, ko mÄs uzlabosim, analizÄsim paÅ”reizÄjo situÄciju ar lielÄko daļu izplatÄ«to bloÄ·ÄÅ”anas bibliotÄku, kuras pamatÄ ir Redis.
VienkÄrÅ”Äkais veids, kÄ bloÄ·Ät resursu, izmantojot Redis, ir izveidot atslÄgu instancÄ. Parasti atslÄga tiek izveidota ar ierobežotu kalpoÅ”anas laiku, tas tiek panÄkts, izmantojot Redis piedÄvÄto derÄ«guma termiÅa funkciju, tÄpÄc agrÄk vai vÄlÄk Ŕī atslÄga tiek atbrÄ«vota (mÅ«su sarakstÄ 2. rekvizÄ«ts). Kad klientam ir jÄatbrÄ«vo resurss, tas izdzÄÅ” atslÄgu.
No pirmÄ acu uzmetiena Å”is risinÄjums darbojas diezgan labi, taÄu pastÄv problÄma: mÅ«su arhitektÅ«ra rada vienu neveiksmes punktu. Kas notiek, ja resursdatora Redis instance neizdodas? Pieliksim tad vergu! Un mÄs to izmantosim, ja vadÄ«tÄjs nebÅ«s pieejams. DiemžÄl Ŕī iespÄja nav piemÄrota. To darot, mÄs nevarÄsim pareizi ieviest savstarpÄjÄs izslÄgÅ”anas Ä«paÅ”umu, kas mums nepiecieÅ”ams, lai nodroÅ”inÄtu droŔību, jo replikÄcija programmÄ Redis ir asinhrona.
GalvenÄ ierÄ«ce neizdodas, pirms atslÄgas ievade tiek pÄrsÅ«tÄ«ta uz slavenu ierÄ«ci.
SekotÄjs tiek paaugstinÄts par vadÄ«tÄju.
Klients B iegÅ«st bloÄ·ÄÅ”anu tam paÅ”am resursam, kuru A jau ir bloÄ·Äjis. DROÅ ÄŖBAS PÄRKÄPJUMS!
Dažreiz ir pilnÄ«gi normÄli, ka Ä«paÅ”os apstÄkļos, piemÄram, kļūmes gadÄ«jumÄ, daudzi klienti var vienlaikus turÄt slÄdzeni. Å Ädos gadÄ«jumos var izmantot uz replikÄciju balstÄ«tu risinÄjumu. PretÄjÄ gadÄ«jumÄ mÄs iesakÄm Å”ajÄ rakstÄ aprakstÄ«to risinÄjumu.
Pareiza ievieŔana ar vienu gadījumu
Pirms mÄÄ£inÄt pÄrvarÄt iepriekÅ” aprakstÄ«tÄs vienas instances konfigurÄcijas trÅ«kumus, sapratÄ«sim, kÄ pareizi rÄ«koties ar Å”o vienkÄrÅ”o gadÄ«jumu, jo Å”is risinÄjums faktiski ir derÄ«gs lietojumprogrammÄs, kurÄs laiku pa laikam ir pieÅemams sacensÄ«bu nosacÄ«jums, kÄ arÄ« tÄpÄc, ka tiek bloÄ·Äta viens gadÄ«jums kalpo par pamatu, kas tiek izmantots Å”eit aprakstÄ«tajÄ izplatÄ«tajÄ algoritmÄ.
Lai iegÅ«tu slÄdzeni, rÄ«kojieties Å”Ädi:
SET resource_name my_random_value NX PX 30000
Å Ä« komanda instalÄ atslÄgu tikai tad, ja tÄ vÄl nepastÄv (opcija NX) ar derÄ«guma periodu 30000 XNUMX milisekundes (PX opcija). TaustiÅÅ” ir iestatÄ«ts uz āmyrandomvalue" Å ai vÄrtÄ«bai ir jÄbÅ«t unikÄlai visiem klientiem un visiem bloÄ·ÄÅ”anas pieprasÄ«jumiem.
PamatÄ, lai droÅ”i atbrÄ«votu slÄdzeni, tiek izmantota nejauÅ”a vÄrtÄ«ba, un skripts norÄda Redis: noÅemiet atslÄgu tikai tad, ja tÄ pastÄv un tajÄ saglabÄtÄ vÄrtÄ«ba ir tieÅ”i tÄda, kÄda tika gaidÄ«ta. Tas tiek panÄkts, izmantojot Å”Ädu Lua skriptu:
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
Tas ir svarÄ«gi, lai novÄrstu cita klienta turÄtas slÄdzenes noÅemÅ”anu. PiemÄram, klients var iegÅ«t slÄdzeni, pÄc tam tikt bloÄ·Äts kÄdÄ darbÄ«bÄ, kas ilgst ilgÄk nekÄ pirmÄ slÄdzene (lai atslÄgai bÅ«tu laiks beigties), un vÄlÄk noÅemt slÄdzeni, ko bija ievietojis kÄds cits klients.
VienkÄrÅ”as DEL izmantoÅ”ana nav droÅ”a, jo klients var noÅemt cita klienta bloÄ·ÄÅ”anu. Turpretim, izmantojot iepriekÅ” minÄto skriptu, katra slÄdzene tiek āparakstÄ«taā ar nejauÅ”u virkni, tÄpÄc to var noÅemt tikai klients, kurÅ” to iepriekÅ” ievietoja.
KÄdai vajadzÄtu bÅ«t Å”ai nejauÅ”ajai virknei? Es domÄju, ka tai vajadzÄtu bÅ«t 20 baiti no /dev/urandom, taÄu jÅ«s varat atrast lÄtÄkus veidus, kÄ padarÄ«t virkni pietiekami unikÄlu saviem mÄrÄ·iem. PiemÄram, bÅ«tu pareizi sÄt RC4 ar /dev/urandom un pÄc tam no tÄ Ä£enerÄt pseidogadÄ«juma straumi. VienkÄrÅ”Äks risinÄjums ietver unix laika kombinÄciju mikrosekundes izŔķirtspÄjÄ un klienta ID; tas nav tik droÅ”s, bet tas, iespÄjams, atbilst uzdevumam lielÄkajÄ daÄ¼Ä kontekstu.
Laiks, ko izmantojam kÄ atslÄgas kalpoÅ”anas laika mÄrauklu, tiek saukts par "slÄdzenes kalpoÅ”anas laiku". Å Ä« vÄrtÄ«ba ir gan laiks, kas paiet pirms bloÄ·ÄÅ”anas tiek automÄtiski atbrÄ«vots, gan laiks, kas klientam jÄpabeidz, pirms cits klients var bloÄ·Ät Å”o resursu, faktiski nepÄrkÄpjot savstarpÄjÄs izslÄgÅ”anas garantijas. Å Ä« garantija ir ierobežota tikai uz noteiktu laika periodu, kas sÄkas no slÄdzenes iegÄdes brīža.
TÄpÄc mÄs esam apsprieduÅ”i labu veidu, kÄ iegÅ«t un atbrÄ«vot slÄdzeni. SistÄma (ja mÄs runÄjam par neizplatÄ«tu sistÄmu, kas sastÄv no viena un vienmÄr pieejama gadÄ«juma) ir droÅ”a. AttiecinÄsim Å”o jÄdzienu uz izkliedÄtu sistÄmu, kur mums nav Å”Ädu garantiju.
Redlock algoritms
Algoritma izplatÄ«tajÄ versijÄ tiek pieÅemts, ka mums ir N Redis meistari. Å ie mezgli ir pilnÄ«gi neatkarÄ«gi viens no otra, tÄpÄc mÄs neizmantojam replikÄciju vai kÄdu citu netieÅ”u koordinÄcijas sistÄmu. MÄs jau esam aprakstÄ«juÅ”i, kÄ droÅ”i iegÅ«t un atbrÄ«vot slÄdzeni vienÄ gadÄ«jumÄ. MÄs uzskatÄm par paÅ”saprotamu, ka algoritms, strÄdÄjot ar vienu gadÄ«jumu, izmantos tieÅ”i Å”o metodi. MÅ«su piemÄros mÄs iestatÄm N uz 5, kas ir saprÄtÄ«ga vÄrtÄ«ba. TÄdÄjÄdi mums bÅ«s jÄizmanto 5 Redis meistari dažÄdos datoros vai virtuÄlajÄs maŔīnÄs, lai nodroÅ”inÄtu, ka tie darbojas lielÄ mÄrÄ neatkarÄ«gi viens no otra.
Lai iegÅ«tu slÄdzeni, klients veic Å”Ädas darbÄ«bas:
IegÅ«st paÅ”reizÄjo laiku milisekundÄs.
SecÄ«gi mÄÄ£ina iegÅ«t bloÄ·ÄÅ”anu visos N gadÄ«jumos, visos gadÄ«jumos izmantojot vienu un to paÅ”u atslÄgas nosaukumu un nejauÅ”Äs vÄrtÄ«bas. 2. posmÄ, kad klients iestata bloÄ·ÄÅ”anu katram gadÄ«jumam, klients izmanto aizkavi, lai to iegÅ«tu, kas ir pietiekami Ä«ss salÄ«dzinÄjumÄ ar laiku, pÄc kura bloÄ·ÄÅ”ana tiek automÄtiski atbrÄ«vota. PiemÄram, ja bloÄ·ÄÅ”anas ilgums ir 10 sekundes, tad aizkave varÄtu bÅ«t ~5-50 milisekundes robežÄs. Tas novÄrÅ” situÄciju, kad klients var palikt bloÄ·Äts ilgu laiku, mÄÄ£inot sasniegt neveiksmÄ«gu Redis mezglu: ja gadÄ«jums nav pieejams, mÄs cenÅ”amies pÄc iespÄjas ÄtrÄk izveidot savienojumu ar citu gadÄ«jumu.
Lai paÅemtu slÄdzeni, klients aprÄÄ·ina, cik daudz laika ir pagÄjis; Lai to izdarÄ«tu, no faktiskÄs laika vÄrtÄ«bas tiek atÅemts laikspiedols, kas tika iegÅ«ts 1. darbÄ«bÄ. Ja un tikai tad, ja klients varÄja iegÅ«t bloÄ·ÄÅ”anu lielÄkajÄ daÄ¼Ä gadÄ«jumu (vismaz 3), un kopÄjo laiku, kas bija nepiecieÅ”ams, lai to paveiktu. iegÅ«t slÄdzeni, mazÄks par slÄdzenes ilgumu, tiek uzskatÄ«ts, ka slÄdzene ir iegÅ«ta.
Ja bloÄ·ÄÅ”ana ir iegÅ«ta, bloÄ·ÄÅ”anas ilgums tiek uzskatÄ«ts par sÄkotnÄjo bloÄ·ÄÅ”anas ilgumu, no kura atÅem 3. darbÄ«bÄ aprÄÄ·inÄto pagÄjuÅ”o laiku.
Ja klientam kÄda iemesla dÄļ neizdodas iegÅ«t bloÄ·ÄÅ”anu (vai nu tas nevarÄja bloÄ·Ät N/2+1 gadÄ«jumus, vai bloÄ·ÄÅ”anas ilgums bija negatÄ«vs), tas mÄÄ£inÄs atbloÄ·Ät visus gadÄ«jumus (pat tos, kurus, pÄc viÅa domÄm, nevar bloÄ·Ät ).
Vai algoritms ir asinhrons?
Å is algoritms ir balstÄ«ts uz pieÅÄmumu, ka, lai gan nav sinhronizÄta pulksteÅa, kurÄ darbotos visi procesi, vietÄjais laiks katrÄ procesÄ joprojÄm plÅ«st aptuveni tÄdÄ paÅ”Ä tempÄ, un kļūda ir maza, salÄ«dzinot ar kopÄjo laiku, pÄc kura tiek bloÄ·Äta. automÄtiski atbrÄ«vots. Å is pieÅÄmums ir ļoti lÄ«dzÄ«gs parastajiem datoriem raksturÄ«gajai situÄcijai: katram datoram ir lokÄlais pulkstenis, un parasti varam rÄÄ·inÄties ar to, ka laika starpÄ«ba starp dažÄdiem datoriem ir neliela.
Å ajÄ brÄ«dÄ« mums ir rÅ«pÄ«gÄk jÄformulÄ savstarpÄjÄs izslÄgÅ”anas noteikums: savstarpÄja izslÄgÅ”ana tiek garantÄta tikai tad, ja klients, kuram ir slÄdzene, iziet slÄdzenes darbÄ«bas laikÄ (Ŕī vÄrtÄ«ba iegÅ«ta 3. darbÄ«bÄ), atskaitot vÄl kÄdu laiku (kopÄ daži milisekundes, lai kompensÄtu laika starpÄ«bu starp procesiem).
Ja klientam neizdodas iegÅ«t bloÄ·ÄÅ”anu, tam pÄc nejauÅ”as aizkaves jÄmÄÄ£ina vÄlreiz; tas tiek darÄ«ts, lai desinhronizÄtu vairÄkus klientus, kuri mÄÄ£ina vienlaikus iegÅ«t bloÄ·ÄÅ”anu vienam un tam paÅ”am resursam (kas var novest pie "smadzeÅu sadalÄ«Å”anas" situÄcijas, kurÄ nav uzvarÄtÄju). TurklÄt, jo ÄtrÄk klients mÄÄ£ina iegÅ«t bloÄ·ÄÅ”anu lielÄkajai daļai Redis gadÄ«jumu, jo Å”aurÄks ir logs, kurÄ var rasties smadzeÅu sadalÄ«Å”anÄs situÄcija (un mazÄka vajadzÄ«ba pÄc atkÄrtota mÄÄ£inÄjuma). TÄpÄc ideÄlÄ gadÄ«jumÄ klientam vajadzÄtu mÄÄ£inÄt nosÅ«tÄ«t SET komandas N gadÄ«jumiem vienlaikus, izmantojot multipleksÄÅ”anu.
Å eit ir vÄrts uzsvÄrt, cik svarÄ«gi ir klientiem, kuriem neizdodas iegÅ«t lielÄko daļu slÄdzeÅu, atbrÄ«vot (daļÄji) iegÄdÄtÄs slÄdzenes, lai viÅiem nebÅ«tu jÄgaida atslÄgas derÄ«guma termiÅÅ”, pirms resursa slÄdzeni var iegÅ«t atkÄrtoti. (lai gan, ja notiek tÄ«kla sadrumstalotÄ«ba un klients zaudÄ kontaktu ar Redis gadÄ«jumiem, jums ir jÄmaksÄ pieejamÄ«bas sods, gaidot atslÄgas derÄ«guma termiÅu).
SlÄdzenes atbrÄ«voÅ”ana
BloÄ·ÄÅ”anas atbrÄ«voÅ”ana ir vienkÄrÅ”a darbÄ«ba, kas vienkÄrÅ”i prasa visu gadÄ«jumu atbloÄ·ÄÅ”anu neatkarÄ«gi no tÄ, vai klients, Ŕķiet, ir veiksmÄ«gi bloÄ·Äjis konkrÄtu gadÄ«jumu.
DroŔības apsvÄrumi
Vai algoritms ir droÅ”s? MÄÄ£inÄsim iztÄloties, kas notiek dažÄdos scenÄrijos.
SÄkumÄ pieÅemsim, ka klients lielÄkajÄ daÄ¼Ä gadÄ«jumu varÄja iegÅ«t bloÄ·ÄÅ”anu. KatrÄ instancÄ bÅ«s atslÄga ar vienÄdu kalpoÅ”anas laiku visiem. TomÄr katra no Ŕīm atslÄgÄm tika instalÄta atŔķirÄ«gÄ laikÄ, tÄpÄc to derÄ«guma termiÅÅ” beigsies dažÄdos laikos. Bet, ja pirmÄ atslÄga tika instalÄta laikÄ, kas nav sliktÄks par T1 (laiks, kuru mÄs izvÄlamies pirms sazinÄÅ”anÄs ar pirmo serveri), un pÄdÄjÄ atslÄga tika instalÄta laikÄ, kas nav sliktÄks par T2 (laiks, kurÄ tika saÅemta atbilde no pÄdÄjÄ servera), tad mÄs esam pÄrliecinÄti, ka pirmÄ atslÄga komplektÄ, kurai beidzas derÄ«guma termiÅÅ”, izdzÄ«vos vismaz MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT. VisÄm pÄrÄjÄm atslÄgÄm derÄ«guma termiÅÅ” beigsies vÄlÄk, tÄpÄc varam bÅ«t droÅ”i, ka visas atslÄgas bÅ«s vienlaikus derÄ«gas vismaz Å”o laiku.
LaikÄ, kad lielÄkÄ daļa atslÄgu paliek spÄkÄ, cits klients nevarÄs iegÅ«t slÄdzeni, jo N/2+1 SET NX operÄcijas nevar bÅ«t veiksmÄ«gas, ja N/2+1 atslÄgas jau pastÄv. LÄ«dz ar to, ja slÄdzene ir iegÄdÄta, to tajÄ paÅ”Ä brÄ«dÄ« atkÄrtoti iegÅ«t nav iespÄjams (tas pÄrkÄptu savstarpÄjÄs izslÄgÅ”anas Ä«paŔību).
TomÄr mÄs vÄlamies pÄrliecinÄties, ka vairÄki klienti, kas mÄÄ£ina iegÅ«t slÄdzeni vienlaikus, nevar gÅ«t panÄkumus vienlaikus.
Ja klients lielÄko daļu gadÄ«jumu ir bloÄ·Äjis apmÄram vai ilgÄk par maksimÄlo bloÄ·ÄÅ”anas ilgumu, tas uzskatÄ«s bloÄ·ÄÅ”anu par nederÄ«gu un atbloÄ·Äs gadÄ«jumus. TÄpÄc jÄÅem vÄrÄ tikai tas gadÄ«jums, kad klientam lielÄko daļu gadÄ«jumu izdevÄs bloÄ·Ät Ä«sÄkÄ laikÄ par derÄ«guma termiÅu. Å ajÄ gadÄ«jumÄ, Åemot vÄrÄ iepriekÅ” minÄto argumentu, laikÄ MIN_VALIDITY nevienam klientam nevajadzÄtu bÅ«t iespÄjai atkÄrtoti iegÅ«t slÄdzeni. TÄpÄc daudzi klienti varÄs bloÄ·Ät N/2+1 gadÄ«jumus vienÄ un tajÄ paÅ”Ä laikÄ (kas beidzas 2. posma beigÄs) tikai tad, kad vairÄkuma bloÄ·ÄÅ”anas laiks bija ilgÄks par TTL laiku, kas padara bloÄ·ÄÅ”anu nederÄ«gu.
Vai varat sniegt oficiÄlu droŔības pierÄdÄ«jumu, norÄdÄ«t esoÅ”os lÄ«dzÄ«gus algoritmus vai atrast kļūdu iepriekÅ” minÄtajÄ?
PieejamÄ«bas apsvÄrumi
SistÄmas pieejamÄ«ba ir atkarÄ«ga no trim galvenajÄm Ä«paŔībÄm:
AutomÄtiski atlaist slÄdzenes (kad beidzas atslÄgu derÄ«guma termiÅÅ”): atslÄgas galu galÄ atkal bÅ«s pieejamas, lai tÄs izmantotu slÄdzenÄm.
Tas, ka klienti parasti palÄ«dz viens otram, noÅemot slÄdzenes, kad vÄlamÄ slÄdzene nav iegÅ«ta, vai ir iegÅ«ta un darbs ir pabeigts; tÄpÄc, visticamÄk, mums nebÅ«s jÄgaida, lÄ«dz beigsies atslÄgu derÄ«guma termiÅÅ”, lai atgÅ«tu slÄdzeni.
Fakts, ka klientam atkÄrtoti jÄmÄÄ£ina iegÅ«t slÄdzeni, tas gaida salÄ«dzinoÅ”i ilgÄku laiku, nekÄ nepiecieÅ”ams, lai iegÅ«tu lielÄko daļu slÄdzeÅu. Tas samazina iespÄjamÄ«bu, ka, sacenÅ”oties par resursiem, var rasties situÄcija ar ŔķelÅ”anos.
TomÄr pastÄv pieejamÄ«bas sods, kas vienÄds ar tÄ«kla segmentu TTL, tÄdÄļ, ja ir blakus segmenti, sods var bÅ«t nenoteikts. Tas notiek ikreiz, kad klients iegÅ«st bloÄ·ÄÅ”anu un pÄc tam nopludina uz citu segmentu, pirms tas var to atbrÄ«vot.
PrincipÄ, Åemot vÄrÄ bezgalÄ«gus blakus esoÅ”os tÄ«kla segmentus, sistÄma var palikt nepieejama bezgalÄ«gi ilgu laiku.
VeiktspÄja, kļūmjpÄrlÄce un fsync
Daudzi cilvÄki izmanto Redis, jo viÅiem ir nepiecieÅ”ama augsta bloÄ·ÄÅ”anas servera veiktspÄja attiecÄ«bÄ uz latentumu, kas nepiecieÅ”ams, lai iegÅ«tu un atbrÄ«votu slÄdzenes, un iegÅ«Å”anu/izlaidumu skaitu, ko var pabeigt sekundÄ. Lai izpildÄ«tu Å”o prasÄ«bu, pastÄv stratÄÄ£ija saziÅai ar N Redis serveriem, lai samazinÄtu latentumu. Å Ä« ir multipleksÄÅ”anas stratÄÄ£ija (jeb "nabaga multipleksÄÅ”ana", kur ligzda tiek ievietota nebloÄ·ÄÅ”anas režīmÄ, nosÅ«ta visas komandas un nolasa komandas vÄlÄk, pieÅemot, ka marÅ”ruta laiks starp klientu un katru gadÄ«jumu ir lÄ«dzÄ«gs) .
TomÄr mums ir jÄÅem vÄrÄ arÄ« apsvÄrumi, kas saistÄ«ti ar ilgtermiÅa datu glabÄÅ”anu, ja mÄs cenÅ”amies izveidot modeli ar uzticamu atkopÅ”anos pÄc kļūmÄm.
BÅ«tÄ«bÄ, lai noskaidrotu problÄmu, pieÅemsim, ka mÄs konfigurÄjam Redis bez ilgtermiÅa datu glabÄÅ”anas. Klientam izdodas bloÄ·Ät 3 no 5 gadÄ«jumiem. Viens no gadÄ«jumiem, ko klientam izdevÄs bloÄ·Ät, tiek restartÄts, un Å”obrÄ«d tam paÅ”am resursam atkal ir 3 gadÄ«jumi, kurus mÄs varam bloÄ·Ät, savukÄrt cits klients var bloÄ·Ät restartÄto gadÄ«jumu, pÄrkÄpjot droŔības rekvizÄ«tu. uzÅemas slÄdzeÅu ekskluzivitÄti.
Ja iespÄjosit datus uz priekÅ”u (AOF), situÄcija nedaudz uzlabosies. PiemÄram, varat reklamÄt serveri, nosÅ«tot komandu SHUTDOWN un restartÄjot to. TÄ kÄ Redis derÄ«guma termiÅa darbÄ«bas ir semantiski ieviestas tÄ, lai laiks turpinÄtu plÅ«st pat tad, kad serveris ir izslÄgts, visas mÅ«su prasÄ«bas ir piemÄrotas. Tas ir normÄli, kamÄr tiek nodroÅ”inÄta normÄla izslÄgÅ”ana. Ko darÄ«t elektrÄ«bas padeves pÄrtraukumu gadÄ«jumÄ? Ja Redis pÄc noklusÄjuma ir konfigurÄts ar fsync sinhronizÄciju diskÄ katru sekundi, iespÄjams, ka pÄc restartÄÅ”anas mums nebÅ«s mÅ«su atslÄgas. TeorÄtiski, ja mÄs vÄlamies garantÄt bloÄ·ÄÅ”anas droŔību jebkuras instances restartÄÅ”anas laikÄ, mums tas ir jÄiespÄjo fsync=always iestatÄ«jumos ilgstoÅ”ai datu glabÄÅ”anai. Tas pilnÄ«bÄ nogalinÄs veiktspÄju, lÄ«dz pat CP sistÄmu lÄ«menim, ko tradicionÄli izmanto, lai droÅ”i ieviestu sadalÄ«tas slÄdzenes.
TaÄu situÄcija ir labÄka, nekÄ Å”Ä·iet no pirmÄ acu uzmetiena. PrincipÄ algoritma droŔība tiek saglabÄta, jo, instanci restartÄjot pÄc kļūmes, tÄ vairs nepiedalÄs nevienÄ bloÄ·ÄÅ”anÄ, kas paÅ”laik ir aktÄ«va.
Lai to nodroÅ”inÄtu, mums vienkÄrÅ”i jÄnodroÅ”ina, lai pÄc kļūmes gadÄ«jums paliktu nepieejams laika periodu, kas nedaudz pÄrsniedz mÅ«su izmantoto maksimÄlo TTL. TÄdÄ veidÄ mÄs gaidÄ«sim lÄ«dz derÄ«guma termiÅa beigÄm un visu atslÄgu, kas bija aktÄ«vas kļūmes brÄ«dÄ«, automÄtiskai atbrÄ«voÅ”anai.
Izmantojot aizkavÄtas restartÄÅ”anas, principÄ ir iespÄjams panÄkt droŔību pat tad, ja Redis nav ilgstoÅ”as āāāānoturÄ«bas. TomÄr Åemiet vÄrÄ, ka tas var izraisÄ«t naudas sodu par pieejamÄ«bas pÄrkÄpÅ”anu. PiemÄram, ja vairums gadÄ«jumu neizdodas, sistÄma kļūs globÄli nepieejama TTL (un Å”ajÄ laikÄ nevar bloÄ·Ät nevienu resursu).
Ja klientu veiktais darbs sastÄv no maziem soļiem, iespÄjams samazinÄt noklusÄjuma slÄdzenes ilgumu un ieviest slÄdzeÅu pagarinÄÅ”anas mehÄnismu. PrincipÄ, ja klients ir aizÅemts ar skaitļoÅ”anu un bloÄ·ÄÅ”anas derÄ«guma termiÅÅ” ir bÄ«stami zems, varat nosÅ«tÄ«t Lua skriptu visiem gadÄ«jumiem, kas paplaÅ”ina atslÄgas TTL, ja atslÄga joprojÄm pastÄv un tÄs vÄrtÄ«ba joprojÄm ir nejauÅ”a vÄrtÄ«ba, kas iegÅ«ta, kad slÄdzene tika iegÄdÄta.
Klientam vajadzÄtu uzskatÄ«t, ka bloÄ·ÄÅ”ana ir atkÄrtoti jÄiegÅ«st tikai tad, ja tÄ derÄ«guma termiÅÄ ir spÄjusi bloÄ·Ät lielÄko daļu gadÄ«jumu.
Tiesa, tehniski algoritms nemainÄs, tÄpÄc ir jÄierobežo maksimÄlais atkÄrtotu slÄdzenes iegÅ«Å”anas mÄÄ£inÄjumu skaits, pretÄjÄ gadÄ«jumÄ tiks pÄrkÄptas pieejamÄ«bas Ä«paŔības.