Předně bych chtěl vyjádřit autorovi své díky za brilantní seriál o Btrfs systému. Jelikož ho začínám čerstvě používat spolu s RAID 1 polem, jsem rád, že se dozvídám mnoho důležitých informací jak z článku, tak i od diskutujících.
Nyní k mému dotazu: I zde v článku je zmíněno zálohování. Musím říct, že tenhle způsob záloh mi nedá spát a stále si nejsem jist, že to, jak to celé funguje, chápu správně. Pro mě osobně je záloha, kterou lze označit za zálohu 1:1 kopie dat. Čím více důležitých dat, tím více kopií na více úložištích a také fyzických místech. Tedy příkladně, pokud mám 2TB důležitých dat, lze jako jediné považovat za zálohu, pokud mám tyto data 1:1 na jiném 2TB disku (3 zálohy = 3x 2TB HDD). Jestli to chápu správně, snapshoty fungují tak, že dělají rozdílové "zálohy", tady musím mít něco jako zdroj a ze zdroje odečítám (zapisuji) k prvnímu snapshotu pouze rozdíl. Následný další rozdíl také, ale jenom s tím rozdílem, že již nějaká data odečítám z prvního snapshotu. Důležité ovšem je to, že musím mít někde ty 2TB dat (zdroj, který je porovnáván). Jestliže se zdroj poškodí, můžu si 10 snapshotů strčit někam. Chápu to správně? Jestliže ano, nejedná se totiž o zálohu a je velmi nesprávné a také zavádějící, to takto označovat. Je to jako tvrdit, že RAID 1 je záloha dat. Ano, data máte na dvou discích, ale bohužel, dojde např. k napadnutí stroje ransomware a data se zašifrují i na disku druhém. => proto se nejedná o zálohu. Píšu to, protože mnoho lidí to, bohužel, nechápe. Je mi jasné, že diskutující zde, ví.
Aha tak dík za poučení, že by šlo udělat restore jako inkrementální, to jsem netušil. Vyzkouším teda, jestli se to dá v praxi použít. V podstatě bych si tak mohl vytvořit vlastní systém záloh s výhodami snapperu na libovolném jiném fs (typicky externí ext4 disk). Tedy pokud jsem to správně pochopil - restore opět na btrfs by nemělo moc smysl, nechci aby ta záloha byla závislá na konkrétním fs (mělo by to být fs-agnostic, tj. přenositelné resp. klonovatelné kamkoli).
....s výhodami snapperu na libovolném jiném fs (typicky externí ext4 disk).
Tak to zas ne. Teda leda bys na ten ext4 disk ukládal jen výsledek toho "send", a to je pitomý, protože z toho nemůžeš jednoduše dostat jednotlivý soubory. Jak bys chtěl udělat inkrementální restore na ext4, kde nic jako snapshoty nejsou??
Zálohovat send/recieve má největší smysl právě, když zálohy odkládáš na vzdálenej BTRFS, kde to rovnou obnovuješ (recieve), čímž tam máš dobře přístupný historický verze souborů.
O proprietárním software jsem doufám nemluvil, to se netýká ani jednoho...
Ale jde mi o řešení přenositelné a nezadrátované natvrdo do partitions na nějakých discích, kde nemám pod kontrolou vážná rizika selhání, se kterými jsem se opakovaně setkal.
Byl bych strašně rád, kdyby btrfs bylo bezvadné, ale halt určité scénáře nemají ošetřené. Konkrétně mám osobní podezření, že to souvisí s velkou diskovou cache (případně s SSHD disky), kde disk navenek ohlásí zápis transakce z žurnálu, ale přitom si ji ve svém blackboxu jen zapsal do své obrovské mnohagigabajtové cache a bude ji zpracovávat po svém třeba následných X sekund. Pokud v této době dojde k přerušení napájení a disk nemá náhradní napájení (např. vestavěný kapacitor nebo baterii), tak dojde k poškození B-tree, které už fs není schopen nikdy opravit, protože ani normálně nenaběhne. A bohužel offline nástroj btrfscheck tuto kategorii chyb opravit taky nedokáže, ale spíše naopak situaci ještě zhorší. Takže pak nezbývá než force restore, kdy ale o data, která byla v té false flag transakci (případně i data, která rozjebal btrfs check) přijdete. Pokud šlo třeba o nějaký důležitý pracovní dokument nebo jiná unikátní nová data tak to není nic příjemného (kdyby se dala přehrát historie žurnálu která tato data musí obsahovat, tak by to bylo fajn řešení, ale to nepůjde, protože fs je koruptovaný a nepovolí to). Celé je to IMHO proti smyslu žurnálovacích fs, které by právě takovým jevům měly zamezovat. Jestli máte nějaký nápad jak to vyřešit, nebo mi napovědět, kde dělám v chybu třeba v nastavení parametrů fstab, tak prosím...
Předně bych se nedržel premisy, že záloha == 1:1 kopie dat. Pokud tím máte na mysli to, že bude 1:1 bitová kopie, pak to zase s sebou nese riziko vznikající z chyb filesystému a jeho interpretace (v roce 2020 může mít btrfs nějakou chybu, kterou zároveň v této době umí "správně" interpretovat, ale v roce 2025 při připojení zálohy můžete narazit na projev problému). Záloha bitové kopie je jedna ze specifických typů záloh, ale určitě se nedá říct, že je to nejvhodnější vždy a všude (já bych skoro řekl, že se tato výhoda hodí málokdy).
Zálohovací systémy často umějí přírůstky intepretovat do hlavní knihovny záloh takovým způsobem, že po uložení dat už neexistuje závislost na full záloze a na předcházejících přírustcích (ale přesto umí podle katalogu najít stav ke každému inkrementu). To, jestli vím, tak ani zálohy snapshotů btrfs, ani zfs neumí (a třeba pro mě je to velké mínus).
Formou snapshotů je vhodné zálohovat často měnící se data, aby byl zachycen stejný okamžik na celém subvolume. V praxi je asi nejčastější případ formou snapshotů zálohovat (jenom) transakční logy databázových systémů, případně, pokud to situace dovoluje, tak i hlavní databázi.
Překvapilo mě doporučení na vypínání CoW pro databázová úložiště. Zrovna tam je to potřeba - stejně databáze zapisují stránky na konec transakčního logu, takže k častým přepisům dat nedochází. Ve chvíli, kdy dochází k promítnutí změněných stránek do hlavního úložiště, je CoW zapotřebí jako soli. CoW by mělo mít poměrně mrňavou režii (filesystem stejně zapisuje svoje stránky). Doporučil bych spíš vyladit interval zápisu logů do databáze, případně (po pečlivé úvaze) oslabit fsync, než vypínat CoW - to jde zcela proti smyslu architektury!
Ano, máte pravdu, použil jsem nešťastný termín. Měl jsem na mysli 1:1 ve smyslu stejná data na jiném médiu ("prachsprostě" překopírovaná a poté ověřená a zkontrolovaná). Jinak časový snímek dat je parádní věc a i vím, kde bych to používal já, ale nelíbí se mi to označení záloha, protože to mate uživatele a já jim pak dost blbě vysvětluji, že to vlastně záloha ve smyslu záloha, není. Obdoba RAID 1, jak jsem psal. O bitové záloze máte pravdu, kvůli tomu ji také nedoporučuji používat. Na vlastní kůži jsem už poznal její záludnost.
Ve chvíli, kdy dochází k promítnutí změněných stránek do hlavního úložiště, je CoW zapotřebí jako soli.
Záleží na konkrétní db, ale ty postavené na MVCC architektuře si něco jako COW dělají sami. Nikdy se nepřepisuje existující záznam, ale vždy se vytváří nový. Až zpětně jsou označeny volné záznamy nebo celé stránky.
Takže dělat MVCC nad COW znamená ty bloky na disku měnit 2x. DB zapíše změněnou stránku, FS to vidí jako změnu bloku, tak udělá ještě COW toho bloku. Potom nad DB proběhne vacuum, DB označí tu původní stránku jako volnou a FS to opět vidí jako změnu a provede COW.
Nepřináší to žádnou výhodu, takto postavená DB se sama vyrovná s výpadkem napájení apod. Živé stránky se nikdy nepřepisují a ty mrtvé jsou označeny za volné až někdy zpětně (ano, samozřejmě, existují optimalizace jako hot update apod, ale to není teď potřeba komplikovat). Tj datové soubory jsou vždy v pořádku a snadno rekonstruovatelné pomocí logů. Dělat nad tímto ještě další COW nic nepřinese a sníží výkon zápisu efektivně na polovinu (v praxi ještě více).
Ja by som teda najprv urobil poriadok v pojmoch. Zaloha nie je archiv a archiv nie je zaloha. Mali by ste mat nejaku policy pre archivaciu udajov. Napriklad jeden archiv pre kazdy rok a za poslednych 6 mesiacov kazdy mesiac a posledne 4 stvrtroky. Vzdy full archiv na 2 roznych lokaciach a 2 technologicky roznych mediach (SSD, tocity disk, cloud, paska, ...).
Zalohy sa potom mozu odrazit z tychto archivov, takze si zalohujete iba rozdiely oproti full archivom.
No a na zaver technicka poznamka, musite vediet co robite. Ked si pod beziacim Oraclom urobite snapshot a zazalohujete neznamena to ze viete neskor obnovit instanciu Oraclu.
Zajímavé srovnání by bylo, kolik % všech filesystémů na BTRFS, nakonec chcíplo.
Upřímně, mám kolem sebe několik desítek Linuxáků a snad každý, má s BTRFS tak mizerné zkušenosti, že si to netroufne nasadit ani na pracovní notebook, nedejbože někam klientovi do produkce.
BTRFS nemá oproti ZFS absolutně nic navíc, ba naopak, tunu funkcionality postrádá.
Proč používat BTRFS, když si ZFS modul může zbuildit kde kdo, na kde čem, co je 64bit?
Proč používat BTRFS, když si ZFS modul může zbuildit kde kdo, na kde čem, co je 64bit?
To je asi na dlouhou diskusi. Spousta by ocenila mít ZFS out-of-box, což je dnes docela problém. Pak samozřejmě můžete uvažovat i o provozu na FreeBSD, které má i některé další výhody oproti linuxu (a ty, kteří by ocenili ZFS by mohli i tyto výhody ocenit).
Přesto Btrfs je zajímavá alternativa k ZFS a snad se najdou uživatelé, kteří budou mít sílu pomoci odladit i ty více enterprise funkcionality.
BTRFS nemá oproti ZFS absolutně nic navíc, ba naopak, tunu funkcionality postrádá.
To záleží na kritériích. BTRFS používám kontinuálně od roku 2011 a za jednu z hlavních vlastností považuju flexibilitu a to na mnoha úrovních. Multidevice podle mých představ. Kdykoliv přidám, kdykoliv odeberu disk. Nejstarší FS, který už udržuju jen tak pro srandu, má devid přes 30. Tohle s ZFS neuděláte. Ano, už jde sice odstranit vdev (čistě formálně) ale existující vdev nepředěláte (snad krom single na mirror a zpět). ZFS tuhle flexibilitu prostě postrádá, základní jednotkou je vdev a pool se staví z vdevů.
Další flexibilita BTRFS je v tom, že snapshot je subvolume a především nezávislý. Takže udělám snapshot nějaké subvolume a tu původní smažu. Takto můžu udělat celý strom subvolume a libovolné z nich promazat.
U ZFS je snapshot datasetu pevně svázán s tím datasetem. Nemůžu smazat dataset a nechat si jen jeho snapshoty. Ano, můžu udělat clone nějakého snapshotu a získám nový dataset, ale ten je ale navázán na původní snapshot (a ten zase na původní dataset). Ano, můžu tento snapshot pomocí zfs promote
posunout na nový dataset a ten starý dataset smazat, ale zase nemůžu smazat ten snapshot, ze kterého jsem udělal clone. Prostě už tam bude navždy.
Tohle strašně komplikuje použití těch datasetů.
Na BTRFS mám postavené kontejnery (nspawn). Některé slouží jako template, a ty občas updatuju. Kdykoliv z těchto template udělám nový kontejner. Staré template subolume mohu kdykoliv promazat.
Tohle na ZFS prakticky neuděláte. Když z jednoho snapshotu naklonujete více datasetů (třeba pro jaily) , tak se těch původních snapshotů nezbavíte. Takže nové jaily nakonec řeším plnou kopií template přes zfs send / receive
.
Od verze 0.8 jde skládat zpooly z kolika vdevů chceš a dělat s tím psí kusy dle libosti. Dokonce lze celej zpool přenést na menší vdev, to dřívější verze neuměly, pravda.
Ano, snapshoty se chovají rozdílně, s tím je nutné počítat.
Mně na BTRFS například chybí:
Šifrování, l2arc cache a zil cache. :-)
Osobně používám Btrfs přes dva roky v noťasu (Ubunut 18.04.3 LTS | kernel 5.3.18 | btrfs-progs v4.15.1) - dva 512GB SSD disky na RAID0 - jeden mSATA a druhý SATA3. Vytáhnu z toho, tak rychlost čtení a zápisu až na cca 900MB/s a 2x větší IOPS. Vytvořené subvolume na / alias @ a /home alias @home, k tomu jeden klasický disk místo dvd mechaniky, který používám pro nedůležitá data a jako zálohovací. Mám napsaný bash skript spouštěný cronem každou hodinu a vytvářející jednou denně snapshot z @ a @home a tyto snapshoty mi posílá skriptík rovnou přes btrfs send | btrfs receive na klasický disk s Btrfs samozřejmě, kde jsou inkrementálně zálohované, mám to zautomatizované tak, že se o to vůbec nestarám. Na RAID0 mi to promazává více jak 14 dní staré snapshoty automaticky (pořád mám ale snapshoty přistupnné 3 měsíce zpět na jiném fyzickém disku, 3 měsíce je až až pro mé potřeby), jednou za měsíc se odleje inkrementálně poslední snapshot @home a @ na externí USB disk, pro jistotu.
Obnova v případě vážné havárie disků v RAID0 je úplně jednoduchá bootnu live distro na usb a použiji čtyři příkazy v terminálu:
mkfs.btrfs -m raid1 -d raid0 /dev/sda1 /dev/sdb1 - vytvořím si nový souborový systém s metadaty v raid1 a daty v raid0
btrfstune -U XXXXXX /dev/sda1 - změním UUID prvního disku na původní, protože po naformátování je mu přiděleno jiné náhodného UUID, tak abych jej nemusel měnit v fstab a grubu
btrfs send /media/HDD/.snapshots/20200218_090101/@home | btrfs receive /media/XXX/@home - pošlu si vybraný snapshot s adresářem home na nově vytvořený Btrfs filesystém
btrfs send /media/HDD/.snapshots/20200218_090101/@ | btrfs receive /media/XXX/@ - pošlu si vybraný snapshot s adresářem / na nově vytvořený Btrfs filesystém
Změním zapsané snapshoty, které jsou ještě v read only režimu (byly to snapshoty v inkrementálním režimu) na zapisovatelné
btrfs property set media/XXX/@home ro false
btrfs property set media/XXX/@ ro false
Rebootnu noťas a jedu :)
Btrfs je podle mého skromného názoru báječný souborový systém i pro desktop použití, docela jsem s ním dříve hodně cvičil, když jsem se jej snažil pochopit a zkoumal jej, ale nikdy mi nezhavaroval tak, že bych se nemohl dostat k datům.
Nejvíc na něm oceňuji lehkost práce se snapshoty, implementaci interní komprese zstd, a možnost přidávat a odebírat disky dle potřeby, ještě by to chtělo implementovat interní šifrování a nemělo by to chybu.
18. 2. 2020, 15:20 editováno autorem komentáře
U ZFS za mna napr chyba moznost zmensit ulozisko a ma to vacsie pamatove naroky.... Samozrejme nebavime sa o enterprise
To je právě životní nesnáz pro Btrfs. Funkce má naprojektované podle enterprise filesystémů, ale ve skutečnosti s ním zatím pracují převážně jedinci, kteří tyto funkce nevyžadují. Pro málé (nebo domácí) použití je Btrfs navržený hodně velkolepě, ale nedopracovaný. Pro enterprise použití není naplánován dost velkolepě (dnes je konkurence dál) a zároveň není dokončený a zároveň jsou zvoleny kompromisy pro "malé" použití.
Btrfs by potřeboval nějakou vzpruhu, někoho, kdo se enterprise funkcí ujme a opravdu je dotáhne a hlavně vymyslí, jak mohou oba scénáře použití dlouhodobě koexistovat.
Nebudu opakovat, co už napsali jiní (hlavně p. Crhonek), přidám svoje:
Zvolil jsem btrfs jako filesystem i distribuční metodu pro polo-průmyslovou síť "IoT" embedded zařízení. Na poli hardwarovém klasika - SoC s "áčkovým" ARM Cortexem, pár set mega DDR3 paměti, pár GB NAND flashe. Flash je klasicky pomocí mtdparts rozdělen na různé oddíly podle boot předpisu čipsetu, zbytek je formátován jako jeden btrfs oddíl. Klasická MBR/GPT tam není. V oddílu jsou subvolumes, které systém používá: read-only rootfs, jeden s konfigurací, jeden se persistentním stavem prvků, nějaké logy atd.
Updaty se distribuují jako btrfs delty, tj. na mastering mašině se provede btrfs send -p starý_subvol nový_subvol | zstd | nějaké crypto s podpisy > update.bin, to se dá na veřejný server, odkud si to postahují stroje v terénu. Aplikují to na sebe, čímž vznikne nový (tenký) subvolume nezávislý na stávajícím, přehodí se nějaký symlink, a systém se restartuje. Když dojde k chybě, nezávislý watchdog v bootloaderu symlink přehodí zpátky a nabootuje předchozí (known-good) subvol.
Super je, že díky architektuře těch delt není podmínkou, aby starý subvolume byl beze změn - deltu lze úspěšně aplikovat i na subvol, který byl např. zákazníkem modifikován. Jeho změny jsou tak propagovány i do nové verze.
Díky block-level součtům máme perfektní přehled o zdraví eMMC. Když někde selže modul, zpravidla to víme dřív, než se to projeví na provozu. Scrub odhalí všechno. V síti máme nasazeno lehce pod 5000 zařízení (kolem 24 tisíc device-years), k chybě způsobené btrfs nedošlo nikdy. Pár selhání flashe, pár PEBKACů.
Jak je to s tou databází, vypnutím COW a snapshoty? Rychlé snapshoty samozřejmě závisí na COW – znamená to, že když udělám snapshot, bude btrfs příznak vypnutí COW ignorovat? Nebo mi vůbec nedovolí snapshot na oddílu přimountovaném s vypnutým COW udělat? Nebo (to by byla nejhorší možnost) to btrfs vůbec neřeší a s vypnutým COW bude klidně přepisovat data ve snapshotu?
Ano, to je snad jediný případ. U většiny filesystémů stejně nemáte možnost rozumně fragmentaci ovlivnit a nastavovat databázi podle "situace na discích" je zbytečně komplikované. Filesystem (a volume manager) je zde od toho, aby znal topologii disků a určoval, jak je nejlepší zapisovat. Databáze má být od tohoto dilematu odstíněná jak jen to jde. Ve skutečnosti databáze neumějí předejít fragmentaci na discích.
ZFS tento gap řeší pomocí ARC a ZIL (Adaptive Read Cache a ZFS intent log). Pokud je nenastavíte, ano, přicházejí nevýhody. Pokud je nastavíte, přicházejí výhody. Třeba si myslím, že provozovat ZFS (analogicky Btrfs) bez ARC/ZIL je případ bez use case. Nedovedu si moc představit, jaké výhody má okleštěné ZFS (Btrfs) oproti tradičnímu filesystému. Databáze bez CoW, snapshoty, které plně a výkonně nezajistí atomicitu - no pěkně děkuju, to mi přijde naprosto vyhovující Ext4 a jediné, v čem se přizpůsobím je způsob archivace a zálohování.
Ono se vůbec vymýšlejí kombinace bez use cases.
To ano, ale CoW má zanedbatelnou režii. Zápis stránky (ať už se jedná o existující nebo novou) trvá stejně s CoW, jako bez něj. Jediný rozdíl je v napojení zapsané stránky - a ta režie je (měla by být) absolutně zanedbatelná. Na flash médiích se stejně nepřepisuje stejný fyzický blok.
Pokud má existovat nějaký význam CoW, tak je právě v tom, že aplikace by měly (postupně, volitelně) přestat řešit starost o zápis dat a přenechat to na filesystému. Vypínání CoW jde naprosto proti velké výhodě Btrfs či ZFS. Jak Filip správně poznamenal, ztratí filesystem možnost inteligentně (s malou režií) řešit snapshoty, takže další ztráta proklamované výhody.
Pokud má něco výkonnostní výhodu, pak je to nastavit správnou velikost stránky na filesystému vs. databáze. Vypínat CoW je špatně.
Ta nezanedbatelná režie asi neni tak nezanedbatelná, jinak by se nikdo neobtěžoval to vypnout :)
Porovnání různých fs např https://www.slideshare.net/fuzzycz/postgresql-on-ext4-xfs-btrfs-and-zfs kolem strany 28 nebo novější ale s méně detaily https://www.phoronix.com/scan.php?page=article&item=linux-50-filesystems&num=3
Osobně bych čekal (spekulace) že v tom bude hrát roli i velmi častý fsync (na systémech s hodně zápisy), který zabrání optimalizacím které se mohou uplatnit při běžné práci s běžnými soubory.
Navíc dle https://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation může při velmi častém "random write" dojít k výrazné fragmentaci. Což hádám také nemusí být úplně dobré.
Jinak podle faq umí btfrs snapshoty i při vypnutém CoW, prostě si CoW pro potřeby snapshotu dočasně povolí (dle nějakých informací do prvního zápisu).
Nadruhou stranu, bez CoW zřejmně nefungují checksumy dat, což může být dost podstatná nevýhoda. Zejména pokud bych chtěl snapshoty posílat jinam jako zálohu - předpokládám že pokud pošlu snapshot tak na druhé straně budou soubory taky označeny jako nodatacow?.
I když na druhou stranu, živou databázi bych snapshotem nezálohoval, sice to v zásadě jde - např https://www.postgresql.org/docs/12/backup-file.html ale jen když vám nevadí že se to bude chovat jako po tvrdém restartu - udělá se replay wal log. A navíc s omezením že db může být jen na jednom fs :(
Na zkoušení btrfs se už dlouho chystám, zatím spíš hledám informace. Třeba mne tato série článků na root navnadí :)
Dovolil bych si nesouhlasit. Krásně je výkonnostní dopad vidět na virtuálních discích virtualboxu. Se zapnutým CoW klesá výkon virtuální mašiny až se dostane do stavu, kdy v podstatě zamrzá (čekání na IO). S vypnutím CoW se virtuální mašina začne chovat standardně. CoW se dá vypnout pro konkrétní soubor.
19. 2. 2020, 11:12 editováno autorem komentáře
Sekcia "Repair tools" sa mi veľmi nepozdáva.
Podľa btrfs wiki je "btrfs check - - repair" to posledné, čo by ste mali vyskúšať. https://btrfs.wiki.kernel.org/index.php/Btrfsck "btrfs check --repair, aka btrfsck is your last option if the ones above have not worked."
Opensuse má na wiki popísaný podrobnejší popis obnovy/opravy btrfs: https://en.opensuse.org/SDB:BTRFS
(S opravou btrfs nemám žiadne skúsenosti. Btrfs mi beží na Tumbleweede na / zatiaľ bez problémov)
Přesně tak. Btrfsck nebo btrfs check je v praxi, pokud se vyskytne problém, nepoužitelné. Na notebooku mně za posledních 10 let několikrát potkala Poweroff death a pak zjistíte, že to prostě nefunguje (zatímco takhle na serveru, kde vám stále běží online check nástroje za stejnou dobu nepoznáte problém).
A jediné, co má pak smysl je btrfs restore s následným přeformátováním a nakopírováním dat, která se podařila obnovit zpět. Možná by tuhle sekvenci včetně nějakých rozumných pojistek a automatického obnovení nastavení (např. subvolumes) mohli integrovat v nějakém lepším, opravdu použitelném opravném nástroji.
Doporučil bych autorům/udržovatelům tohoto fs vylézt z univerzitních kabinetů nebo temperovaných serveroven a třeba používat nějaký čas svůj notebook naformátovaný výhradně v btrfs, včetně velkokapacitních výměnných disků (portable) v těžším terénu, v různých podmínkách. Myslím, že by se pak rychle chytli za hlavu.