Portál AbcLinuxu, 6. května 2025 09:13

Dotaz: Snapshot běžícího systému

12.1.2020 14:31 TSV
Snapshot běžícího systému
Přečteno: 687×
Odpovědět | Admin
Ahoj, mám systém nainstalovaný na disku s souborovým systémem btrfs. Co se stane, pokud za běhu systému vytvořím snapshot celého filesystému jakožto zálohu předchozího stavu? Půjde z toho nabootovat? Předpokládám že by mělo a bude se to chovat jako bych počítač v okamžiku snapshotu natvrdo odpojil z elektriky, ale nejsem si jistý. S tím souvisí druhá věc. Je možné nějakým způsobem udělat snapshot ještě před startem systému, tj. asi přímo z Grubu?

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Heron avatar 12.1.2020 15:07 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Odpovědět | | Sbalit | Link | Blokovat | Admin
BTRFS snapshot je atomický snímek v určitém čase, to nejde srovnávat s vypnutím od elektriky. Pokud nějaká appka během pořízení snapshotu zapisuje na disk, tak pokud to dělá dobře, tak její data budou plně validní. Snapshoty se používají běžně při zálohách VM běžících serverů a obnova takto zálohovaného vmka je plně funkční a data jsou zcela v pořádku. Takže tohoto se není třeba bát. Pokud by tam byl nějaký "vadný" program nebo služba, tak tu lze na dobu pořízení snapshotu stopnout (nebo ji uvést do stavu, aby na chvíli nezapisovala na disk).

Pořídit snapshot jde i z jiného systému. Takže stačí nabootovat nějaké rescue cd nebo jiný systém a z toho pořídit snapshot FS na jiném disku.
Heron
15.1.2020 08:42 j
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Nebudou, pises nesmysly. Konzistentni bude filesystem, ale ne data na nem. Typicky (ale nejen) databaze. Aby ta data konzistentni byla, je treba bezicim aplikacim sdelit, ze se neco bude dit, a to opet typicky databaze umi ... za predpokladu, ze jsou spravne nainstalovany => transakcni logy jsou na jinym disku/partysne nez data.

Funguje to tak, ze aplikace zaridi konzistenci dat, a pak odpovi ze je pripravena, teprve pak se udela snap, a aplikaci se sdeli ze hotovo, ze muze dal zapisovat. Po dobu vytvareni snapu se pochopitelne nezapisuje vubec, nebo prave do transakcnich logu na jinym disku.

Presne stejne se chova jakykoli snap VM => konzisteneni bude FS, nikoli data.

Ano, typicky to stroj prezije bez zasadni uhony, a typicky vyvojari databazi pocitaji s tim, ze to muze neocekavane lehnout. Ale rozhodne to neni bezpecny zpusob jak vyrobit zalohu. A ano, chova se to temer presne jak pise tazatel, proti vytrzeni napajeni je tam rozdil minimalni.

---

Na widlich tuhle funcionalitu (teoreticky) zajistuje VSS, a hypoteticky aplikace muze vedet, ze se ten snap vytvari, pokud (a to je ten zakopanej pes) s tim pocita vyvojar aplikace. Tech hypotez je tam navic tolik, ze to nedeporucuje pro vlasni SQLko pouzivat ani sam M$ (respektive negarantuje, ze vytvorenej snap bude konzistentni).
15.1.2020 09:04 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Ale databáza sa dá prepnúť do módu pre backup, a vedela to už v minulom tisícročí.
15.1.2020 11:43 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
aby ta data konzistentni byla, je treba bezicim aplikacim sdelit, ze se neco bude dit
Opäť malá technická otázka: existuje na Linuxe na to nejaký systémový mechanizmus? Môže napr. moja aplikácia reagovať na to, že sa chystá urobiť "btrfs snapshot ..." ?
Josef Kufner avatar 15.1.2020 12:01 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Neexistuje. Ani nevím, že by to nějaké jiné programy než databáze vůbec řešily.

