Nevýhody InnoDB oproti MyISAM v MariaDB

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #30 kdy: 18. 04. 2025, 00:20:14 »
Používám teď FreeBSD, ti na to mají automatizovanou kompilaci/balíček https://www.freshports.org/databases/timescaledb/
Je to ta verze s podporou komprimace? Předpokládám, že by to mohla být ta comunitty (TSL) protože freebsd nemá takové problémy s licencemi.  Mají tam napsáno licence Apache TSL. No mělo by se to poznat minimálně podle toho odkud a jaké zdrojáky to stahuje.

Ten port sa kompiluje buď s Apache, alebo TSL licenciou. Štandardne je TSL zapnutá, takže aj balíček bude v tejto verzii.

Vidieť sa to dá v https://cgit.freebsd.org/ports/tree/databases/timescaledb/Makefile, konkrétne v častiach
Kód: [Vybrat]
OPTIONS_DEFAULT= SSL TSL
a
Kód: [Vybrat]
TSL_DESC= Enables TSL licensed code in additon to Apache license code


Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #31 kdy: 18. 04. 2025, 19:49:10 »
Pokud bych nechtěl opouštět mariaDB/Mysql, tak lze použít MyRocks místo innoDB. Chlubí se že má až 10 krát menší zápisy, je optimalizovaná na SSD, měla by umět partitioning a data obsahují několikanásobně méně místa na disku díky efektivní kompresi. Jak je to ale odolné proti výpadkům elektřiny jsem nenašel.
Jedinou zmínku co jsem našel byla.

Citace
MyRocks (MariaDB only)   Designed for write-heavy workloads, MyRocks is optimized for crash resilience but might not be suitable for all use cases.

Jestli má MyRocks a Aria stejné nedokumentované nedostatky jako MyIsam co se týče paralelního čtení a zápisů se nelze nikde dočíst.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #32 kdy: 18. 04. 2025, 20:34:05 »
Citace
MyRocks (MariaDB only)   Designed for write-heavy workloads, MyRocks is optimized for crash resilience but might not be suitable for all use cases.

Jestli má MyRocks a Aria stejné nedokumentované nedostatky jako MyIsam co se týče paralelního čtení a zápisů se nelze nikde dočíst.

MyRocks by mělo být postavené nad RocksDB - https://github.com/facebook/mysql-5.6/wiki/Getting-Started-with-MyRocks

rockdb podporuje neblokujici snapshoty - tudiz by cteni nemelo blokovat zapis https://github.com/facebook/rocksdb/wiki/rocksdb-faq

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #33 kdy: 20. 04. 2025, 21:28:49 »
Ach jo, za ta tvoje starost o životnost disků ...  :)

V PostgreSQL jsem importoval 90GB databázi (z textového SQL souboru příkaz po příkazu takto):

Nainstaluji nový PostgreSQL nové verze. V nastavení nastavím fsync=off. Zapnu Postgres službu.

Pomocí příkazu psql naimportuji tu 90GB databázi, na moderním NVMe disku rychlostí klidně 2GB/s, tedy za 45 minut.

Potom opět vypnu službu postgresql, změním nastavení fsync=on. Zapnu postgresql službu.

Import 90GB DB ze souboru trvá i s uvařením kávy 1h reálného času. A ještě jednou připomínám, pro standardní běh je extrémně důležité mít fsync=on!

ZFS je ok, BTRFS je ok, snapshoty jsou OK a klidně tam mohou zůstat několik let. Na běžný provoz PostgreSQL to nemá žádný vliv, na moderním NVMe je běžný počet commits per seconds 100tis.

A životnost disků i po plné práci celý víkend (s fsync=on) je více než 5 let záruky (Samsung Pro řada).

Takže pokud ten NVMe disk odejte den po záruce, dá se klidně za 10tis. Kč koupit nový, větší a výkonnější.

Moje první SSD, které jsem si koupil v roce 2007 a má 60GB stále funguje. Dodnes. Stále má 200MB/s a stále cca 5000iops. Což tehdy byla špička. Takže i po 18 letech drží data. Pochopitelně dneska už není v produkci, tak mám Samsung Pro NVMe.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #34 kdy: 21. 04. 2025, 00:30:51 »
Jedná se o telefonní hovory.

Sorry, ale tohle tady opravdu řešíš už více než rok? Pro koho pracuješ? TMOBILE, O2? Tam opravdu nemají datacentrum storage grade disky s automatickou výměnou do 4h od selhání, což je v běžných datacentrech zvykem?

Těch metadat (kdo kdy komu jakdlouho volal) vůbec není moc. Takže tohle zvládne jak InnoDB, tak i PostgreSQL, který je naopak přesně stavěn na nonstop provoz 24/7 (ve firmě, kde jsem pracovat od 2008 do 2019) měl PostgreSQL databázový server uptime 6 let a služba běžela 6 let nonstop!!!).

