Hopp til innhold

Datalagring

å lagre data, eller mediet som holder dem, for senere lesing

Hva det er

Datalagring, til daglig ofte bare kalt lagring, er det laget i et system der data blir liggende mellom hver gang de brukes, på medier som tar vare på dem gjennom en omstart og et strømbrudd. NIST-ordlisten gir ordet to betydninger, begge hentet fra SP 800-88r2: at data oppbevares slik at de kan hentes fram igjen, og maskinvaren som data kan skrives inn på og leses ut fra.

Hver form for lagring hviler på et fysisk medium: en harddisk med roterende plater, en SSD, et SD-kort, et bånd. Programvaren ser ett av tre lag over det:

  • Blokklagring viser en enhet som en rekke blokker av fast størrelse, adressert med nummer. En diskpartisjon, et RAID-oppsett og en virtuell disk i skyen ser alle slik ut for systemkjernen, og et filsystem eller en databasemotor avgjør hva blokkene betyr.
  • Fillagring legger et filsystem over de blokkene: navn, mapper, størrelser, eiere og rettigheter, og en fil kan endres noen få byte om gangen. Delt over NFS eller SMB kan ett tre betjene mange maskiner.
  • Objektlagring holder hele objekter, hvert av dem en rekke byte med metadata, under et navn i en beholder, og nås gjennom et HTTP-API i stedet for å monteres. Google Cloud Storage lagrer data som objekter i beholdere som kalles bøtter (buckets), hver bøtte hører til et prosjekt, og et objekt er en uforanderlig bit data som består av en fil i et hvilket som helst format.

De tre går hver sin vei når det gjelder hva en endring koster. En blokkenhet skriver om én blokk der den står. Et filsystem endrer en del av en fil og flytter den med et navnebytte. Et objektlager erstatter hele objektet: Googles side om objekter utelukker både å legge til på slutten og å kutte et objekt kortere, og en erstatning er atomisk, så lesere får den gamle versjonen helt til den nye opplastingen er ferdig. Et navnebytte blir en kopi under det nye navnet og en sletting av originalen. I en bøtte med flatt navnerom er mapper et bilde verktøyene tegner ut fra skråstrekene i objektnavnene. Strengen folder1/ er en del av navnet, og bøtta lagrer ingen mappe i det hele tatt.

Den samme filen ser slik ut på hvert av lagene:

# block: the kernel's view of a disk as numbered blocks
lsblk /dev/sda

# file: a filesystem mounted over those blocks, with names and directories
df -h /srv

# object: a whole object sent to a bucket over an API
gcloud storage cp readings.csv.gz gs://example-bucket/2024/01/

Hvorfor det er viktig

Mediet avgjør hvordan data går tapt. En harddisk, en SSD og et SD-kort svikter hver på sin måte, og en gjenopprettingsmetode som passer for det ene, er feil verktøy for det neste. Redundans inne i én boks, som et speilet diskpar eller et RAID-oppsett, holder data lesbare etter at én disk dør, men den skriver hver sletting til hver disk like trofast som den skriver dataene.

Holdbarhet og tilgjengelighet er to forskjellige løfter. Holdbarhet er sjansen for at lagrede data overlever, og tilgjengelighet er sjansen for at de kan leses i et gitt øyeblikk. Cloud Storage oppgir en årlig holdbarhet på 99,999999999 % for hver lagringsklasse, mens den typiske månedlige tilgjengeligheten tjenesten gir, går fra 99,9 % til over 99,99 %, avhengig av klasse og plassering. En lagringsklasse er metadata på hvert objekt som bestemmer tilgjengeligheten og prismodellen, og nye objekter arver standardklassen til bøtta si. De kaldere klassene gir en lavere pris for å oppbevare data og tar betalt på andre måter: litt lavere tilgjengelighet, en minste lagringstid på 30, 90 eller 365 dager og en avgift for å lese dataene tilbake. Google retter dem mot data som leses én gang i måneden eller sjeldnere, høyst én gang i kvartalet og sjeldnere enn én gang i året.

Plassering er en del av dataene. En kopi på den samme disken, den samme maskinen eller i den samme skykontoen deler skjebne med den disken, maskinen eller kontoen, og en kopi et annet sted gjør det ikke. Plasseringen styrer også fart og kostnad: Google påpeker at data som ligger i samme region som datakraften som bruker dem, gir best ytelse for dataintensivt arbeid og kan gi lavere nettverkskostnader.