Pokud program něco načte, chvíli zpracovává, a pak uloží, tak bohatě stačí nesmazat stará data před zápisem nových. Hodně programů ukládá data vytvořením nového souboru vedle cílového a teprve když je nový soubor hotov a uzavřen, tak ho přejmenuje na ten starý (což je atomická operace).

Aplikace, které pracují s daty trvale, typicky pracují nad databází a tudíž to nemusí řešit. Aplikace, které něco dlouho počítají, si zas ukládají průběžné výsledky, ale to obvykle je v podstatě jen připisování do logu.
Hello world ! Segmentation fault (core dumped)
12.1.2020 20:40 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud nějaká appka během pořízení snapshotu zapisuje na disk, tak pokud to dělá dobře, tak její data budou plně validní.

Um, čo konkrétne znamená to "dělá dobře"?
Heron avatar 12.1.2020 21:28 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Tak řešení je víc. Asi nejjednodušší je použití nějakých atomických operací (třeba přejmenování souboru). Appka zapisuje data do nového souboru, potom jej flushne (fdatasync nebo tak něco) a potom jej přejmenuje na uživatelem očekávaný název (nebo zkrátka konečný název). Když se tento řetězec operací někde přeruší, tak výsledkem je buď validní starý soubor, nebo validní nový soubor. Snapshot tedy může zasáhnout kdykoliv a je to vždy konzistentní.

Nebo jak to řeší některé DB. Vedou si log o provedených operacích, tento log je atomicky ukládán na disk (třeba po 4k blocích) a v případě výpadku je podle tohoto logu možné zrekonstruovat datový soubor (který samotný už konzistentní být nemusí, typicky může obsahovat více verzí daného záznamu). Tj. když snapshotuju běžící postgresql, tak ten si jen při startu přehraje wal log a je to.

Nikdy jsem nenarazil na problém. Navíc snapshot v tomto případě provádí přímo FS samotný, takže FS ví, jaké operace jsou zrovna v běhu. Třeba snapshot pomocí LVM umí informovat FS, že by se měl freeznout ale už je to jedna vrstva navíc. vmware taky přes toolsy posílá info do vmka a na chvíli zastaví io operace.

Obecně si myslím, že by pro "spolehlivé snapshotování" nemělo být potřeba nic navíc, není potřeba nijak informovat služby apod., protože všechny zápisy mají být i z jiných důvodů (viz kauza ext4 a poškozených konfigů) provedeny správně. Což taky většinou jsou už jenom tím, že většina služeb buď data na disk nezapisuje vůbec a pokud ano, tak ti na to stejně vezmou sqlite nebo BDB nebo rovnou "velké" databáze.
12.1.2020 21:41 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Nad tým prvým spôsobom som dumal. A nemusí to byť celkom triviálne. Pretože aplikácia by sa potom mala postarať napr. aj o okopírovanie prístupových práv (vrátane ACL) alebo riešiť to, keď je to symlink.
15.1.2020 08:50 j
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Databaze si zapise ... rekneme polozky nejakyho dokladu ... v tenhle okamzik udelas snap ... a mas nekonzistentni data, protoze ti chybi hlavicka. Presne proto to nemuze fungovat. Viz muj post vejs.

A presne proto ma kazda svepravna databaze API, pres ktery ji sdelis ze ten snap (nebo jinej zpusob zalohy) des delat, pockas, az ti rekne ze OK (= dokoncila vsechny bezici transakce) a teprve pak muzes.

Jedine timhle zpusobem ziskas datove konzistetnni zalohu.

