Vlastní databáze velkých souborů

Po 17 letech (od roku 2008 do 2025) opouštím skvělou databázi PostgreSQL. Která letos slaví krásných 30 let. Mě je letos 43 let. Tedy s touto databází jsem prožil velmi příjemnou polovinu mého IT života. A jediný důvod, proč PostgreSQL opouštím, je nedostatečná velikost datového typu BYTEA. Ten má limit pouze 1GB. Více popíšu dále v článku.

Nedostatečná velikost BYTEA

Soubory jsem zásadně ukládal do BYTEA. Jenže soubory se stále zvětšují a i kódování v h264, které lze stále přehrát ve všech dostupných prohlížečích webu, už jsou prostě větší než 1GB.

Soubory potřebují metadata

V DB jsem měl včetně binárních dat také další metadata. Tedy datum, jméno souboru a údaje o žánru (scifi, horror, dokument). Na tohle je SQL databáze perfektní.

Přešel jsem na MIN.io

V roce 2020 jsem po přečtení článku od Pavla Tišnovského přešel na MIN.io. Lze tam ukládat data libovolné velikosti (až do jednotek EB), stejně tak hromadu metadat. Perfektní úložiště! Napsané v jazyce Golang.

Vlastní implementace

Golang má ve své standardní knihovně možnost vytvářet struktury, ty potom převést na standardní typ GOP, a uložit na disk. Všech jako uint64 neboli datový typ všech moderních procesorů (x86_64, ARM). AMD Ryzen umí „levou zadní“ zpracovat až 8x64b čísel (rozšíření AVX-512). Počet jader 8 = 64 x 64b čísel. Za cca jeden takt (tedy 0.25 ns pro 4GHz Procesor- rychlosti jednotlivých instrukcí se pochopitelně liší). Tedy 256 miliard 64b čísel za sekundu!

Takže moje DB souborů na disku je velmi malá, metadata pro 2 miliony souborů (videa, dokumenty, fotky) má méně než 1GB. A binární data (PNG obrázky a H264 videa) mají potom cca 10TB.

Tohle vše mám v 6 souborech na 6 4TB discích. (4x Seagate Iron Wolf – NAS grade disky). MIN.io to umí, já úž též.

Úklid DB zatím vůbec neřeším

V PostgreSQL je na úklid příkaz VACUUM FULL, já si zatím jen označuji smazané soubory, ale na disku stále jsou. Disky jsou levné, letos se možná začnou prodávat 20TB disky. Takže můžu letos po 8 letech vyhodit 6x4TB Iron Wolfy a mít jeden HDD a k tomu na RaspberyPi mít 1GB databázi. Aktuálně mám na 24TB úložišti s odolností proti výpadku jednoho disku (erasure code), tedy právě těch aktuálně dostupných 20TB místa.