Verdeelt Sperrung mat Redis

Hey Habr!

Haut brĂ©ngen mir Är Opmierksamkeet eng Iwwersetzung vun engem komplexen Artikel iwwer d'Ëmsetzung vun der verdeeler Sperrung mat Redis an invitĂ©ieren Iech iwwer d'Perspektive vu Redis als Thema ze schwĂ€tzen. Analyse vum Redlock Algorithmus a Fro vum Martin Kleppmann, Auteur vum Buch "HĂ©ich Last Uwendungen", ginn hei.

Verdeelt Sperrung ass e ganz nĂ«tzlecht Primitiv benotzt a villen Ëmfeld wou verschidde Prozesser op gemeinsame Ressourcen op eng gĂ©igesĂ€iteg exklusiv ManĂ©ier musse schaffen.

Et ginn eng Zuel vu Bibliothéiken a Posts dobaussen déi beschreiwen wéi een DLM (Distributed Lock Manager) mat Redis implementéiert, awer all Bibliothéik hëlt eng aner Approche an d'Garantien déi se ubidden sinn zimlech schwaach am Verglach mat deem wat mat e bësse méi sophistikéierten Design erreechbar ass.

An dĂ«sem Artikel wĂ€erte mir probĂ©ieren e bedingt kanonesche Algorithmus ze beschreiwen deen weist wĂ©i een verdeelt Sperrung mat Redis implementĂ©iert. Mir schwĂ€tzen iwwer en Algorithmus genannt Redlock, et implementĂ©iert e verdeelt SpĂ€r Manager an, eiser Meenung no, ass dĂ«sen Algorithmus mĂ©i sĂ©cher wĂ©i dĂ©i ĂŒblech Single-Instance Approche. Mir hoffen, datt d'Gemeinschaft et analysĂ©iert, Feedback gĂ«tt a se als Startpunkt fir mĂ©i komplex oder alternativ Projeten benotzt.

Ëmsetzung

