{"id":21,"date":"2026-06-24T22:00:00","date_gmt":"2026-06-24T20:00:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/klustret-och-kabeln\/"},"modified":"2026-06-24T22:00:00","modified_gmt":"2026-06-24T20:00:00","slug":"klustret-och-kabeln","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/klustret-och-kabeln\/","title":{"rendered":"Klustret som h\u00e4ngde sig: fem mjukvarufel som alla var fel svar"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Tv\u00e5 nya servrar skulle bli ett kluster. Installationen gick perfekt, noderna s\u00e5g varandra, och klustret gick att skapa. Sedan h\u00e4ngde sig den ena.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Inte kraschade \u2014 <em>h\u00e4ngde<\/em>. Sm\u00e5 skrivningar till klustrets delade konfigurationsfilsystem gick igenom. Stora skrivningar blev st\u00e5ende, i det tillst\u00e5nd d\u00e4r en process varken kan forts\u00e4tta eller avbrytas. Samma nod var fullst\u00e4ndigt frisk s\u00e5 l\u00e4nge den stod ensam.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Allt pekade p\u00e5 mjukvaran<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ett kluster som fungerar utom n\u00e4r det anv\u00e4nds \u00e4r en tacksam felk\u00e4lla att gissa om, och jag gissade i tur och ordning p\u00e5 allt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Paketf\u00f6rlust?<\/strong> Fl\u00f6destest mellan noderna gav 0,1 procent. Inte bra, inte alls illa nog.<\/li>\n<li><strong>Disken?<\/strong> Skrivtest rakt mot lagringen: fullt normal hastighet.<\/li>\n<li><strong>Minnet?<\/strong> Friskt.<\/li>\n<li><strong>Databasen med klusterkonfigurationen?<\/strong> Integritetskontroll utan anm\u00e4rkning.<\/li>\n<li><strong>N\u00e4tverkskortets avlastningsfunktioner?<\/strong> D\u00e4r fanns faktiskt n\u00e5got \u2014 en k\u00e4nd bugg i den kortfamiljen kan korrumpera paket n\u00e4r kortet sj\u00e4lvt r\u00e4knar checksummor. Avlastningen st\u00e4ngdes av permanent, som en tj\u00e4nst som k\u00f6r innan klusterkommunikationen startar.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Det hj\u00e4lpte inte. Klustret l\u00f6stes upp till tv\u00e5 frist\u00e5ende noder \u2014 b\u00e5da fungerade felfritt igen \u2014 och problemet l\u00e4mnades \u00f6ver natten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Siffran som hade legat framf\u00f6r mig hela tiden<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e4sta dag tittade jag p\u00e5 n\u00e5got jag borde tittat p\u00e5 f\u00f6rst: vad l\u00e4nken faktiskt f\u00f6rhandlade fram.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Den ena noden satt p\u00e5 en gigabitport och k\u00f6rde gigabit. Den andra satt p\u00e5 en gigabitport och k\u00f6rde <strong>100 megabit<\/strong>. B\u00e5da sidor \u2014 switchen och n\u00e4tverkskortet \u2014 var \u00f6verens om att 100 var det b\u00e4sta de kunde erbjuda.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tv\u00e5 gigabitkapabla enheter som sj\u00e4lvmant n\u00f6jer sig med 100 megabit betyder n\u00e4stan alltid en sak: <strong>kabeln har bara tv\u00e5 fungerande tr\u00e5dpar.<\/strong> Gigabit kr\u00e4ver fyra. Med tv\u00e5 par fungerar l\u00e4nken utm\u00e4rkt \u2014 den blir bara tio g\u00e5nger l\u00e5ngsammare, och ingenting rapporterar ett fel, f\u00f6r det <em>\u00e4r<\/em> inget fel. Det \u00e4r en korrekt f\u00f6rhandling utifr\u00e5n usla f\u00f6ruts\u00e4ttningar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kabeln byttes. Klustret byggdes om fr\u00e5n grunden. Noll oms\u00e4ndningar, delat filsystem i synk, stora skrivningar direkt igenom. Migrering av en virtuell maskin mellan noderna kopierade disken i full gigabithastighet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Varf\u00f6r just stora skrivningar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det f\u00f6rklarar ocks\u00e5 varf\u00f6r symptomet var s\u00e5 egendomligt selektivt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Klusterkommunikationen anv\u00e4nder ett protokoll som skickar meddelanden i en sluten ring med garanterad ordning. Sm\u00e5 meddelanden f\u00e5r plats i ett paket och kom fram. Stora skrivningar delas upp i m\u00e5nga paket som m\u00e5ste anl\u00e4nda i r\u00e4tt ordning inom en tidsgr\u00e4ns \u2014 och en l\u00e4nk p\u00e5 en tiondel av f\u00f6rv\u00e4ntad kapacitet, delad med annan trafik, missar den gr\u00e4nsen. Protokollet g\u00f6r d\u00e5 det enda r\u00e4tta: det v\u00e4ntar, i st\u00e4llet f\u00f6r att riskera att noderna f\u00e5r olika bild av verkligheten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e5 det som s\u00e5g ut som en h\u00e4ngning var i sj\u00e4lva verket ett korrekt fungerande skyddsmekanism som gjorde sitt jobb mot en trasig f\u00f6ruts\u00e4ttning.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Det tredje r\u00f6stkortet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En detalj som \u00e4r v\u00e4rd att ta med f\u00f6r den som bygger ett kluster med bara tv\u00e5 noder: tv\u00e5 \u00e4r ett d\u00e5ligt antal. Faller den ena vet den kvarvarande inte om kompisen \u00e4r d\u00f6d eller om den sj\u00e4lv blivit isolerad, och den v\u00e5gar d\u00e4rf\u00f6r inte forts\u00e4tta ensam.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00f6sningen \u00e4r en tredje r\u00f6st som inte beh\u00f6ver vara en server. H\u00e4r fick en liten enkortsdator som redan stod och gjorde annat agera skiljedomare. Den lagrar ingenting och k\u00f6r inga laster \u2014 den finns bara d\u00e4r f\u00f6r att kunna s\u00e4ga vem som har r\u00e4tt. Med den p\u00e5 plats \u00f6verlever klustret att en nod f\u00f6rsvinner.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">S\u00e5 vet du att det funkar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>L\u00e4s av l\u00e4nkhastigheten p\u00e5 varje port, varje g\u00e5ng.<\/strong> Det \u00e4r en rad utdata och den utesluter en hel felklass. Jag hoppade \u00f6ver det i ett dygn f\u00f6r att problemet &#8221;uppenbart&#8221; l\u00e5g i mjukvaran.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Testa med volym, inte med ping.<\/strong> Ett ping-test som visar 0,1 procent f\u00f6rlust ger falsk trygghet. Flytta en virtuell maskin mellan noderna och m\u00e4t hastigheten \u2014 det \u00e4r det n\u00e4rmaste ett verkligt arbetsprov man kommer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>St\u00e4ng av en nod med flit<\/strong> och kontrollera att den andra forts\u00e4tter fungera. Ett kluster som aldrig testats i den situationen \u00e4r ett kluster med ok\u00e4nt beteende i exakt det \u00f6gonblick det ska bevisa sitt v\u00e4rde.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jag \u00e4r van vid att fel sitter i mjukvaran, f\u00f6r det g\u00f6r de n\u00e4stan alltid. Den vanan gjorde att jag utesl\u00f6t fem programvarurelaterade orsaker innan jag tittade p\u00e5 ett v\u00e4rde som fysiska lagret skrek ut hela tiden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det finns en l\u00e4xa i det som g\u00e4ller bortom n\u00e4tverkskablar: <strong>n\u00e4r ett system beter sig om\u00f6jligt, kontrollera antagandena innan du fels\u00f6ker slutsatserna.<\/strong> &#8221;L\u00e4nken \u00e4r gigabit&#8221; var ett antagande. Det tog tjugo sekunder att kontrollera och kostade ett dygn att l\u00e5ta bli.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Och s\u00e5 det som \u00e4r sv\u00e5rt att erk\u00e4nna: en agent hade inte heller hittat det h\u00e4r snabbare. Den letade d\u00e4r jag bad den leta, kompetent och uth\u00e5lligt, i mjukvaran. Ingen av oss st\u00e4llde fr\u00e5gan om kabeln \u2014 f\u00f6r att fr\u00e5gan om kabeln inte finns i loggarna. Den finns i verkligheten.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Sm\u00e5 skrivningar gick igenom, stora h\u00e4ngde sig. Jag utesl\u00f6t fem mjukvaruorsaker innan jag l\u00e4ste av n\u00e5got som fysiska lagret skrikit ut hela tiden.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-21","post","type-post","status-publish","format-standard","hentry","category-nat-och-sakerhet"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/21","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":0,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}