Portál AbcLinuxu, 6. května 2025 09:13
Řešení dotazu:
aby ta data konzistentni byla, je treba bezicim aplikacim sdelit, ze se neco bude ditOpäť 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 ..." ?
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"?
// 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ě.
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í.
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.
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.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.