Kdejaké datacenter grade nvme disk umí až dva miliony iops. Opravdu máte v nějaké malé firmičce tolik hovorů a opravdu to musíte ukládat na nejlevnější disky, které odejdou za rok?

Vůbec nic z tvých diskusí nedává smysl. Úplně všechno, na co se tady dva roky ptáš je vyřešeno před 20 lety. Stačí to jen nainstalovat na normální serverový hw a ty disky tam vydrží 6 let záruky a dodavatel diskového pole je při selhání chodí sám do 4h vyměňovat. A je tam několik náhradních disků, takže když selže jeden disk zrovna zítra ve státní svátek, tak tam někdo přijede v úterý. Datům se nic nestane a výkon zůstane stále stejný.

Tohle má každý telefonní operátor vyřešeno příslušnou technologií už od sedmdesátých let. I u nás český telekom ještě v době analogových linek byl schopen dodat výpis hovorů - tehdy vytištěné na jehličkové tiskárně!!!

Takže CO VLASTNĚ ŘEŠÍŠ?


Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #35 kdy: 21. 04. 2025, 23:27:13 »
Reaguji na to co napsal Tomáš Crhonek.

Pod pojmem SSD Samsung pro mi to najde jen tohle https://www.alza.cz/samsung-990-pro-1tb-d7516911.htm
Což není ani serverový disk.  Já používám tohle https://www.alza.cz/wd-red-sn700-nvme-1tb-d6998050.htm
Kapacita 1TB, životnost 2000TBW.  Tedy disk lze cca 2000 krát přepsat. Dříve to byly disky s kapacitou 512 GB s životností cca 600 TBW. Všechny disky vydržely to co měli v popisu.


Oni jsou to ale dva různé problémy.  Jeden problém byl v tom, že ZFS mělo v mém případě více jak desetinásobnou write applification oproti tomu, jakou by mělo mít dle všech pouček a návodů.
To jsem nyní vyřešil přechodem z Linuxu na FreeBSD. Tam to na stejném hardware a při stejném zatížení prostě nedělá. Přechod na FreeBSD má i další podstatné výhody, např. že mi přijde že ve FreeBSD je vše jednodušší a lépe zdokumentované, tedy nemám už potřebu příliš zkoumat, kdy přesně a proč se to násobné zapisování v Linuxu vyskytuje.

Druhý problém na který jsem narazil a který z prvním souvisí jen okrajově a o kterém je tohle vlákno je ten, že při defaultním nastavení innoDB  jsou zápisy více jak 10 krát pomalejší než než u defaultního nastavení MyISAM.
Výsledek je, že když importuji CSV soubor do nové databáze se 264 milióny záznamy, tak na to místo dvou hodin potřebuji celý víkend. Rozdíl je možné srovnat vhodným nastavením innoDB. Změna nastavení nespočívá ve vypínání sync!

Pokud by zkombinoval ZFS write amplification a neoptimální nastavení databáze, zničí to v mém provozu pravděpodobně i ty nejlepší disky a poběží to pomaleji, než kdyby databáze jela na deset let starém hardware. Řešit to lepším hardware je nesmysl.

MySQL/MariaDB neumožňuje vypnout sync, píše se, že tato možnost je jen pro testování. To bych mohl vypnout jen nastavením ZFS, aby ZFS sync jen předstíralo. Což ale není nutné i když u repliky databáze by to nijak nevadilo, ta se dá za pár minut nahodit znovu z posledního snapshotu.

Ostatní změny nastavení InnoDB konzistenci dat tak zásadně neohrožují. Např. z toho, že se provádí automatický comit po každém jednotlivém přidání záznamu, žádná výhoda neplyne, jen je vše mnohonásobně pomalejší. 

Např. zde je návod jak nastavit InnoDB pro monitoring hovorů. Nastavení je docela brutální, ale brutálně to také zvýší propustnost a sníží zápisy na disk. S tímto nastavením to zvládá ukládat více jak  15 000 hovorů za vteřinu (CPS =calls per second). A to každý hovor vyžaduje více záznamů!
https://www.voipmonitor.org/doc/Scaling#SSDs
Ze zkušenosti vím, že pravděpodobnost, že budou data po výpadku elektřiny nebo pádu kernelu poškozena i při tomto nastavení, není velká.
Jaký přesně mají vliv jednotlivé parametry, i když je to věc naprosto zásadní, zůstává nedokumentováno.

Budu nucen si to nějak vyzkoušet např. vypínáním elektřiny nějakému klonu a zvolit vhodný kompromis.
V případě poškození dat je vždy možné se vrátit v čase 5 minut a začít od posledního snapshotu, což není žádná katastrofa. Navíc zápisy v mezičase budou uchovány na klonech, tedy je možné je doplnit později.


