Před časem jsem napsal zápisek o ukládání velkých binárních dat do (SQL) databáze. Před chvílí mi napsal kámoš programátor a toto téma mi tak připomenul. Chtěl bych doplnit nějaké odkazy na užitečné materiály a také uvést velikostní limity.
Odkazy
- http://wiki.postgresql.org/wiki/BinaryFilesInDB – PostgreSQL wiki, spíše souhrn možností, plusy a mínusy.
- http://www.fuzzy.cz/cs/clanky/proc-ukladat-soubory-do-databaze/ – Tomáš Vondra nahlas přemýšlí, proč ukládat velká binární data do Postgresu a jaké to přináší výhody.
- http://www.fuzzy.cz/cs/clanky/ukladani-souboru-do-postgresql-databaze/ – Praktické ukázky v PHP několika přístupů pro ukládání binárních dat do PostgreSQL.
- http://www.fuzzy.cz/cs/clanky/benchmark-zpusobu-ukladani-souboru-do-postgresql/ – Benchmarky starší verze PostgreSQL 8.3 a „Tomášova“ způsobu ukládání dat do PostgreSQL.
Limity
Abychom věděli, co si můžeme dovolit uložit a co se nám tam již nevejde, neuškodí si zopakovat limity.
Maximum size for a database? unlimited (32 TiB databases exist) Maximum size for a table? 32 TiB Maximum size for a row? 400 GiB Maximum size for a field? 1 GiB Maximum number of rows in a table? unlimited Maximum number of columns in a table? 250-1600 (400 GiB per row) Maximum number of indexes on a table? unlimited
Dle výše uvedeného odkazu na PostgreSQL wiki platí:
Pro BLOB platí limit 2 GiB (2^31) na jeden záznam a 4 mld. záznamů (2^32) celkem pro databázi. Celková možná velikost dat v BLOBech je tak 8 EiB (8’388’608 TiB) na jednu databázi. BLOBy jsou ukládány v systémové tabulce pg_largeobject a odkazuje se na něj pomocí OID. Není zaručená referenční integrita, proto PostgreSQL přišel s bytea, se kterým se zachází stejně, jako například s textem.
Pro bytea platí limit 1 GiB na jeden záznam a 4 mld. záznamů per table. Do jedné tabulky se tak vleze 4 EiB dat v bytea. Záznamy bytea se ukládají do TOAST a jsou komprimovány. Mohou tak snadno zabírat méně místa na disku, než by zabíraly samotné soubory.
Jen pro porovnání, ext4 má maximální velikost systému souborů 16TiB a pro XFS RedHat garantuje podporu do 100 TiB (jinak má XFS limity daleko vyšší). PostgreSQL tedy umí ukládat daleko více, než jsou běžné limity systémů souborů. Jak toho ale docílit, když máme jen ext4? Jednotlivé tabulky lze uložit do různých tablespace (jiných systémů souborů) a tedy každou tabulku mít omezenou jen velikostí systému souborů. Stejně tak lze jednotlivé databáze vytvářet na ruzných discích a získat tak paralelní výkon navíc. Ale to už je jiná story.
Jak rekl kolega na letosnim summitu, podporuje se jen takova velikost, jakou pozaduje nejnarocnejsi zakaznik a je mozne to otestovat. Tzn existuje takovy hardware :-)
Ext4 má limit na soubor 16TiB a filesystem 1EiB
Brtf má limity 16EiB a 16EiB + komprimaci dat on the fly umi tez
S ext4 je to komplikovanější. e4progs ve starších verzích a afaik v těch, co jsou v enterprise distrech, umějí pracovat s maximální velikostí blokového zařízení pouze do 16TiB. Ext4 samotná a i pozdější verze e4progs má limity daleko vyšší, jak jsi psal. Je však otázkou, zda je to ze strany distribucí otestované (jak píše Lzap).
Pingback: Statistika stahování stránek II | Heronovo