Uplne stejne to plati pochopitelne pro libovolnou jinou aplikaci, kdyz budes mit cojavim otevrenej nejakej textovej soubor, tak se s klidem muzes dostat do situace, kdy ty sice vidis dokonceny odstavec, ale aplikace ho zapsala jen 1/2, druha ceka na nejaky ten interval, a kdyz udelas snap, tak sice mas citelny soubor, ale chybi ti v nem data.
Max avatar 15.1.2020 09:12 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Ten problém, co popisuješ, je problém netransakční db. S transakční by nic takového nastat nemělo.
Zdar Max
Měl jsem sen ... :(
15.1.2020 09:50 Boban
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Jenže tohle nezáleží jen na transakční DB. Stačí, aby ta aplikace ty transakce špatně používala a je problém. DB soubory pak ve snapshotu budou v pořádku, ale aplikační data v nich můžou být zapsaná jen z poloviny. Proto se snapshoty nemůžou brát jako naprosto spolehlivé zálohy. Ty zaručí jedině samotná aplikace.
Heron avatar 15.1.2020 10:56 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Ano, tohle jsem myslel tím "pokud to dělá dobře". I transakce je nutné používat dobře, transakce slouží ke transformaci z jednoho konzistentního stavu do jiného konzistentního stavu. Pokud program používá transakce tak, že po vykonání některých z nich jsou data v nekonzistentním stavu (z hlediska logiky toho programu), tak to dělá blbě a ono blbě se netýká jen snapshotů, ale také zcela běžného provozu daného programu.

Pokud nad touto db bude více klientů a ti budou do db posílat své transakce, tak jiný klient může vidět data v nekonzistentním stavu, viz následující příklad:
// konzistentní
T1
// nekonzistení
T2
// konzistentní
Pro dva klienty:
C1T1
C2T1 -- klient 2 vidí nekonzistentní stav dat
C1T2
C2T2 -- klient 2 ukládá data vyrobená na základě nekonzistentních dat.
Tedy pokud je program napsaný takto a používá transakce blbě, tak to zhavaruje už během zcela normálního provozu a nemá to se snapshoty nic společného. A to jsem ten příklad schválně uvedl serializovaně, pokud by někdo namítal, že program může povolovat pouze jeden přístup v jeden čas. Ani Serializable nezajistí konzistenci dat, pokud appka transakce používá blbě.
Max avatar 15.1.2020 11:51 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Pokud argumentuješ špatnou aplikací, tak ti nějaký příkaz pro flush dat pro db server moc nepomůže. A těžko lze předpokládat, že u takto špatně napsané app jí budeš moci dát nějaký příkaz, aby ona sama provedla flush, aby byly data konzistentní.
Zdar Max
Měl jsem sen ... :(
Heron avatar 15.1.2020 10:43 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Databaze si zapise ... rekneme polozky nejakyho dokladu ... v tenhle okamzik udelas snap ... a mas nekonzistentni data, protoze ti chybi hlavicka. Presne proto to nemuze fungovat. Viz muj post vejs.
DB splňující ACID bude konzistentní, transakce jsou atomické. Buď se zapíší kompletně celé, nebo se nezapíší vůbec.
A presne proto ma kazda svepravna databaze API, pres ktery ji sdelis ze ten snap (nebo jinej zpusob zalohy) des delat, pockas, az ti rekne ze OK (= dokoncila vsechny bezici transakce) a teprve pak muzes.
Atomický snap a "jiný způsob zálohy" je dost velký rozdíl. U jiného způsobu zálohy se počítá s tím, že různé soubory budou zkopírovány v různém čase a je tedy nutné uvést DB do stavu, kdy do datových souborů nezapisuje, ale jen plní logy. Viz třeba PITR. Jenže toto u atomického snapshotu neplatí, tam jsou všechny souboru zmrazeny ve stejném čase, takže DB ví, které transakce jsou dokončeny.
Uplne stejne to plati pochopitelne pro libovolnou jinou aplikaci, kdyz budes mit cojavim otevrenej nejakej textovej soubor, tak se s klidem muzes dostat do situace, kdy ty sice vidis dokonceny odstavec, ale aplikace ho zapsala jen 1/2, druha ceka na nejaky ten interval, a kdyz udelas snap, tak sice mas citelny soubor, ale chybi ti v nem data.
Tak si ještě jednou přečti komentář, na který reaguješ. Existují a používají se atomické fs operace, takže slušně napsaný program nepřepisuje data na místě (a pokud ano, udělá si kopii původního), ale zapisuje někam jinam a potom to atomicky (třeba pomocí přejmenování), překlopí. Pro systémové služby by toto mělo být automatické. Pro uživatelské programy se mohou najít výjimky, ale tam asi nebude nikdo dělat snap během ukládání 2GB souboru v GIMPu a nebude asi očekávat, že ten soubor bude konzistentní.
16.1.2020 08:58 j
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Ze tys vzivote nikdy nikde zadnou databazi neprovozoval, natoz aby sis precet nejakou dokumentaci k ni?

Takze znova, snap FS zajisti konzistetni FS, rozhodne nezajisti a ani nemuze, konzistetni data. V pripade databazi pak v kazdym pripade dojde k nejaky ztrate dat.

A o tech tvysh "slusne" napsanych programech bys radsi nemel blabolit vubec, kazdej normalni program si soubor otevre, a zapisuje do toho !!! JEDNOU !!! otevrenyho souboru. Jak s tim nalozi FS je pak uz neco uplne jinyho, ale krome tech, ktery delaji COW vsechny data proste prepisujou.
Heron avatar 16.1.2020 14:16 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Ze tys vzivote nikdy nikde zadnou databazi neprovozoval, natoz aby sis precet nejakou dokumentaci k ni?
Kromě těch pár desítek DB o celkovém objemu dneska už skoro 10TB, ne, nic jsem neprovozoval. A už vůbec jsem nikdy nikomu neradil dávat všechna data do DB (ideálně jako BYTEA) a nemít to jako soubor na disku. Ne, vůbec. Jen těch pár TB, pouhých 12 let, ale jinak vůbec nic.
V pripade databazi pak v kazdym pripade dojde k nejaky ztrate dat.
Nedojde. Všechny potvrzené transakce jsou spolehlivě uloženy na disku. Od toho je to ACID DB, aby právě tohle zajistila.

Max avatar 16.1.2020 14:45 Max | skóre: 72 | blog: Max_Devaine
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
To "prosté přepisování" souborů není tak prosté. Všechny dnešní běžně používané FS (ext3, ext4, reiserfs, xfs, ntfs) jsou žurnálovací.
Zdar Max
Měl jsem sen ... :(
13.1.2020 14:38 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: Snapshot běžícího systému
Odpovědět | | Sbalit | Link | Blokovat | Admin

No, záleží na tom, jaký bude v tom snapshotu momentální stav (například) konfiguračních souborů běžících aplikací, které třeba zrovna své soubory zapsaly jen tak z poloviny. Pokud to z té poloviny rozchodí, jistě budou fungovat. :-) Pokus nabootovat ze snapshotu je (jak píšeš) podobný bootu po odpojení natvrdo, jen s mírně lepšími garancemi kolem (vzájemné) konzistentnosti dat / souborů na celém subvolume.

Ad snapshot před startem systému: Asi by bylo nejlepší udělat si na to systemd unit spouštěný v initramfs. Systemd v initramfs by mohl takový snapshot vytvořit bez jakýchkoliv dalších operací nad filesystémem. GRUB to podle mě neumí; do většiny FS (záměrně) nedovede psát.

Nicméně i k vytvoření snapshotu během initramfs ten souborový systém musíš napřed namountovat read/write, takže implicitní read-only nastavení ve většině distribucí se nebude dát úplně snadno a přímo použít.

Pokud by read/write na konci initramfs vadil, tak potom snad leda že by ten initramfs napřed namountoval nový root read/write, pak by udělal snapshot a ve finále by ho přemountoval zase read-only, ať už si to dál pořeší systemd ve standardním systému podle fstab. Ale otázka je, proč takový přemet dělat.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.