Kdykoli čtu srovnání MyIsam a InnoDB, vždy se píše o výhodách InnoDB, ale to že je v InnoDB defaultně cca 10 krát pomalejší pro zápis, v podstatě vždy zapomene propagátor zmínit. Porovnávám výkon v defaultní konfiguraci. InnoDB je možné zrychlit na úroveň MyISAM, ale důsledky pro bezpečnost dat nejsou řádně dokumentovány. To je pro mne dost překvapivé, když jedním z hlavních výhod InnoDB má být lepší bezpečnost dat a fakt, že se tabulky opraví sami, rychle a plně automaticky.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #36 kdy: 22. 04. 2025, 01:28:08 »
Nevím, jestli vám někdo dlouho něco zatajoval :)

Já jsem, když čtu to vlákno a vzpomínám na ty předchozí, popravdě trochu překvapený, že používáte MyISAM.
Na podobné debaty si vzpomínám tak před 15 a víc lety, když se od toho postupně odcházelo.
MyISAM je v rámci těch běžně užívaných db enginů víceméně taková anomálie - nesetkal jsem se s ničím podobným u ostatních víceuživatelských databází. Už tu padlo, že to nesplňuje ACID (nemá to referenční integritu, transakce, izolaci, neřeší to stabilní zápisy), což to téměř automaticky vylučuje z většiny komplikovanějších použití, ale také to má zamykání pouze na celou tabulku, nejen na řádky. Tzn. velmi špatně se to škáluje s více klienty při zápisu nebo změnách.
Bylo logické, že jestliže chtěli tohle řešit, museli místo vylepšování v podstatě udělat nový engine (InnoDB), který má jak zamykání řádků, tak i atributy toho ACID, protože ty věci spolu souvisí. A ano, samozřejmě je s tím (jako ve všech podobných databázích) spojená další režie.
S podobným typem enginů bez těch garancí a se zamykáním celých tabulek se setkáte víceméně jen v jednoduchých embedovaných databázích.

V dnešní době MyISAM nedává moc smysl, krom nějakého velice úzkého použití, kdy vás nebrzdí to zamykání (za určitých okolností vám to dovolí číst i při zápisech při povolené volbě - concurrent_insert) a nechcete žádný žurnál (WAL). Ideovým pokračovatelem MyISAMu je ARIA v MariaDB, která sice zachovává všechny principiální nectnosti, ale právě přidává zmíněný žurnál, aby to bylo odolnější při pádech.
Historicky to bylo hodně nasazované na web hostingy a pod dobové CMS. Tam to tak zásadně nevadilo, protože jste měl třeba desítky, stovky tisíc selectů (na které to bylo velice rychlé) na jeden insert nebo update (zjednodušeně, když se publikoval nový článek).

Problém v tom vašem vyhodnocení, je v tom, že porovnáváte výkon s jedním klientem při bulk importu (LOAD DATA dump.csv). Tam se logicky téměř vůbec neprojeví ty výhody paralelizace v InnoDB, která typicky nastává při normálním provozu, pokud se zapisuje z více klientů. Netuším jak to probíhá u vás v reálném provozu, nicméně velká většina   aplikací v podobném duchu je uzpůsobená na krátké paralelní transakce, kdy se třeba i z jednoho klienta vytvoří pool s několika spojeními a sype se to souběžně. To má samozřejmě úplně jinou charakteristiku než jednovláknový import milionu řádků.

Pokud chcete zrychlit import, můžete rozdělit CSV na části (třeba příkazem split v systému) a pustit jejich import naráz.
Další možnosti pro paralelní logické dumpy a importy jsou např. s utilitami, co to řeší jako např. MyDumper nebo mysqlpump (je v MySQL, nevím teď jestli i pro MariaDB), podobně i importní nástroje MySQL shellu, kde se dá určit počet vláken.
Další možnost je zkopírování a přenos souborů s MyISAM tabulkami do nové databáze (buď ručně, nebo pomocí Percona XtraBackup, mariadbbackup), a následná in-place konverze do InnoDB (ALTER TABLE <tabulka> ENGINE=InnoDB;).
Ale tam to zrychlení v porovnání s těmi předchozími způsoby nebude zásadní, myslím, že paralelně pojede jen generování sekundárních indexů.
Vytváření a změny indexů pak hrají samozřejmě velkou roli jak při importu, tak i pokud řešíte nerychlejší zápisy. Je to vůbec v praxi docela složité téma (jaké indexy, kdy, optimalizace).
Nicméně pro bulk import z CSV do existující struktury můžete např. dropnout všechny sekundární indexy (ne primární, clustered) a pak je vytvořit znovu (tam už zas zabere ten paralelismus).
Nakonec MySQL (tuším 8 a vyšší) také umožňuje vypnout dočasně redo log (ALTER INSTANCE DISABLE INNODB REDO_LOG;), což také může pomoct při jednorázovém importu a migraci. Šlo to i historicky s nějakými workaroundy (nastavit velikost an 0), ale to byla čuňárna, u které nikdo negarantoval, že to nespadne.