Ier Dir op d'Beschreiwung vum Algorithmus weider geet, gi mir e puer Linken op fÀerdege Implementatiounen. Si kënne fir Referenz benotzt ginn.

  • Redlock-rb (Ëmsetzung fir Ruby). Et gĂ«tt och Forschett Redlock-rb, deen e Package (Edelsteen) bĂ€idrĂ©it fir d'Verdeelung ze vereinfachen, an net nĂ«mme fir dat.
  • Redlock-py (Python Ëmsetzung).
  • Aioredlock (Ëmsetzung fir Asyncio Python).
  • Redlock-php (Ëmsetzung fir PHP).
  • PHPRedisMutex (eng aner Implementatioun fir PHP)
  • cheprasov/php-redis-lock (PHP BibliothĂ©ik fir Schleisen)
  • Redsync (Ëmsetzung fir Go).
  • Redisson (Implementatioun fir Java).
  • Redis::DistLock (Implementatioun fir Perl).
  • Redlock-cpp (Ëmsetzung fir C++).
  • Redlock-cs (Implementatioun fir C#/.NET).
  • RedLock.net (Implementatioun fir C#/.NET). Mat ËnnerstĂ«tzung fir Async- a SpĂ€rverlĂ€ngerungen.
  • ScarletLock (Implementatioun fir C# .NET mat konfigurĂ©ierbaren DategeschĂ€ft)
  • Redlock4Net (Implementatioun fir C# .NET)
  • Node-redlock (Implementatioun fir NodeJS). Ëmfaasst ËnnerstĂ«tzung fir VerlĂ€ngerung Schleisen.

Sécherheet an Disponibilitéit Garantien

Mir wÀerten eisen Design mat just drÀi Eegeschafte modelléieren, déi mir mengen déi Minimum Garantien ubidden fir effektiv verdeelt Sperrung ze benotzen.

  1. Sécherheet Propriétéit: GéigesÀitege Ausgrenzung. Zu all Moment kann nëmmen ee Client de SpÀr halen.
  2. Disponibilitéit Property A: Keng Deadlocks. Et ass ëmmer méiglech schlussendlech e Sperr ze kréien, och wann de Client deen d'Ressource gespaart huet fÀllt oder op engem aneren Disksegment landen.
  3. Disponibilitéit Property B: Feeler Toleranz. Soulaang d'Majoritéit vun de Redis KnÀppercher lafen, kënnen d'Clienten d'Schlëss kréien a befreien.

Firwat Implementatioun baséiert op Feeler Erhuelung ass net genuch an dësem Fall
Fir ze verstoen wat mir wÀerte verbesseren, loosst eis den aktuellen Zoustand analyséieren mat de meeschte verdeelte Sperrbibliothéike baséiert op Redis.

Deen einfachste Wee fir eng Ressource mat Redis ze spÀren ass e Schlëssel an der Instanz ze kreéieren. Typesch gëtt e Schlëssel mat enger limitéierter Liewensdauer erstallt, dëst gëtt erreecht mat der Expires Feature, déi am Redis geliwwert gëtt, also fréier oder spéider gëtt dëse Schlëssel verëffentlecht (Eegeschaft 2 an eiser Lëscht). Wann de Client d'Ressource muss befreien, lÀscht de Schlëssel.

Op den Ă©ischte BlĂ©ck funktionnĂ©iert dĂ«s LĂ©isung ganz gutt, awer et gĂ«tt e Problem: eis Architektur erstellt en eenzege Punkt vum Echec. Wat geschitt wann de Host Redis Instanz feelt? Loosst eis dann e Sklave addĂ©ieren! A mir wĂ€erten et benotzen wann de Presentateur net verfĂŒgbar ass. Leider ass dĂ«s Optioun net liewensfĂ€eg. Duerch dĂ«st ze maachen, wĂ€erte mir net fĂ€eg sinn dĂ©i gĂ©igesĂ€iteg Ausgrenzungseigenschafte richteg Ă«mzesetzen, dĂ©i mir brauchen fir SĂ©cherheet ze garantĂ©ieren, well d'Replikatioun am Redis asynchron ass.

SelbstverstÀndlech, an esou engem Modell geschitt e Rennen Zoustand:

  1. Client A kritt e SpÀr op de Meeschter.
  2. De Master feelt ier de Schlësselentrée un de Sklave transferéiert gëtt.
  3. De Follower gëtt zum Leader gefördert.
  4. Client B kritt e SpÀr op déiselwecht Ressource déi A scho gespaart huet. SECURITY VIOLATION!

Heiansdo ass et ganz normal datt a speziellen ËmstĂ€nn, wĂ©i zum Beispill e Feeler, vill Clienten d'Schloss glĂ€ichzĂ€iteg halen. An esou FĂ€ll kann eng Replikatioun-basĂ©iert LĂ©isung applizĂ©iert ginn. Soss, recommandĂ©iere mir d'LĂ©isung an dĂ«sem Artikel beschriwwen.

Korrekt Ëmsetzung mat enger eenzeger Instanz

Ier Dir probéiert d'MÀngel vun der uewen beschriwwener Single-Instanz Konfiguratioun ze iwwerwannen, loosst eis verstoen wéi Dir dësen einfache Fall richteg behandelt, well dës Léisung tatsÀchlech gëlteg ass an Uwendungen wou e Rennenbedingung vun ZÀit zu ZÀit akzeptabel ass, an och well d'Blockéierung op engem eenzeg Instanz déngt als Basis déi am verdeelt Algorithmus benotzt gëtt hei beschriwwen.

Fir e Schloss ze kréien, maacht dat:

SET resource_name my_random_value NX PX 30000

Dëse Kommando installéiert e Schlëssel nëmmen wann et net schonn existéiert (NX Optioun), mat enger Validitéit Period pa 30000 Millisekonnen (PX Optioun). De Schlëssel ass op "myrandomvalue" Dëse WÀert muss eenzegaarteg sinn iwwer all Clienten an all SpÀr Ufroen.
Prinzipiell gëtt e zoufÀllege WÀert benotzt fir d'Schloss sécher ze befreien, mat engem Skript deen Redis seet: nëmmen de Schlëssel erofhuelen wann et existéiert an de WÀert an deem gespÀichert ass genau dat wat erwaart gouf. Dëst gëtt erreecht andeems Dir de folgende Lua Skript benotzt:

if redis.call("get",KEYS[1]) == ARGV[1] then
    return redis.call("del",KEYS[1])
else
    return 0
end

Dëst ass wichteg fir ze verhënneren datt e SpÀr vun engem anere Client gelÀscht gëtt. Zum Beispill kann e Client e Sperre kréien, dann an enger Operatioun gespaart ginn, déi méi laang dauert wéi déi éischt Sperrung (sou datt de Schlëssel ZÀit huet fir ofzelafen), a spéider de SpÀr ewechhuelen, deen en anere Client gesat huet.
Mat engem einfachen DEL ass onsécher well e Client e SpÀr vun engem anere Client ewechhuelen kann. Am Géigesaz, wann Dir den uewe genannte Skript benotzt, gëtt all SpÀr mat enger zoufÀlleger String "ënnerschriwwen", sou datt nëmmen de Client deen et virdru plazéiert huet et ewechhuelen kann.

Wat soll dĂ«s zoufĂ€lleg String sinn? Ech denken datt et 20 Bytes vun /dev/urandom sollt sinn, awer Dir kĂ«nnt manner deier WeeĂ«r fannen fir d'String eenzegaarteg genuch fir Är Zwecker ze maachen. Zum Beispill wier et gutt fir RC4 mat /dev/urandom ze sĂ€en an dann e pseudo-zoufĂ€lleg Stream dovunner ze generĂ©ieren. Eng mĂ©i einfach LĂ©isung beinhalt eng Kombinatioun vun der Unix ZĂ€it an der Mikrosekonne Resolutioun plus d'Client ID; et ass net esou sĂ©cher, awer et ass mĂ©iglecherweis op d'Aufgab an de meeschte Kontexter.

D'ZÀit déi mir als Moossnam fir d'Liewensdauer vum Schlëssel benotzen, nennt sech d'"SpÀr Liewensdauer". Dëse WÀert ass souwuel d'ZÀit ier d'SpÀr automatesch frÀigelooss gëtt an d'Quantitéit vun der ZÀit, déi e Client muss eng Operatioun ofgeschloss hunn, ier en anere Client dës Ressource ofschléissen kann, ouni tatsÀchlech géigesÀitege Ausgrenzungsgarantie ze verletzen. Dës Garantie ass limitéiert nëmmen op eng gewëssen ZÀitfenster, déi ufÀnkt vum Moment wou d'Schloss kaaft gëtt.

Also hu mir e gudde Wee diskutĂ©iert fir e Schloss ze krĂ©ien an ze befreien. De System (wa mir vun engem net-verdeelte System schwĂ€tzen, deen aus enger eenzeger an Ă«mmer verfĂŒgbarer Instanz besteet) ass sĂ©cher. Loosst eis dĂ«st Konzept op e verdeelt System ausdehnen, wou mir keng esou Garantien hunn.

Redlock Algorithmus

Déi verdeelt Versioun vum Algorithmus gëtt ugeholl datt mir N Redis Meeschter hunn. Dës Node si komplett onofhÀngeg vuneneen, also benotze mir keng Replikatioun oder all aner implizit Koordinatiounssystem. Mir hu schonn iwwerdeckt wéi een e SpÀr op enger eenzeger Instanz sécher erfaasst a befreit. Mir huelen et selbstverstÀndlech datt den Algorithmus, wann Dir mat enger eenzeger Instanz schafft, genau dës Method benotzt. An eise Beispiller setzen mir N op 5, wat e raisonnabele WÀert ass. Also musse mir 5 Redis Masters op verschiddene Computeren oder virtuelle Maschinnen benotzen fir sécherzestellen datt se gréisstendeels onofhÀngeg vuneneen handelen.

Fir e Schloss ze kréien, mécht de Client déi folgend Operatiounen:

  1. Kritt déi aktuell ZÀit a Millisekonnen.
  2. Sequentiell probĂ©iert e SpĂ€r op all N Instanzen ze krĂ©ien, andeems de selwechte SchlĂ«sselnumm an zoufĂ€lleg WĂ€erter an alle FĂ€ll benotzt. An der Stage 2, wann de Client e SpĂ€r op enger Per-Instanz Basis opstellt, benotzt de Client eng Verzögerung fir et ze krĂ©ien, dee kuerz genuch ass am Verglach mat der ZĂ€it no dĂ€r de SpĂ€r automatesch frĂ€igelooss gĂ«tt. Zum Beispill, wann d'BlockĂ©ierungsdauer 10 Sekonnen ass, da kĂ©int d'Verzögerung am BerĂ€ich vun ~5-50 Millisekonnen sinn. DĂ«st eliminĂ©iert d'Situatioun an dĂ€r de Client fir eng laang ZĂ€it blockĂ©iert ka bleiwen fir e gescheitert Redis Node z'erreechen: wann d'Instanz net verfĂŒgbar ass, probĂ©ieren mir sou sĂ©ier wĂ©i mĂ©iglech mat enger anerer Instanz ze verbannen.
  3. Fir e SpÀr ze huelen, berechent de Client wéi vill ZÀit vergaangen ass; Fir dëst ze maachen, subtracts et vum aktuellen ZÀitwÀert den ZÀitstempel deen am Schrëtt kritt gouf 1. Wann an nëmmen wann de Client d'SpÀr op d'Majoritéit vun Instanzen kritt huet (op d'mannst 3), an d'GesamtzÀit huet et gedauert d'SpÀr kréien, manner wéi d'SpÀr Dauer, gëtt de SpÀr als kritt.
  4. Wann e SpÀr opkaf ass, gëtt d'SpÀrdauer als ursprénglech Sperrdauer minus déi vergaangen ZÀit berechent am Schrëtt 3 ugeholl.
  5. Wann de Client et net fÀerdeg bréngt d'SpÀr aus iergendengem Grond ze kréien (entweder et konnt N/2+1 Instanzen net spÀren, oder d'SpÀr Dauer war negativ), da wÀert et probéieren all Instanzen opzemaachen (och déi, déi hien geduecht huet et net ze blockéieren ).

Ass den Algorithmus asynchron?

DĂ«sen Algorithmus basĂ©iert op der Virgab datt, obwuel et keng synchronisĂ©iert Auer ass, op dĂ€r all Prozesser funktionnĂ©ieren, d'LokalzĂ€it an all Prozess nach Ă«mmer am selwechte Tempo flĂ©isst, an de Feeler ass kleng am Verglach mat der GesamtzĂ€it no dĂ€r d'SpĂ€r ass. automatesch verĂ«ffentlecht. DĂ«s Virgab ass ganz Ă€hnlech zu der Situatioun typesch fir normal Computeren: all Computer huet eng lokal Auer, a mir kĂ«nnen normalerweis op der Tatsaach zielen, datt den ZĂ€it Ënnerscheed tĂ«scht verschiddene Computeren kleng ass.

Zu dësem ZÀitpunkt musse mir eis géigesÀiteg Ausgrenzungsregel méi virsiichteg formuléieren: géigesÀiteg Ausgrenzung ass nëmme garantéiert wann de Client deen d'Schloss hÀlt wÀhrend der ZÀit wou d'Schloss gëlteg ass (dëse WÀert kritt am Schrëtt 3), minus e bësse méi ZÀit (am Ganzen e puer) Millisekonnen fir den ZÀitdifferenz tëscht Prozesser ze kompenséieren).

De folgenden interessanten Artikel erzielt méi iwwer esou Systemer déi Koordinatioun vun ZÀitintervaller erfuerderen: Leases: en efficace Feeler-tolerante Mechanismus fir verdeelt Fichier Cache Konsequenz.

Widderhuelen op Echec

Wann e Client et net fÀerdeg bréngt e SpÀr ze kréien, muss et no enger zoufÀlleger Verspéidung nach eng Kéier probéieren; dëst gëtt gemaach fir verschidde Clienten ze desynchroniséieren déi probéieren e SpÀr op der selwechter Ressource zur selwechter ZÀit ze kréien (wat kann zu enger "Split-Brain" Situatioun féieren an dÀr et keng Gewënner gëtt). ZousÀtzlech, wat méi séier e Client probéiert e SpÀr op eng Majoritéit vu Redis Instanzen ze kréien, dest méi schmuel ass d'Fënster an dÀr eng gespléckt Gehir Situatioun kann optrieden (an wat manner de Besoin fir Neiversichten ass). Dofir, am Idealfall, sollt de Client probéieren SET Kommandoen op N Instanzen glÀichzÀiteg mat Multiplexing ze schécken.

Et ass derwÀert hei ze ënnerstrÀichen, wéi wichteg et ass fir Clienten, déi d'Majoritéit vun de SchlÀsser net kréien, déi (deelweis) erfaasst SchlÀsser ze léisen, sou datt se net musse waarden bis de Schlëssel ofleeft, ier d'Schloss op der Ressource erëm ka kaaf ginn. (obwuel wann d'Netzfragmentatioun geschitt , an de Client verléiert de Kontakt mat de Redis Instanzen, da musst Dir eng Disponibilitéitsstrof bezuelen wÀrend Dir op de Schlëssel waart fir oflafen).

Loosst d'SpÀr

E SpÀr frÀiginn ass eng einfach Operatioun déi einfach all Instanzen ophiewen erfuerdert, egal ob de Client schéngt eng bestëmmte Instanz erfollegrÀich gespaart ze hunn.

Sécherheet Considératiounen

Ass den Algorithmus sécher? Loosst eis probéieren eis virzestellen wat a verschiddene Szenarie geschitt.

Fir unzefĂ€nken, loosst eis unhuelen datt de Client e SpĂ€r op d'MajoritĂ©it vun Instanzen konnt krĂ©ien. All Instanz enthĂ€lt e SchlĂ«ssel mat der selwechter Liewensdauer fir all. WĂ©i och Ă«mmer, all eenzel vun dĂ«se SchlĂ«sselen gouf zu enger anerer ZĂ€it installĂ©iert, sou datt se zu verschiddenen ZĂ€iten oflafen. Awer wann den Ă©ischte SchlĂ«ssel glĂ€ichzĂ€iteg net mĂ©i schlĂ«mm wĂ©i T1 installĂ©iert gouf (d'ZĂ€it dĂ©i mir wielen ier Dir den Ă©ischte Server kontaktĂ©iert), an de leschte SchlĂ«ssel gouf op enger ZĂ€it net mĂ©i schlĂ«mm wĂ©i T2 installĂ©iert (d'ZĂ€it wou d'Äntwert kritt gouf) vum leschte Server), da si mir zouversiichtlech datt den Ă©ischte SchlĂ«ssel am Set deen ofleeft op d'mannst iwwerlieft MIN_VALIDITY=TTL-(T2-T1)-CLOCK_DRIFT. All aner SchlĂ«sselen wĂ€erten spĂ©ider oflafen, sou datt mir sĂ©cher kĂ«nne sinn datt all SchlĂ«ssel glĂ€ichzĂ€iteg fir op d'mannst dĂ«s KĂ©ier gĂ«lteg sinn.

WÀrend der ZÀit wou déi meescht Schlëssele gëlteg bleiwen, kann en anere Client d'Schloss net kréien, well N/2+1 SET NX Operatiounen net geléngen wann N/2+1 Schlësselen scho existéieren. Dofir, wann e Schloss opkaf ass, ass et onméiglech et am selwechte Moment erëm ze kréien (dëst géif de géigesÀitege Ausgrenzungseigendom verletzen).
Wéi och ëmmer, mir wëllen dofir suergen datt verschidde Clienten déi probéieren e SpÀr zur selwechter ZÀit ze kréien net glÀichzÀiteg geléngen.

Wann de Client d'MajoritĂ©it vun Instanzen fir ongefĂ©ier oder mĂ©i wĂ©i dĂ©i maximal SpĂ€r Dauer gespaart huet, wĂ€ert et d'SpĂ€r als ongĂ«lteg betruechten an d'Instanzen opmaachen. Dofir musse mir nĂ«mmen de Fall berĂŒcksichtegen an deem de Client et fĂ€erdeg bruecht huet d'MajoritĂ©it vun de FĂ€ll an enger ZĂ€it manner wĂ©i den Verfallsdatum ze blockĂ©ieren. An dĂ«sem Fall, iwwer dĂ©i uewe genannten Argument, wĂ€hrend der ZĂ€it MIN_VALIDITY kee Client dĂ€erf fĂ€eg sinn d'SpĂ€r erĂ«m ze krĂ©ien. Dofir kĂ«nne vill Clienten N / 2 + 1 Instanzen an der selwechter ZĂ€it spĂ€ren (wat um Enn vun der Etapp 2 ophĂ€lt) nĂ«mmen wann d'ZĂ€it fir d'MajoritĂ©it ze spĂ€ren mĂ©i grouss war wĂ©i d'TTL ZĂ€it, wat d'SpĂ€r ongĂ«lteg mĂ©cht.

Kënnt Dir e formelle Beweis vu Sécherheet ubidden, existéierend Àhnlech Algorithmen uginn oder e Feeler an der uewen fannen?

Accessibilitéit Considératiounen

System Disponibilitéit hÀnkt vun drÀi Haaptcharakteristiken of:

  1. Automatesch SpĂ€ren frĂ€iginn (wĂ©i d'SchlĂ«sselen oflafen): SchlĂ«sselen wĂ€erte schliisslech erĂ«m verfĂŒgbar sinn fir fir SpĂ€ren ze benotzen.
  2. D'Tatsaach, datt d'Clienten normalerweis géigesÀiteg hëllefen andeems d'SchlÀsser ofgeschaaft ginn, wann de gewënschte SpÀr net erfonnt gouf, oder kaaft gouf an d'Aarbecht fÀerdeg ass; also et ass wahrscheinlech datt mir net musse waarden bis d'Schlësselen oflafen fir d'Schloss erëm ze kréien.
  3. D'Tatsaach datt wann e Client muss erëm probéieren e Sperr ze kréien, waart et op eng relativ méi laang ZÀit wéi d'Period déi néideg ass fir déi meescht SpÀren ze kréien. Dëst reduzéiert d'Wahrscheinlechkeet datt eng gespléckt Gehir Situatioun entstinn wann Dir fir Ressourcen konkurréiert.

Wéi och ëmmer, et gëtt eng Disponibilitéitsstrof glÀich wéi den TTL vun den Netzwierksegmenter, also wann et kontinuéierlech Segmenter sinn, kann d'Strof onbestëmmt sinn. Dëst geschitt wann e Client e Sperr kritt an dann an en anert Segment reift ier e se frÀigelooss huet.

Prinzipiell, onendlech kontinuĂ©ierlech Netzwierksegmenter, kann e System fir eng onendlech ZĂ€it net verfĂŒgbar bleiwen.

Leeschtung, Failover an fsync

Vill Leit benotzen Redis well se eng héich Sperrserverleistung brauchen wat d'Latenz ugeet fir SpÀren ze kréien an ze befreien, an d'Zuel vun den Acquisitioune / Verëffentlechungen déi pro Sekonn ofgeschloss kënne ginn. Fir dës Ufuerderung z'erreechen, gëtt et eng Strategie fir mat N Redis Serveren ze kommunizéieren fir latency ze reduzéieren. Dëst ass eng Multiplexingstrategie (oder "Aarme Mann Multiplexing", wou de Socket an net-blockéierend Modus gesat gëtt, all Kommandoen schéckt, a spéider d'Befehle liest, unzehuelen datt d'RonnreeszÀit tëscht dem Client an all Instanz Àhnlech ass) .

WĂ©i och Ă«mmer, mir mussen och d'ConsidĂ©ratioun berĂŒcksichtegen, dĂ©i mat laangfristeg Datelagerung assoziĂ©iert, wa mir probĂ©ieren e Modell mat zouverlĂ©issege Erhuelung vu Feeler ze kreĂ©ieren.

Prinzipiell, fir d'Thema ze klÀren, loosst eis unhuelen datt mir Redis konfiguréieren ouni laangfristeg Datelagerung. De Client verwalt 3 vun 5 Instanzen ze blockéieren. Ee vun den Instanzen, déi de Client et fÀerdeg bruecht huet ze blockéieren, gëtt nei gestart, an am Moment sinn et erëm 3 Instanzen fir déiselwecht Ressource, déi mir kënne blockéieren, an en anere Client kann am Tour déi nei gestart Instanz blockéieren, wat d'Sécherheetseigenschaft verletzt iwwerhëlt Exklusivitéit vun spÀren.

Wann Dir Daten viraus aktivéiert (AOF), wÀert d'Situatioun liicht verbesseren. Zum Beispill kënnt Dir e Server förderen andeems Dir de SHUTDOWN Kommando schéckt an et nei start. Zënter Verfallsoperatioune bei Redis semantesch ëmgesat ginn sou datt d'ZÀit weider fléisst och wann de Server ausgeschalt ass, sinn all eis Ufuerderunge gutt. Dëst ass normal soulaang e normale Shutdown assuréiert ass. Wat maachen am Fall vu Stroumausfall? Wann Redis par défaut konfiguréiert ass, mat fsync Synchroniséierung op Disk all Sekonn, dann ass et méiglech datt mir no engem Restart net eise Schlëssel hunn. Theoretesch, wa mir SpÀr Sécherheet wÀhrend all Instanz Neistart wëllen garantéieren, solle mir aktivéieren fsync=always an den Astellunge fir laangfristeg Datelagerung. Dëst wÀert d'Performance komplett ëmbréngen, bis op den Niveau vun de CP Systemer déi traditionell benotzt gi fir sécher verdeelt SpÀren ëmzesetzen.

Awer d'Situatioun ass besser wéi et op den éischte Bléck schéngt. Prinzipiell ass d'Sécherheet vum Algorithmus bewahrt, well wann d'Instanz no engem Ausfall nei gestart gëtt, ass se net méi un all SpÀr matmaachen, deen am Moment aktiv ass.

Fir dĂ«st ze garantĂ©ieren, brauche mir just sĂ©cherzestellen datt no engem Feeler d'Instanz net verfĂŒgbar bleift fir eng ZĂ€it mĂ©i wĂ©i dĂ©i maximal TTL dĂ©i mir benotzen. Op dĂ«s ManĂ©ier wĂ€erte mir waarden bis den Verfallsdatum an d'automatesch VerĂ«ffentlechung vun alle SchlĂ«sselen dĂ©i aktiv waren am Moment vum Echec.

Mat verspĂ©iten Neistarten ass et am Prinzip mĂ©iglech SĂ©cherheet ze erreechen och wann keng laangfristeg Persistenz zu Redis ass. NotĂ©iert awer datt dĂ«st zu enger Geldstrof kĂ«nnt fir d'Verletzung vun der AccessibilitĂ©it. Zum Beispill, wann d'MajoritĂ©it vun Instanzen feelen, gĂ«tt de System fir den TTL weltwĂ€it net verfĂŒgbar (a keng Ressource kann wĂ€hrend dĂ«ser ZĂ€it blockĂ©iert ginn).

Mir erhéijen d'Disponibilitéit vum Algorithmus: mir verlÀngeren d'Blockéierung

Wann d'Aarbecht vun de Clienten aus klenge Schrëtt besteet, ass et méiglech d'Default-Schlossdauer ze reduzéieren an e Mechanismus fir d'VerlÀngerung vun de SpÀren ëmzesetzen. Am Prinzip, wann de Client beschÀftegt ass mat Informatik an de SperrverfallswÀert geféierlech niddereg ass, kënnt Dir e Lua Skript un all Instanzen schécken, déi den TTL vum Schlëssel verlÀngeren, wann de Schlëssel nach ëmmer existéiert a sÀi WÀert nach ëmmer e zoufÀllege WÀert ass, deen de Schlëssel kritt. SpÀr opkaf.

E Client soll nëmmen e SpÀr als erëmgewielt betruechten wann et et fÀerdeg bruecht huet d'Majoritéit vun Instanzen bannent der Validitéitsperiod ze spÀren.

Richteg, technesch Ànnert den Algorithmus net, sou datt d'maximal Unzuel vu widderholl Versiche fir SpÀren ze kréien muss limitéiert sinn, soss ginn d'Accessibilitéitseigenschaften verletzt.

Source: will.com

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster