Categories
Database Backup

> Discover why standard VM snapshots cause data corruption in transactional databases like PostgreSQL and SQL Server. Learn DBA best practices for application-consistent backups, avoiding VM stun, and ensuring data integrity with CloudSave.

For DevOps-ingeniører og systemadministratorer er øyeblikksbilder (snapshots) av virtuelle maskiner (VM) et grunnleggende verktøy. De gir en rask og praktisk måte å fange tilstanden til en server før en risikabel oppdatering, en større konfigurasjonsendring eller en applikasjonsdistribusjon. Hvis noe går galt, tar det bare sekunder å rulle tilbake.

Men når den samme metoden brukes på transaksjonsdatabaser – som PostgreSQL, MySQL, Oracle eller Microsoft SQL Server – forvandles VM-snapshots fra et sikkerhetsnett til en tikkende tidsinnstilt bombe.

Å stole på standard hypervisor-snapshots for databasesikkerhetskopiering er en av de vanligste årsakene til datakorrupsjon, ødelagte sider (torn pages) og uopprettelige produksjonsavbrudd. I denne artikkelen vil vi utforske den arkitektoniske konflikten mellom hypervisorer og databasemotorer, mekanikken bak datakorrupsjon under snapshots, og beste praksis for ingeniørarbeid som kreves for å sikkerhetskopiere virtualiserte databaser på en trygg måte.

Arkitekturkonflikten: Hypervisorer vs. databasemotorer

For å forstå hvorfor VM-snapshots utgjør en fare for databaser, må vi først undersøke hvordan begge systemene håndterer tilstand og I/O-operasjoner.

Hvordan hypervisorer utfører snapshots

Når en hypervisor (som VMware ESXi, Microsoft Hyper-V eller KVM) tar et snapshot, kopierer den ikke disken. I stedet fryser den den nåværende virtuelle diskfilen (f.eks. .vmdk eller .vhdx) i en skrivebeskyttet tilstand og oppretter en ny deltadisk (differensieringsdisk). Alle påfølgende skriveoperasjoner blir dirigert til denne deltadisken.

Når snapshotet slettes, må hypervisoren «commit»-e (konsolidere) dataene fra deltadisken tilbake til basisdisken. Standard snapshots er fullstendig uvitende om applikasjonene som kjører inne i gjesteoperativsystemet. De fanger diskens tilstand nøyaktig slik den eksisterer i det mikrosekundet.

Hvordan transaksjonsdatabaser håndterer tilstand

Transaksjonsdatabaser er designet rundt ACID-egenskaper (Atomicity, Consistency, Isolation, Durability). For å oppnå høy ytelse samtidig som ACID-samsvar opprettholdes, skriver ikke databaser hver transaksjon direkte til de primære datafilene på disken umiddelbart. I stedet bruker de en kompleks arkitektur i flere lag:

  1. Buffer Pool / Shared Buffers: Data leses inn i og endres i systemminnet.
  2. Write-Ahead Log (WAL) / Redo Logs: Endringer skrives sekvensielt til en høyt optimalisert loggfil på disken for å sikre holdbarhet.
  3. Checkpoints / Lazy Writers: Med jevne mellomrom tømmer databasen de endrede (skitne) sidene fra minnet til de faktiske datafilene på disken.

På grunn av denne arkitekturen er de fysiske datafilene på disken nesten alltid ute av synkronisering med databasens faktiske tilstand. Databasens sanne tilstand eksisterer kun som en kombinasjon av datafilene på disken, WAL/Redo-loggene og dataene som for øyeblikket ligger i minnet.

Faresonen: Hva skjer under et VM-snapshot

Når du tar et standard VM-snapshot av en databaseserver, fanger du en krasj-konsistent tilstand.

Krasj-konsistens vs. applikasjonskonsistens

Et krasj-konsistent snapshot tilsvarer å trekke ut strømkabelen fra den fysiske serveren. Disktilstanden fanges opp, men alt som lå i minnet går tapt, og alt som var underveis til lagringskontrolleren blir brått avbrutt.

Selv om moderne databaser er designet for å gjenopprette fra uventet strømbrudd ved å spille av Write-Ahead-loggen, er det svært farlig å stole på krasjgjenoppretting som din primære sikkerhetskopieringsstrategi. Hvis databasen din spenner over flere virtuelle disker (f.eks. datafiler på Disk D: og WAL på Disk E:), kan det hende at hypervisoren ikke tar snapshot av begge diskene på nøyaktig samme mikrosekund. Hvis WAL-diskens snapshot fanges bare en brøkdel av et sekund etter snapshotet av datadisken, kan ikke databasen avstemme sekvensnumrene ved gjenoppretting, noe som resulterer i fatal korrupsjon.

