Hoppa till innehållet

Lagring

att spara data, eller medier som bär dem, för senare läsning

Vad det är

Datalagring, oftast kallad bara lagring, är den del av ett system där data finns mellan användningarna, på medier som behåller dem genom en omstart och ett strömavbrott. Ordlistan hos NIST ger ordet två betydelser, båda hämtade från SP 800-88r2: att data bevaras så att de kan hämtas igen, och den hårdvara som data kan föras in i och hämtas ur.

Varje sort vilar på ett fysiskt medium: en hårddisk med snurrande skivor, en SSD, ett SD-kort, ett band. Programvaran ser ett av tre lager ovanpå det:

  • Blocklagring visar en enhet som en följd av block med fast storlek, adresserade med nummer. En diskpartition, en RAID-array och en virtuell disk i molnet ser alla ut så för systemkärnan, och ett filsystem eller en databasmotor avgör vad blocken betyder.
  • Fillagring lägger ett filsystem över blocken: namn, kataloger, storlekar, ägare och behörigheter, och en fil kan ändras några byte i taget. Delat över NFS eller SMB betjänar ett och samma träd många maskiner.
  • Objektlagring håller hela objekt, vart och ett en följd av byte plus metadata, under ett namn i en behållare, och nås genom ett API över HTTP i stället för genom en montering. Google Cloud Storage lagrar data som objekt i behållare som kallas buckets, varje bucket hör till ett projekt, och ett objekt är en oföränderlig bit data som består av en fil i vilket format som helst.

De tre skiljer sig åt i vad en ändring kostar. En blockenhet skriver om ett block där det ligger. Ett filsystem redigerar en del av en fil och flyttar den med ett namnbyte. Ett objektlager ersätter hela objektet: Googles sida om objekt utesluter tillägg i slutet och avkortning, och en ersättning är atomär, så den som läser får den gamla versionen tills den nya uppladdningen är klar. Ett namnbyte blir en kopia under det nya namnet och en radering av originalet. I en bucket med platt namnrymd är mappar en bild som verktygen ritar upp utifrån snedstreck i objektens namn; strängen folder1/ är en del av namnet, och bucketen lagrar ingen mapp alls.

Samma fil ser ut så här i varje lager:

# block: kärnans bild av en disk som numrerade block
lsblk /dev/sda

# fil: ett filsystem monterat över blocken, med namn och kataloger
df -h /srv

# objekt: ett helt objekt som skickas till en bucket över ett API
gcloud storage cp readings.csv.gz gs://example-bucket/2024/01/

Varför det spelar roll

Mediet avgör hur data går förlorade. En hårddisk, en SSD och ett SD-kort går sönder vart och ett på sitt sätt, och en räddningsmetod som passar det ena är fel verktyg för nästa. Redundans inuti en och samma låda, som ett speglat par eller en RAID-array, håller data läsbara efter att en enskild disk har dött, men den skriver varje radering till varje disk lika troget som den skriver data.

Hållbarhet och tillgänglighet är två skilda löften. Hållbarhet är sannolikheten att lagrade data överlever; tillgänglighet är sannolikheten att de går att läsa vid ett givet ögonblick. Cloud Storage anger en årlig hållbarhet på 99,999999999 % för varje lagringsklass, medan den typiska tillgänglighet per månad som tjänsten anger går från 99,9 % till över 99,99 %, beroende på klass och plats. En lagringsklass är metadata på varje objekt som bestämmer dess tillgänglighet och prismodell, och nya objekt ärver standardklassen i sin bucket. De kallare klasserna byter ett lägre pris för att behålla data mot något lägre tillgänglighet, en minsta lagringstid på 30, 90 eller 365 dagar och en avgift för att läsa tillbaka data; Google riktar dem mot data som läses en gång i månaden eller mer sällan, högst en gång per kvartal och mindre än en gång per år.

Platsen är en del av datan. En kopia på samma disk, samma maskin eller samma molnkonto delar öde med den saken, och en kopia någon annanstans gör det inte. Platsen bestämmer också hastighet och kostnad: Google noterar att om data hålls i samma region som den beräkning som använder dem får dataintensivt arbete bäst prestanda, och nätverksavgifterna kan bli lägre.