Ale beru to v podstatě tak, že tohle děláte typicky jednou za uherák, když migrujete. Daleko důležitější je podle mě chování při standardním provozu.

Jinak takovéhle logování si říká o použití partitioningu, mělo by to jít krásně dělit třeba po nějakých periodách (týden, měsíc). U používání sekundárních indexů by to mohlo výrazně zrychlit jejich aktualizace při zápisu nových dat. Další benefit je ten, že když je daná nějaké retence dat a starší se mažou nebo archivují, tak odstranění partition je výrazně rychlejší než DELETE FROM <tabulka> WHERE.., protože se nevytváří žádný trans. log.
Na celý tenhle mangling s partitiony jde napsat uložená procedura, kterou pak může spouštět vnitřní scheduler v MySQL.
Byť jsem nikdy nedělal s TimescaleDB, co tu byla zmíněná, tak počítám, že ty principy jsou velmi podobné.

Nakonec pokud by to opravdu v nějakém paralelním používání mělo dlouhé odezvy, tak se to dá optimalizovat ještě dál. Např. i tak, že pokud to bude možné, uděláte nějakou "staging" tabulku, která neubude mít žádné sekundární indexy, ale jen třeba vzestupné číslo s auto inkrementem jako primární klíč (inserty tam jsou velmi rychlé). Z té to budete periodicky (zas uložená procedura např. jednou za minutu, dvě) sypat do druhé tabulky, kde už budou i další indexy podle potřeby. Většinou v dávkách (např. po tisících řádků) je to mnohem efektivnější.
...atd.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #37 kdy: 22. 04. 2025, 02:15:26 »
U toho write amplification, o kterém často píšete, se mi to upřímně moc nezdá.
Resp. může se to samozřejmě vymknout z kloubů v nějakých specifických situacích (kdy máte např. nějaké šílené zarovnání a dělá vám to hromadu zbytečných RMW cyklů, nebo máte např. zvol, který jede všechno přes ZIL, nad ním ještě další FS, zapnete žurnálování na všech vrstvách atp.).
Ale zaráží mě, že jste se za tu dobu nedobrali, kde k tomu dochází. Při správné konfiguraci není úplně realistické, že by OpenZFS na Linuxu mělo samo o sobě desetinásobnou WA a jen přechod mezi systémy to magicky vyřešil.

I ten tweak, co jste zmiňoval ve vlákně o FreeBSD, že je to už v pohodě, když jste prodloužil zfs_txg_timeout, mi přijde v téhle aplikaci trochu haluz (hlavně proto, že MySQL posílá sync(), který tu transakci uzavírá mnohem častěji).
Abyste to nějak rozumně porovnal, musíte zapsat opravdu identická data. Ideálně nějaký připravený test, nebo třeba i sysbench pro MySQL. Jestliže vám tam jednou vycházela odhadovaná WA menší než jedna, tak to znamená jen, že pokud je na datasetu zapnutá komprese, tak to s těmi konkrétními daty mělo lepší poměr.

Další věc je, že byste to měl opravdu počítat exaktně (fyzicky zapsaná data / logicky zapsaná data). Což nezjistíte jen iostatem. Logicky zapsaná data z databáze s innodb se dají zjistit přes globální status (SHOW GLOBAL STATUS LIKE '%WRITTEN%';), tam jsou čítače od spuštění.
Další místo, kde se to dá dohledat, kolik se zapsalo z aplikací, jsou statistiky pro jednotlivé datasety. V Linuxu je to v  /proc/spl/kstat/zfs na FreeBSD se to vypíše přes: sysctl kstat.zfs.zroot.dataset

Mám na to takový skript.., co to vyfiltruje (první parametr je dataset, např. zpool/mysql ).
Vyjede vám akumulovaný počet zapsaných bajtů (nwritten), I/O operací, kolik šlo přes ZIL atp.

Kód: [Vybrat]
#!/bin/sh

