{"id":24,"date":"2026-08-02T11:00:00","date_gmt":"2026-08-02T09:00:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/?p=24"},"modified":"2026-08-02T16:15:13","modified_gmt":"2026-08-02T14:15:13","slug":"backupfonstret","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/backupfonstret\/","title":{"rendered":"Backupf\u00f6nstret som gick fr\u00e5n tre och en halv timme till fyra minuter"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u00d6vervakningen mejlade om h\u00f6g disklatens sex g\u00e5nger per dygn. F\u00f6rsta impulsen var att d\u00e4mpa larmet \u2014 flytta den niv\u00e5n till chatten och l\u00e5t bara det allvarliga g\u00e5 till mejl.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det var r\u00e4tt \u00e5tg\u00e4rd f\u00f6r mejlkorgen och fel \u00e5tg\u00e4rd f\u00f6r problemet. Larmen var n\u00e4mligen sanna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad som l\u00e5g bakom<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Varje natt klockan halv fyra startade s\u00e4kerhetskopieringen av de virtuella maskinerna. Den skrev till en n\u00e4tverksdisk p\u00e5 en <em>annan ort<\/em>, \u00f6ver en krypterad tunnel med nitton millisekunders f\u00f6rdr\u00f6jning, och monteringen var inst\u00e4lld p\u00e5 att v\u00e4nta p\u00e5 bekr\u00e4ftelse f\u00f6r varje skrivning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det sista \u00e4r hela historien. Med synkron skrivning betalar man f\u00f6rdr\u00f6jningen om och om igen, f\u00f6r varje block, i st\u00e4llet f\u00f6r att l\u00e5ta trafiken flyta. Resultatet blev \u00e5tta till tjugo megabyte i sekunden \u2014 och en enskild maskin p\u00e5 \u00e5ttio gigabyte tog <strong>tv\u00e5 timmar och trettio\u00e5tta minuter<\/strong>. Hela jobbet h\u00f6ll p\u00e5 fr\u00e5n halv fyra till sju p\u00e5 morgonen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Under det f\u00f6nstret k\u00f6ade all annan l\u00e4sning mot samma disk. Diskarna var friska hela tiden: sj\u00e4lvtest godk\u00e4nt, nitton procent slitage, noll fel. Det var inte h\u00e5rdvaran som var tr\u00f6tt. Det var k\u00f6n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e4tningen som avgjorde<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tre v\u00e4gar fanns. Ta bort kravet p\u00e5 synkron skrivning \u2014 snabbt, men man byter bort garantin att en skrivning verkligen ligger p\u00e5 disk. Kopiera lokalt och replikera i efterhand. Eller byta ut filkopieringen mot en riktig backupserver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ett test avgjorde saken. En befintlig backupserver p\u00e5 \u00e4nnu <em>l\u00e4ngre<\/em> avst\u00e5nd \u2014 tjugofem millisekunder \u2014 gav <strong>3,7 g\u00e5nger h\u00f6gre hastighet<\/strong> \u00e4n den n\u00e4rmare n\u00e4tverksdisken.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det \u00e4r kontraintuitivt tills man ser varf\u00f6r: en backupserver skickar komprimerade block asynkront och bekr\u00e4ftar i efterhand, medan filprotokollet med synkron montering v\u00e4ntar p\u00e5 varje skrivning. <strong>Protokollet spelade st\u00f6rre roll \u00e4n avst\u00e5ndet.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e4sta fr\u00e5ga blev var backupen skulle ligga. En liten enkortsdator med en USB-disk fanns p\u00e5 plats och verkade sj\u00e4lvklar \u2014 tills den m\u00e4ttes: hundra megabits n\u00e4tverk, och n\u00e4tverkskort och USB-disk p\u00e5 samma buss. Taket hade blivit elva megabyte i sekunden, allts\u00e5 <em>s\u00e4mre<\/em> \u00e4n det vi f\u00f6rs\u00f6kte komma ifr\u00e5n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det \u00e4r v\u00e4rt att s\u00e4ga rakt ut: den insikten kostade tio minuters m\u00e4tning och sparade en helg av besvikelse. Att gissa hade k\u00e4nts snabbare.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L\u00f6sningen, och den lilla detaljen som betydde mest<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Backupservern lades i en virtuell maskin p\u00e5 klustret sj\u00e4lvt, med sitt lager p\u00e5 en virtuell disk som i sin tur ligger p\u00e5 en n\u00e4tverksdisk \u00f6ver gigabit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Skillnaden mot att l\u00e5ta backupservern montera n\u00e4tverksdisken direkt \u00e4r avg\u00f6rande. En backupserver som delar upp data i tusentals sm\u00e5 block vill g\u00f6ra det mot ett lokalt filsystem \u2014 inte \u00f6ver ett n\u00e4tverksprotokoll, d\u00e4r varje blockoperation blir en f\u00f6rfr\u00e5gan \u00f6ver n\u00e4tet. Genom att l\u00e4gga n\u00e4tverkslagret <em>under<\/em> den virtuella disken ser backupservern ett vanligt lokalt filsystem, och n\u00e4tverket f\u00e5r hantera stora sekventiella block i st\u00e4llet f\u00f6r myriader av sm\u00e5.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Samma h\u00e5rdvara, samma n\u00e4t, helt annat resultat \u2014 beroende p\u00e5 vilket lager som g\u00f6r vad.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Resultatet<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Maskin<\/th><th>F\u00f6rut<\/th><th>Efter<\/th><\/tr><\/thead><tbody>\n<tr><td>20 GB<\/td><td>17 minuter<\/td><td><strong>39 sekunder<\/strong><\/td><\/tr>\n<tr><td>80 GB<\/td><td>2 h 38 min<\/td><td><strong>4,5 minuter<\/strong><\/td><\/tr>\n<tr><td>20 GB, andra k\u00f6rningen<\/td><td>\u2014<\/td><td><strong>1 sekund<\/strong><\/td><\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Den sista raden \u00e4r inte ett skrivfel. En backupserver som delar upp data i block k\u00e4nner igen block den redan har och skickar bara det som \u00e4ndrats. Andra k\u00f6rningen av en maskin som st\u00e5tt still g\u00f6r i praktiken ingenting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Backupf\u00f6nstret gick fr\u00e5n tre och en halv timme till n\u00e5gra minuter. Larmen om disklatens upph\u00f6rde \u2014 inte f\u00f6r att de tystades, utan f\u00f6r att orsaken f\u00f6rsvann.<\/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\">Snabb backup \u00e4r v\u00e4rdel\u00f6s om den inte g\u00e5r att l\u00e4sa tillbaka. Tre kontroller, i den ordningen:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u00c5terst\u00e4ll en maskin p\u00e5 riktigt<\/strong> till en annan plats och starta den. Inte &#8221;verifiera arkivet&#8221; \u2014 starta den.<\/li>\n<li><strong>Kontrollera att kopian ligger n\u00e5gon annanstans \u00e4n originalet.<\/strong> En snabb lokal backup som brinner upp tillsammans med servern \u00e4r en snabbhets\u00f6vning, inte en s\u00e4kerhetskopia.<\/li>\n<li><strong>Titta p\u00e5 hur l\u00e5ng tid jobbet tar \u00f6ver tid.<\/strong> Ett f\u00f6nster som v\u00e4xer i det tysta \u00e4r det tidigaste tecknet p\u00e5 att n\u00e5got b\u00f6rjat g\u00e5 fel \u2014 precis som h\u00e4r.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ett \u00e5terkommande larm \u00e4r information, inte oljud.<\/strong> Sex mejl om dagen i m\u00e5nader hade varit l\u00e4tta att filtrera bort. De beskrev ett verkligt problem som v\u00e4xte i takt med att maskinerna blev fler.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>M\u00e4t innan du v\u00e4ljer.<\/strong> Tv\u00e5 av tre antaganden i den h\u00e4r historien var fel: att kortare avst\u00e5nd ger snabbare backup, och att den lilla datorn med disken skulle duga. B\u00e5da k\u00e4ndes sj\u00e4lvklara. B\u00e5da f\u00f6ll p\u00e5 tio minuters m\u00e4tning.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Och den obekv\u00e4ma:<\/strong> jag hade byggt en backup som fungerade i flera \u00e5r utan att n\u00e5gon g\u00e5ng fr\u00e5ga vad den <em>kostade<\/em> under tiden den k\u00f6rdes. Den blev aldrig ett problem f\u00f6r backupen \u2014 den blev ett problem f\u00f6r allt annat som ville anv\u00e4nda disken samtidigt.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Larmen om disklatens var sanna. Bakom dem l\u00e5g en nattlig backup som betalade n\u00e4tverkets f\u00f6rdr\u00f6jning f\u00f6r varje skrivning \u2014 och tv\u00e5 antaganden som f\u00f6ll p\u00e5 tio minuters m\u00e4tning.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-24","post","type-post","status-publish","format-standard","hentry","category-drift"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/24","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=24"}],"version-history":[{"count":1,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/24\/revisions"}],"predecessor-version":[{"id":25,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/24\/revisions\/25"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=24"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=24"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=24"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}