«VM Stun»-effekten på systemer med mange transaksjoner

Prosessen med å opprette et snapshot – og enda viktigere, prosessen med å konsolidere snapshotet – forårsaker et fenomen kjent som «VM Stun».

For å trygt bytte I/O fra basisdisken til deltadisken, må hypervisoren kort pause (stune) den virtuelle maskinen. For en lett belastet webserver kan denne pausen vare i 10-50 millisekunder og gå ubemerket hen. Men for en database med høy gjennomstrømning og massiv I/O, kan konsolidering av en stor deltadisk «stune» VM-en i flere sekunder.

Under en VM-stun:
* Nettverkstilkoblinger brytes, noe som forårsaker tidsavbrudd (timeouts) i applikasjoner.
* Høy-tilgjengelighetsklynger (som SQL Server Always On, PostgreSQL Patroni eller MySQL Galera) går glipp av «heartbeat»-sjekker.
* Klyngen kan anta at den stunned noden er død, noe som utløser en unødvendig og forstyrrende failover (split-brain-scenario).

Ødelagte sider (Torn Pages) og I/O-feiljustering

Databasemotorer skriver vanligvis data i spesifikke sidestørrelser (f.eks. 8 KB for PostgreSQL og SQL Server, 16 KB for InnoDB). Det underliggende operativsystemet og lagringsmatrisene behandler imidlertid I/O i mindre blokker (f.eks. 4 KB eller 512 byte).

Hvis en hypervisor tar et snapshot nøyaktig mens databasen skriver en 8 KB-side, kan snapshotet fange de første 4 KB av de nye dataene og de siste 4 KB av de gamle dataene. Dette skaper en ødelagt side (torn page). Når du prøver å gjenopprette snapshotet, vil databasen lese siden, feile i kontrollsumvalideringen og markere databasen som korrupt.

Konsekvenser i den virkelige verden for spesifikke databasemotorer

Ulike databasemotorer reagerer på krasj-konsistente snapshots på ulike måter, men ingen av dem håndterer det elegant i et produksjonsmiljø.

  • PostgreSQL: PostgreSQL er sterkt avhengig av pg_wal-katalogen. Hvis et snapshot fanger datakatalogen ($PGDATA) og WAL-loggen ute av synkronisering, vil ikke PostgreSQL starte, og vil kaste en PANIC: could not locate a valid checkpoint record-feil.
  • MySQL/InnoDB: InnoDB bruker en «doublewrite buffer» for å forhindre ødelagte sider, noe som gir en viss beskyttelse mot krasj-konsistente tilstander. Men hvis ibdata1-filen og ib_logfile fanges ute av synkronisering, vil InnoDB-motoren krasje ved gjenoppretting.
  • Microsoft SQL Server: SQL Server er svært sensitiv for I/O-frysing. Uten riktig VSS-integrasjon (Volume Shadow Copy Service) vil gjenoppretting av en SQL Server fra et standard VM-snapshot ofte resultere i «suspect»-databaser og ødelagte loggkjeder, noe som ødelegger dine muligheter for Point-in-Time Recovery (PITR).

Beste praksis for sikker sikkerhetskopiering av virtualiserte databaser

For å beskytte transaksjonsdatabaser må du gå fra krasj-konsistente sikkerhetskopier til applikasjonskonsistente sikkerhetskopier. Dette krever at sikkerhetskopieringsmekanismen kommuniserer med databasemotoren, og tvinger den til å tømme minnet til disken og pause I/O-operasjoner et øyeblikk mens snapshotet tas.

1. Utnytt applikasjonsbevisst «quiescing» (VSS og fsfreeze)

For Windows (SQL Server):
Sørg alltid for at sikkerhetskopieringsløsningen din bruker Microsoft Volume Shadow Copy Service (VSS). Når en VSS-bevisst sikkerhetskopi utløses, fryser SQL Server VSS Writer database-I/O, tømmer ventende transaksjoner til disken og sikrer at snapshotet er perfekt applikasjonskonsistent.

For Linux (PostgreSQL / MySQL):
Linux har ikke en innebygd ekvivalent til VSS. For å oppnå applikasjonskonsistens må du bruke «pre-freeze»- og «post-thaw»-skript i kombinasjon med hypervisorens gjesteverktøy (f.eks. VMware Tools).

Her er et eksempel på et VMware pre-freeze-script for PostgreSQL 15+ som trygt forbereder databasen for et snapshot:

#!/bin/bash
# /usr/sbin/pre-freeze-script
# Sørg for at dette skriptet er kjørbart (chmod +x)

# 1. Be PostgreSQL om å forberede seg på en sikkerhetskopi
su - postgres -c "psql -c "SELECT pg_backup_start('vm_snapshot', true);""