dataset=$1
zpool=${dataset%%/*}
objset=$(zfs list -H -o name,objsetid \
        | awk -v ds="$dataset" '$1 == ds { printf("objset-0x%x", $2) }')
sysctl kstat.zfs.${zpool}.dataset.${objset}

Akumul. počet bajtů zapsaných do zařízení se na FreeBSD nejsnáz zjistí přes iostat -Ix.
Když mu dáte parametr -I a neuvedete periodu, tak vám dá akumulované hodnoty od startu systému. Parametr -x dá každé zařízení na svůj řádek. Zápisy jsou v pátém sloupci kw/i (pozor na jednotky, je to v kB).

Tzn. je potřeba spočítat rozdíly (deltu) za dobu, co to měříte. A pak to mezi sebou podělit, abyste dostal WA u ZFS.
Jde to analogicky i u jiných filesystému a aplikací, ale tam už se musí typicky zapojit nějaký tracing, kdy budete odchytávat syscally pro zápis a sčítat hodnoty. Na FreeBSD přes DTrace, na Linuxu třeba přes bpftrace, perf atp.

Ještě krátce k tomu hardware, ta terabajtová SSDčka, co máte, mají zhruba 1DWPD. Tzn. reálný problém by měl nastat, pokud zapíšete vyšší stovky GB denně (samozřejmě včetně WA na úrovni databáze i FS), aby to začal být problém. Upřímně si nedovedu moc představit, kolik záznamů musíte denně zalogovat, ale asi bych úplně nečekal, že v tomhle bude problém i při použití "normální" databáze s transakcemi, replikací atp. pokud se to rozumně nastaví.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #38 kdy: 22. 04. 2025, 04:51:49 »
Reaguji na to co napsal Tomáš Crhonek.

OK, já budu reagovat na každý tvůj odstavec.

Pod pojmem SSD Samsung pro mi to najde jen tohle https://www.alza.cz/samsung-990-pro-1tb-d7516911.htm
Což není ani serverový disk.

Ano, není to ani serverový disk a i tak je naprosto skvělý. Já ve skutečnosti používám Samsung EVO, tedy vyloženě zákaznický disk určený do desktopů a zatím ani jeden neodešel.

NVMe Samsung pro mám jeden.

Já používám tohle https://www.alza.cz/wd-red-sn700-nvme-1tb-d6998050.htm
Kapacita 1TB, životnost 2000TBW.  Tedy disk lze cca 2000 krát přepsat. Dříve to byly disky s kapacitou 512 GB s životností cca 600 TBW. Všechny disky vydržely to co měli v popisu.

Výborně, jenže i tenhle disk s 600TB Write toho umí zapsat daleko, daleko, daleko více. Když si s tím hráli kluci z webu CDR nebo potom Deep In IT (diit.cz), tak těch 600TB překročili mnohokrát a disk stále fungoval, tedy zapisoval a četl správná data. Výrobce prostě musí na krabičku disku napsat nějaké vlastnosti čistě jen proto, aby se mu jich nevracelo z reklamací moc. I tenhle WD Red určitě přežije třeba 10x600TB. V době 5 let záruky naprosto 100%

Oni jsou to ale dva různé problémy.  Jeden problém byl v tom, že ZFS mělo v mém případě více jak desetinásobnou write applification oproti tomu, jakou by mělo mít dle všech pouček a návodů.

Dejme tomu že to tak je. Ale opravdu by se při 10x write aplification u ZFS zapsalo více než 600TB telefonních dat za 5let? O tom dost pochybuju. Ta tvoje telefonní data mohou mít třeba 512B na jedno volání a to ještě přeháním. Takže 600TB je 1 171 875 000 hovorů! Opravdu tam budeš během 5 leté záruky zapisovat miliardu hovorů? Opravdu? A pokud ano, tak si za těch 5 let záruky zcela jistě vyděláš na nový disk.

To jsem nyní vyřešil přechodem z Linuxu na FreeBSD. Tam to na stejném hardware a při stejném zatížení prostě nedělá.

Používám jak linux, tak freebsd na serverech v práci a tak velký rozdíl mezi IO vrstvou v nich není. Linux vůbec nezapisuje na disky 10 tolik než FreeBSD. Takže tady se může jednat jen o chybu v zápisu zapsaných dat na disk. Tedy ve statistice a nikoliv v počtu zápisů jako takových.

Přechod na FreeBSD má i další podstatné výhody, např. že mi přijde že ve FreeBSD je vše jednodušší a lépe zdokumentované, tedy nemám už potřebu příliš zkoumat, kdy přesně a proč se to násobné zapisování v Linuxu vyskytuje.

Souhlasím a blahopřeji. Dokumentace FreeBSD je skvělá, proto jej mám na produkčním serveru už 9 let.

Druhý problém na který jsem narazil a který z prvním souvisí jen okrajově a o kterém je tohle vlákno je ten, že při defaultním nastavení innoDB  jsou zápisy více jak 10 krát pomalejší než než u defaultního nastavení MyISAM.
Výsledek je, že když importuji CSV soubor do nové databáze se 264 milióny záznamy, tak na to místo dvou hodin potřebuji celý víkend. Rozdíl je možné srovnat vhodným nastavením innoDB. Změna nastavení nespočívá ve vypínání sync!

OK, já MyISAM používal naposledy v roce 2007, takže změna proti InnoDB nebo od roku 2009 PostgreSQL mě vůbec nezajímá. Na disky (rotační, ssd nmve) to nemělo žádný vliv a ani PostgreSQL na první verzi BTRFS mi nikdy nezničil žádný z těch EVO disků.

Pokud by zkombinoval ZFS write amplification a neoptimální nastavení databáze, zničí to v mém provozu pravděpodobně i ty nejlepší disky a poběží to pomaleji, než kdyby databáze jela na deset let starém hardware. Řešit to lepším hardware je nesmysl.

Ne nezničí. Jednak opravdu nebudeš mít v DB 1 miliardu hovorů za 5 let a i kdyby ano, tak ten WD Red disk do 5 let můžeš klidně reklamovat. Já takto osobně vyreklamoval asi 20x HDD Samsung 3TB 7200rpm. Pokaždé to byla výměna za jiný kus, rukou mi prošlo 40 disků a zaplatil jsem pouze nákup těch původních 20. Reklamace v Alze, TS Bohemia fungují na jedničku z hvězdičkou. Tohoto se nemusíš bát.

MySQL/MariaDB neumožňuje vypnout sync, píše se, že tato možnost je jen pro testování. To bych mohl vypnout jen nastavením ZFS, aby ZFS sync jen předstíralo. Což ale není nutné i když u repliky databáze by to nijak nevadilo, ta se dá za pár minut nahodit znovu z posledního snapshotu.

OK, v pořádku. Já také někdy vytvořím 256GB RAM disk, DB importuji do něj, vypnu službu a potom těch 256GB oddíl překopíruju na SSD. Takže pokud nejde v MySQL vypnout fsync, tak je to ok, stále máme ramdisky.

Ostatní změny nastavení InnoDB konzistenci dat tak zásadně neohrožují. Např. z toho, že se provádí automatický comit po každém jednotlivém přidání záznamu, žádná výhoda neplyne, jen je vše mnohonásobně pomalejší. 

OK. A je to tak pomalé, že se ty telefonní hovory nestačí zaznamenávat? I nejhorší zákaznícký disk má 50 tis. IOps. Opravdu zaznamenáváš 50tis hovorů za sekundu? A i kdyby, tak za 5 let je to pouze 788 400 000 zápisů. Což je pořád cca polovina toho, co ti garantuje výrobce, jak jsem spočítal o několik odstavců výše.

Např. zde je návod jak nastavit InnoDB pro monitoring hovorů. Nastavení je docela brutální, ale brutálně to také zvýší propustnost a sníží zápisy na disk. S tímto nastavením to zvládá ukládat více jak  15 000 hovorů za vteřinu (CPS =calls per second).

15 tis. hovorů za sekundu je nic. Disky WD mají pět let záruky a tohle zvládnou bez problémů.

Budu nucen si to nějak vyzkoušet např. vypínáním elektřiny nějakému klonu a zvolit vhodný kompromis.
V případě poškození dat je vždy možné se vrátit v čase 5 minut a začít od posledního snapshotu, což není žádná katastrofa. Navíc zápisy v mezičase budou uchovány na klonech, tedy je možné je doplnit později.

Skvělé!!! Takto jsem si v roce 2009 hrál s PostgreSQL. Vypínal jsem HW s tehdy ještě rotačními disky. Disky přežily 10x vypnutí za hodinu po 8h pracovní doby. I HDD to bez problémů přežili. Ty první 1TB WD Green. Ano Green! I tyto green disky měly tehdy 5 let záruky.

Kdykoli čtu srovnání MyIsam a InnoDB, vždy se píše o výhodách InnoDB, ale to že je v InnoDB defaultně cca 10 krát pomalejší pro zápis, v podstatě vždy zapomene propagátor zmínit. Porovnávám výkon v defaultní konfiguraci. InnoDB je možné zrychlit na úroveň MyISAM, ale důsledky pro bezpečnost dat nejsou řádně dokumentovány. To je pro mne dost překvapivé, když jedním z hlavních výhod InnoDB má být lepší bezpečnost dat a fakt, že se tabulky opraví sami, rychle a plně automaticky.

Jak jsem psal, zkušenosti s MyISAM mám naposledy v roce 2007. Od té doby jsem používal na MySQL InnoDB a od roku 2009 už jen PostgreSQL. PostgreSQL používám dodnes. Tedy 16 let! A aktuálně mi běží na diskách HDD Samsung Iron Wolf (NAS grade), které mají 8 let a už jsou dááávno po záruce. Ale stále běží.

Tedy 15tis hovorů za sekundu je pro dnešní EVO disky zcela bez problémů a PRO disk to vydrží 100% a u Samsungu máš na něj 5 let záruky. Stejně jako u WD.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #39 kdy: 22. 04. 2025, 04:54:46 »
U toho write amplification, o kterém často píšete, se mi to upřímně moc nezdá.

Mě také ne. Rozdíl mezi Linux a FreeBSD určitě není 10x a rozdíl mezi mít DB na XFS nebo na ZFS také neudělá dalších 10x a přechod MyISAM na InnoDB také neudělá 10x. Dohromady tedy 1000x write amplification.

Tazatel se asi moc dívá na nějaké zcela nezajímavé statistiky. U mne všechny disky (kromě několika Samsung 3TB) selhaly až po záruce. A vše v záruce vždy obchod vyměnil do jednoho měsíce od reklamace.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #40 kdy: 22. 04. 2025, 09:25:06 »
https://www.voipmonitor.org/doc/Scaling#SSDs
Ze zkušenosti vím, že pravděpodobnost, že budou data po výpadku elektřiny nebo pádu kernelu poškozena i při tomto nastavení, není velká.
Jaký přesně mají vliv jednotlivé parametry, i když je to věc naprosto zásadní, zůstává nedokumentováno.

Dokumentace existuje
https://dev.mysql.com/doc/refman/8.4/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #41 kdy: 22. 04. 2025, 09:55:38 »
U toho write amplification, o kterém často píšete, se mi to upřímně moc nezdá.

Mě také ne. Rozdíl mezi Linux a FreeBSD určitě není 10x a rozdíl mezi mít DB na XFS nebo na ZFS také neudělá dalších 10x a přechod MyISAM na InnoDB také neudělá 10x. Dohromady tedy 1000x write amplification.

Tazatel se asi moc dívá na nějaké zcela nezajímavé statistiky. U mne všechny disky (kromě několika Samsung 3TB) selhaly až po záruce. A vše v záruce vždy obchod vyměnil do jednoho měsíce od reklamace.

Mě se to také nezdá. Proto o tom píši. To zničení těch disků není žádná teorie, ale skutečnost po roce provozu. Kdy díky ZFS a té amplifikaci to ve smartu disku hlásilo vypotřebovanou životnost i když disky stále fungovaly. Neběžela tam hlavní databáze, ale její repliky. Vyřešil jsem to převod na ext4.
Na ext4 byl počet zápisů naprosto zanedbatelný. Počet zápisů na ext4 byl menší než desetinásobný. Ale beru v úvahu, že ZFS má  přirozeně více zápisů než ext4, protože je to copy on write např. s méně efektivními updaty, což je v databázích velmi běžná operace. Indexy se updatují věčně. Rozdíl byl ale více jak desetinásobný proti tomu co bych považoval ještě za přirozené, normální a snesitelné a to ještě s nějakou rezervou.  Ten rozdíl mezi ext4 a ZFS ale byl mnohem větší než desetinásobný.

Je ale pravda, že pokud někdo nemá opravdu hodně zapisující databází, amplifikace se vůbec nevšimne, neb rezerva životnosti disku je tam dostatečná. Věřím že právě proto jsem snad jediný, kdo ten problém pozoroval.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #42 kdy: 22. 04. 2025, 10:14:59 »
U mne všechny disky (kromě několika Samsung 3TB) selhaly až po záruce. A vše v záruce vždy obchod vyměnil do jednoho měsíce od reklamace.

Mě zatím neodešel žádný SSD disk nasazený na serveru. Magnetické čas od času odejdou.
Přetěžovat disk kvůli neoptimálnímu nastavení, aby měl co dělat, že se dožije pěti let nebo konce záruky, ale rozhodně není dobrá strategie. Pro spolehlivost provozu je lepší neřešit výměnu disku ani v záruce ani po ní. Nasazení 24/7 jakoukoli manipulaci hrozně komplikuje.  Proto hledat opravdu optimální nastavení se vyplatí už kvůli tomu, že se sníží pravděpodobnost selhání disků. A platí to samozřejmě i na magnetické disky, protože zbytečné zatížením jim také nesvědčí.

Snažit se redukovat zbytečné zápisy, i kdyby to měl disk teoreticky vydržet, je dobrá strategie.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #43 kdy: 22. 04. 2025, 11:13:05 »

15 tis. hovorů za sekundu je nic. Disky WD mají pět let záruky a tohle zvládnou bez problémů.


Tak tohle je chvástání.
15 tisíc hovorů za vteřinu by mohlo být až půl miliardy hovorů za den. Tedy třeba 1 TB komprimavných dat denně a to nepočítám overhead s updatováním indexů a podobně, což bude více než dvojnásobek.
Tolik hovorů nedá ani celá česká republika všichni mobilní i jiní operátoři dohromady.
Jeden hovor není jeden řádek v tabulce. Ale minimálně pět, nejspíše více, sleduje se celá cesta hovoru a jednotlivé SIP pakety. Je pak možné určit, kde nastal problém.
Aby to ale bylo možné, je třeba mít vyladěné nastavení InnoDB a souborového systému.

Re:Nevýhody InnoDB oproti MyISAM v MariaDB
« Odpověď #44 kdy: 22. 04. 2025, 11:16:49 »
U toho write amplification, o kterém často píšete, se mi to upřímně moc nezdá.
Resp. může se to samozřejmě vymknout z kloubů v nějakých specifických situacích (kdy máte např. nějaké šílené zarovnání a dělá vám to hromadu zbytečných RMW cyklů, nebo máte např. zvol, který jede všechno přes ZIL, nad ním ještě další FS, zapnete žurnálování na všech vrstvách atp.).
Ale zaráží mě, že jste se za tu dobu nedobrali, kde k tomu dochází. Při správné konfiguraci není úplně realistické, že by OpenZFS na Linuxu mělo samo o sobě desetinásobnou WA a jen přechod mezi systémy to magicky vyřešil.

I ten tweak, co jste zmiňoval ve vlákně o FreeBSD, že je to už v pohodě, když jste prodloužil zfs_txg_timeout, mi přijde v téhle aplikaci trochu haluz (hlavně proto, že MySQL posílá sync(), který tu transakci uzavírá mnohem častěji).
Abyste to nějak rozumně porovnal, musíte zapsat opravdu identická data. Ideálně nějaký připravený test, nebo třeba i sysbench pro MySQL. Jestliže vám tam jednou vycházela odhadovaná WA menší než jedna, tak to znamená jen, že pokud je na datasetu zapnutá komprese, tak to s těmi konkrétními daty mělo lepší poměr.

Další věc je, že byste to měl opravdu počítat exaktně (fyzicky zapsaná data / logicky zapsaná data). Což nezjistíte jen iostatem. Logicky zapsaná data z databáze s innodb se dají zjistit přes globální status (SHOW GLOBAL STATUS LIKE '%WRITTEN%';), tam jsou čítače od spuštění.
Další místo, kde se to dá dohledat, kolik se zapsalo z aplikací, jsou statistiky pro jednotlivé datasety. V Linuxu je to v  /proc/spl/kstat/zfs na FreeBSD se to vypíše přes: sysctl kstat.zfs.zroot.dataset

Mám na to takový skript.., co to vyfiltruje (první parametr je dataset, např. zpool/mysql ).
Vyjede vám akumulovaný počet zapsaných bajtů (nwritten), I/O operací, kolik šlo přes ZIL atp.

Kód: [Vybrat]
#!/bin/sh

dataset=$1
zpool=${dataset%%/*}
objset=$(zfs list -H -o name,objsetid \
        | awk -v ds="$dataset" '$1 == ds { printf("objset-0x%x", $2) }')
sysctl kstat.zfs.${zpool}.dataset.${objset}

Akumul. počet bajtů zapsaných do zařízení se na FreeBSD nejsnáz zjistí přes iostat -Ix.
Když mu dáte parametr -I a neuvedete periodu, tak vám dá akumulované hodnoty od startu systému. Parametr -x dá každé zařízení na svůj řádek. Zápisy jsou v pátém sloupci kw/i (pozor na jednotky, je to v kB).

Tzn. je potřeba spočítat rozdíly (deltu) za dobu, co to měříte. A pak to mezi sebou podělit, abyste dostal WA u ZFS.
Jde to analogicky i u jiných filesystému a aplikací, ale tam už se musí typicky zapojit nějaký tracing, kdy budete odchytávat syscally pro zápis a sčítat hodnoty. Na FreeBSD přes DTrace, na Linuxu třeba přes bpftrace, perf atp.

Ještě krátce k tomu hardware, ta terabajtová SSDčka, co máte, mají zhruba 1DWPD. Tzn. reálný problém by měl nastat, pokud zapíšete vyšší stovky GB denně (samozřejmě včetně WA na úrovni databáze i FS), aby to začal být problém. Upřímně si nedovedu moc představit, kolik záznamů musíte denně zalogovat, ale asi bych úplně nečekal, že v tomhle bude problém i při použití "normální" databáze s transakcemi, replikací atp. pokud se to rozumně nastaví.

Díky moc za konkrétní rady. Budou se hodit. Určitě zápisy prověřím až bude vše finálně vyladěno na FreeBSD. Na Linuxu mi ZFS s hlavní databází nyní neběží, předělali jsme to na ext4, tedy budu moci tu WA ověřit příležitostně.