Måten programvaren når lagringen på, former resten. Restic, et program for sikkerhetskopiering, definerer sikkerhetskopirepoet sitt som ganske enkelt en mappe med et sett undermapper og filer, og den samme mappen kan ligge på en lokal disk, på en server som nås over SFTP, eller i et objektlager som Google Cloud Storage eller Amazon S3. Bytene er de samme, mens latensen, måtene ting svikter på og hvem som styrer kontoen, alle endrer seg.

Slik ser det ut i praksis

Nedenfra og opp i stakken har arbeidet berørt det fysiske mediet som svikter, objektlageret som flytter hele filer, og kopien hos en annen leverandør som gjør det mulig å overleve tapet av en vert.

Mediet: datagjenoppretting ble utført på så å si alle vanlige lagringstyper, fra SD-kort og roterende harddisker til SSD-er, RAID-oppsett, eksterne disker og Mac-systemer. Folk kom med lagringsmedier som hadde sviktet eller tatt skade, og som holdt bilder, forretningsfiler eller den eneste kopien av noe som betydde noe. Hvert medium svikter og gir fra seg dataene sine på sin egen måte: en SSD er et annet problem enn en disk med plater, et RAID-oppsett er et annet problem igjen, og et filsystem på en Mac har sine egne særheter. Å kjenne riktig framgangsmåte for akkurat det mediet betydde like mye som noen enkelt teknikk, og kundene fikk tilbake kritiske data fra enheter de allerede hadde avskrevet.

Objektlageret: i seks ETL/ELT-pipeliner som matet Google BigQuery, stod en bøtte i Google Cloud Storage mellom kilden og datavarehuset. Kuraterte datasett og tabeller ble eksportert til mellomformater, komprimert med gzip og overført til bøtta, og derfra lastet bq CLI og Python-skript dem inn i BigQuery. Hele komprimerte filer gikk inn, og hele filer kom ut, akkurat det mønsteret objektlagring er bygd for.

Kopien et annet sted: restic sender nå krypterte sikkerhetskopier over SFTP til en annen leverandør. Før det lå alt selskapet har, på én skyinstans der leverandørens øyeblikksbilde var hele gjenopprettingsberedskapen. Det øyeblikksbildet lå i den samme kontoen som maskinen det beskyttet, ingen i selskapet hadde kryptert det, og ingen hadde noen gang gjenopprettet noe fra et slikt bilde. Nå kjører en systemd-timer en databasedump der det finnes en database, et kryptert og deduplisert øyeblikksbilde til den andre leverandøren, en opprydding etter oppbevaringsregelen og en integritetssjekk. Én gang i måneden hentes én kjent fil tilbake fra lagringen hos den andre leverandøren og sammenlignes, og det beviser at den eksterne kopien kan leses tilbake og ikke bare skrives. Med kopien hos en annen leverandør kan selskapet miste verten og likevel få dataene sine tilbake.

Hvor det går galt

Lagring svikter sjelden der noen ser etter. Som regel er det en kopi, en sjekk eller en kostnad som virket i orden fram til dagen den ble satt på prøve.

En kopi som deler skjebne med originalen. Et øyeblikksbilde i den samme kontoen, en sikkerhetskopi på den samme disken, en replika i den samme bygningen: hver av dem overlever de små feilene og går under med den store. Skriv opp hver enkelthendelse som kan ta med seg begge, og flytt én kopi til listen er kort.

Redundans som telles som en sikkerhetskopi. Et speil kopierer hver skriving til hver disk, slettinger og korrupte data inkludert. Det redder deg fra en død disk. En egen kopi med sin egen historikk er det som redder deg fra en feil.

Et objektlager som behandles som et filsystem. Kode skrevet for filer regner med billige navnebytter og raske mappelister. I en bøtte med flatt navnerom er et navnebytte en kopi pluss en sletting, og Google påpeker at dypt nestede, mappelignende strukturer mangler listeytelsen til et ekte filsystem. Legg opp objektnavnene etter måten de skal leses på, og hold arbeid som endrer filer der de står, på fil- eller blokklagring.

En sjekk som leser indeksen og hopper over dataene. Som standard sjekker restic-kommandoen check strukturen i sikkerhetskopirepoet og lar pakkefilene som holder de sikkerhetskopierte dataene, ligge uleste, fordi det å lese dem betyr å laste ned hver eneste en. --read-data leser alle, og --read-data-subset=1/5 til og med 5/5 dekker dem alle over fem kjøringer. En sjekk som bare lister filer, beviser at navnene finnes, og sier lite om bytene bak dem.

En kald klasse som holder varme data. En fil som leses daglig fra en klasse priset for månedlige lesinger, betaler en avgift hver gang den leses, så velg klassen etter lesemønsteret dataene faktisk har.

Les mer

Ordliste