# 2. Tøm filsystemets buffere til disk
sync

# 3. Frys filsystemet (forutsatt at data ligger på /var/lib/pgsql)
fsfreeze -f /var/lib/pgsql

Og det tilhørende post-thaw-script for å gjenoppta operasjoner:

#!/bin/bash
# /usr/sbin/post-thaw-script

# 1. Opphev frysing av filsystemet
fsfreeze -u /var/lib/pgsql

# 2. Fortell PostgreSQL at sikkerhetskopieringen er fullført
su - postgres -c "psql -c "SELECT pg_backup_stop();""

2. Bruk innebygde verktøy for databasesikkerhetskopiering

Selv om applikasjonskonsistente snapshots er bedre enn standard snapshots, bærer de fortsatt risikoen for «VM stun». Den sikreste tilnærmingen for databasesikkerhetskopiering er å bruke innebygde, strømmende sikkerhetskopieringsverktøy som opererer uavhengig av hypervisoren.

PostgreSQL (pg_basebackup):

pg_basebackup -h localhost -U replication_user -D /mnt/backups/pg_backup -Ft -z -P

MySQL/MariaDB (Percona XtraBackup / Mariabackup):
Disse verktøyene tar «hot», ikke-blokkerende sikkerhetskopier ved å kopiere datafilene og samtidig spore endringer i redo-loggen.

mariabackup --backup --target-dir=/mnt/backups/mysql_backup --user=root --password=SecurePass

SQL Server (T-SQL):

BACKUP DATABASE [ProductionDB] 
TO DISK = N'Z:BackupsProductionDB.bak' 
WITH NOFORMAT, NOINIT, NAME = N'ProductionDB-Full Backup', 
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;
GO

3. Implementer Point-in-Time Recovery (PITR) via loggarkivering

Et daglig snapshot eller en fullstendig sikkerhetskopi beskytter deg bare frem til minuttet den ble tatt. Hvis databasen krasjer kl. 16:00 og ditt siste snapshot var kl. 02:00, mister du 14 timer med transaksjonsdata.

For å oppnå ekte bedriftsresiliens må du kombinere fullstendige applikasjonskonsistente sikkerhetskopier med kontinuerlig loggarkivering (sikkerhetskopiering av WAL, Redo-logger eller transaksjonslogger hvert par minutter). Dette gjør at databaseadministratorer kan gjenopprette databasen til et spesifikt minutt eller til og med en spesifikk transaksjons-ID før en katastrofe inntraff.

Bedriftssikkerhetskopiering med CloudSave

Å administrere tilpassede «pre-freeze»-skript, cron-jobber for innebygde dumper og loggforsendelse på tvers av dusinvis av databaseservere er et operasjonelt mareritt for DevOps-team. Det er her en plattform i bedriftsklassen som CloudSave blir kritisk.

CloudSave bygger bro mellom virtualisering og databasearkitektur. I stedet for å stole på blinde hypervisor-snapshots, bruker CloudSave applikasjonsbevisste agenter som integreres direkte med SQL Server, PostgreSQL, MySQL og Oracle.

Når CloudSave initierer en sikkerhetskopi:
1. Kommuniserer den direkte med databasemotoren via innebygde API-er (som VSS for Windows eller innebygd WAL-strømming for Linux).
2. Orkestrerer den tømming av minnebuffere til disk uten å forårsake forstyrrende VM-stuns.
3. Fanger den sikkert datafilene og administrerer automatisk trunkering av transaksjonslogger.
4. Sikkerhetskopierer den kontinuerlig transaksjonslogger, noe som muliggjør granulær Point-in-Time Recovery (PITR) med noen få klikk.

Ved å overlate kompleksiteten med applikasjonskonsistens til CloudSave, kan databaseadministratorer og systemadministratorer garantere dataintegritet uten å ofre ytelsen eller tilgjengeligheten til produksjonsklyngene sine.

Konklusjon

Øyeblikksbilder av virtuelle maskiner er et utrolig verktøy for infrastrukturstyring, men de er fundamentalt uforenlige med ACID-kravene til transaksjonsdatabaser. Å stole på krasj-konsistente hypervisor-snapshots eksponerer organisasjonen din for ødelagte sider, ødelagte replikeringskjeder og katastrofalt datatap.

For å beskytte dine forretningskritiske data må du implementere applikasjonsbevisst «quiescing», bruke innebygde metoder for databasesikkerhetskopiering og opprettholde kontinuerlige arkiver av transaksjonslogger. Ved å ta i bruk spesialbygde sikkerhetskopieringsløsninger for bedrifter, kan du sikre at databasene dine forblir høyt tilgjengelige, fullstendig gjenopprettbare og helt sikre.