Hur programvaran når lagringen formar resten. Restic, ett program för säkerhetskopiering, definierar sitt repo som helt enkelt en katalog som innehåller en uppsättning underkataloger och filer, och samma katalog kan ligga på en lokal disk, på en server som nås över SFTP eller i ett objektlager som Google Cloud Storage eller Amazon S3. Innehållet förblir detsamma, medan latensen, sätten att gå sönder och den person som styr kontot alla ändras.

Så ser det ut i praktiken

Lagringen här spänner över tre nivåer: själva mediet, från SD-kort till RAID-arrayer, ett objektlager i molnet och till sist en krypterad kopia som ligger hos en annan leverantör.

Mediet: dataräddningen omfattade i stort sett alla vanliga lagringstyper, från SD-kort och snurrande hårddiskar till SSD:er, RAID-arrayer, externa diskar och Mac-system. Folk kom in med lagringsmedier som hade gått sönder eller skadats, med foton, affärsdokument, den enda kopian av något som betydde något. Varje medium går sönder och lämnar ifrån sig sina data på sitt eget sätt: en SSD är ett annat problem än en disk med roterande skivor, en RAID-array är ännu ett annat problem, och ett Mac-filsystem har sina egna egenheter. Att veta vilket angreppssätt som passar just det mediet betydde lika mycket som någon enskild teknik, och kunderna fick tillbaka kritiska data från enheter som de redan hade avskrivit som förlorade.

Objektlagret: i sex ETL/ELT-pipelines som matade Google BigQuery stod en bucket i Google Cloud Storage mellan källan och analysdatalagret. Kurerade dataset och tabeller exporterades till mellanformat, komprimerades med gzip och överfördes till bucketen, och därifrån läste verktyget bq och Python-skript in dem i BigQuery. Hela komprimerade filer gick in och hela filer kom ut, det mönster som objektlagring är byggd för.

Kopian någon annanstans: krypterade säkerhetskopior med restic gick över SFTP till lagring hos en annan leverantör. Dessförinnan låg allt som företaget har på en enda molninstans, vars ögonblicksbild hos leverantören var hela återställningsberedskapen: ögonblicksbilden låg i samma konto som maskinen den skyddade, ingen på företaget hade krypterat den, och ingen hade någonsin återställt något från en sådan. En timer i systemd kör nu en databasdump där det finns en databas, en krypterad och deduplicerad ögonblicksbild till den andra leverantören, en gallring enligt bevarandepolicyn och en integritetskontroll. Varje månad tar en återställningsövning tillbaka en fil med känt innehåll ur repot hos den leverantören och jämför den. Med kopian hos en andra leverantör kan företaget förlora värden och ändå få tillbaka sina data.

Var det går fel

Det mesta besväret med lagring kommer från en kopia, en kontroll eller en kostnad som såg bra ut fram till den dag den behövdes.

En kopia delar öde med originalet. En ögonblicksbild i samma konto, en säkerhetskopia på samma disk, en replik i samma byggnad: var och en överlever de små felen och går under med det stora. Lista de enskilda händelser som skulle kunna slå ut båda, och flytta en kopia tills listan är kort.

Redundans räknas som en säkerhetskopia. En spegel kopierar varje skrivning till varje disk, raderingar och korrupta data inräknade. Den är svaret på en död disk; en separat kopia med en egen historik är svaret på ett misstag.

Ett objektlager behandlas som ett filsystem. Kod som är skriven för filer räknar med billiga namnbyten och kataloglistningar. I en bucket med platt namnrymd är ett namnbyte en kopia plus en radering, och Google noterar att djupt nästlade, katalogliknande strukturer saknar listningsprestandan hos ett riktigt filsystem. Lägg upp objektnamnen efter hur de kommer att läsas, och håll arbete som redigerar filer på plats kvar i fil- eller blocklagring.

Kontrollen läser indexet och hoppar över datan. Som standard verifierar kommandot check i restic repots struktur och lämnar de packfiler som håller de säkerhetskopierade data olästa, eftersom det skulle innebära att ladda ned varenda en. --read-data läser alla, och --read-data-subset=1/5 till och med 5/5 täcker repot på fem körningar. En kontroll som bara listar filer bevisar att namnen finns, och säger lite om innehållet bakom dem.

Data som läses ofta ligger i en kall klass. En fil som läses varje dag från en klass som är prissatt för läsningar en gång i månaden betalar en avgift vid varje läsning, så matcha klassen mot det läsmönster som datan faktiskt har.

Läs mer

Ordlista