← All posts

Ons diensontdekking het sy eie mislukking gevang en homself afgeskakel

Authagonal·July 1, 2026
authdistributed-systemsclusteringleader-electionazureaks

Ons het ʼn drie-replika-tros gehad wat aanhoudend met homself verskil het. Agtergrondtake het twee en drie keer agtereenvolgens geloop. Die antwoord was nie in die logs nie; dit was in ons eie kode. Die eweknie-ontdekkingsroetine het ʼn catch-blok gehad, en die kommentaar daarin het, min of meer, gesê: "multicast het misluk, ontdekking afgeskakel." Ons diensontdekking was besig om sy eie mislukking te vang en homself stilweg af te skakel, en dit het presies dít in produksie gedoen van dag een af.

Dit is die verhaal van hoekom ʼn trosvormingsprotokol wat korrek is op ʼn bediener in ʼn rak die verkeerde gereedskap is sodra jy dit op ʼn bestuurde platform sit, en hoekom die oplossing was om dit te skrap eerder as om dit te herstel.

Waarvoor die tros eintlik is

ʼn Auth-bediener loop as meer as een replika ter wille van beskikbaarheid. Die replikas is grootliks onafhanklik: enigeen van hulle kan ʼn token valideer of ʼn wagwoord nagaan. Maar ʼn paar take moet een keer loop, nie een keer per replika nie. Die data-behoudveeg wat verstreke rekords uitvee. Die loop wat kliënte se webhooks afvuur. Enigiets wat na buite reik en ʼn newe-effek het. Daarvoor het jy twee dinge nodig waaroor die tros moet saamstem: wie die lede is, en watter een van hulle die leier is wat die enkellopende (singleton) werk uitvoer.

Ons oorspronklike antwoord was die klassieke een: gossip. Elke node klets met sy ewekniges, lidmaatskap is ʼn ontluikende eienskap van wie bereikbaar is, en die groep verkies ʼn leier uit die ooreengekome stel. Dit is ʼn pragtige ontwerp. Dit veronderstel ook dat die nodes mekaar kan vind, en die manier waarop die ou kode hulle gevind het, was multicast: skreeu op die plaaslike netwerksegment en kyk wie antwoord.

Hoekom dit gebreek het, stilweg

Bestuurde Kubernetes dra nie multicast nie. So ook nie byna enige wolknetwerk wat jy nie self bou nie. Die skreeu het uitgegaan en niks het teruggekom nie, elke keer. So het ontdekking "misluk," die catch-blok het afgegaan, en elke node het tot die gevolgtrekking gekom dat hy alleen in die wêreld is.

By een replika is dit onskadelik. By drie is dit split-brain by konstruksie: drie nodes, elkeen seker dat hy die enigste lid is, elkeen wat homself as leier verkies, elkeen wat die enkellopende werk uitvoer. Die behoudveeg het op al drie geloop. Die webhook-loop het elke kliënt se webhook drie keer afgevuur. Niks daarvan het ʼn fout gegooi nie, want uit elke eensame node se oogpunt was alles in orde. Die fout was nie ʼn ineenstorting nie; dit was drie programme wat elkeen volkome korrek opgetree het in ʼn wêreld wat hulle verkeerd gehad het.

Die oplossing was om glad nie meer ewekniges te ontdek nie

Hier is die herformulering wat die hele ding tot ʼn paar reëls laat ineenstort het: ons was besig om, met ʼn praatlustige protokol, ʼn feit te herbou wat die platform reeds vir ons stoor met sterk konsekwentheid. Ons loop op ʼn wolk wat vir ons ʼn sterk-konsekwente stoor gee. Leierverkiesing het nie konsensus tussen ewekniges nodig as daar reeds een plek is waaroor almal kan saamstem nie.

So het leierskap ʼn blob lease geword. Een blob, een lease. Wie ook al die lease hou, is die leier. Die lease het ʼn tydsverstryking, so ʼn leier wat sterf, hou op om te hernu en die lease maak homself vry vir die volgende nemer. Daar is geen eweknie-ontdekking nie, geen quorum-rekenkunde nie, geen multicast nie, en geen catch-blok wat wag om dit af te skakel nie. Koördinasie en gebeurtenisse ry op ʼn klein tabel wat as ʼn bus tussen die nodes optree.

Die eienskap wat ek nie verwag het om lief te hê nie: jy kan Storage Explorer oopmaak en die tros se gees sien. Wie tans die lease hou. Wat op die bus in die tou staan. Lidmaatskap het opgehou om iets te wees wat jy aflei uit ʼn protokol se gedrag, en het ʼn ry geword wat jy kan lees. Wanneer die ding wat besluit wie jou vernietigende take uitvoer ʼn waarde is waarna jy kan kyk, hou ontfouting op om argeologie te wees.

Die deel waar ons doelbewus ʼn slim ding uitgevee het

Terwyl ons daar was, het ons ʼn verspreide tempobeperker uitgevee wat op ʼn conflict-free replicated data type gebou is, ʼn CRDT wat per-node-tellers sonder koördinasie tot ʼn globale telling saamgevoeg het. Dit was werklik elegant. Dit het ook ʼn probleem opgelos wat ons verskuif het. Die globale tempolimiet hoort by die rand, waar versoeke aankom, nie binne die tros herbou met ʼn datastruktuur wat ʼn paragraaf nodig het om te verduidelik nie. Uit daarmee.

Om werkende kode uit te vee voel soos ʼn verlies totdat jy tel wat jy ophou onderhou. Ons het die gossip-laag, die multicast-aanname, die selfafskakelende catch-blok, en die CRDT verwyder, en alles vervang met ʼn lease en ʼn tabel. Die reëltelling het gedaal, en die aantal toestande waarin die stelsel kan wees, het saam daarmee gedaal.

Die les, uitgefaktoriseer

Gossip- en multicast-lidmaatskap is die regte gereedskap op bare metal of ʼn plat netwerk wat jy beheer. Hulle is die verkeerde gereedskap op ʼn platform waarvan die netwerk juis die meganisme nie dra waarvan hulle afhang nie, en die falingsmodus is nie ʼn harde ineenstorting nie; dit is ʼn stil terugval wat lyk asof dit werk. Voordat jy ʼn verspreide-stelselspatroon na bestuurde infrastruktuur oordra, vra wat dit oor die netwerk veronderstel, en vra wat die platform reeds gratis vir jou gee. Ons s'n het reeds ʼn sterk-konsekwente stoor geloop. ʼn Lease in daardie stoor was ʼn eenvoudiger, meer korrekte leierverkiesing as die protokol wat ons rondgedra het, en dit is een wat ons kan dophou.

As jy auth bedryf, behoort die dele wat jou sleutels hou en besluit wie jou vernietigende take uitvoer die vervelendste en die mees inspekteerbare dinge te wees wat jy besit. Ons het ons s'n vervelend gemaak. Dit was ʼn opgradering.