Skip to content

Presun_obalek_v_puvodni_velikosti_z_DB_na_souborovy_system

cosmo-cz edited this page Oct 5, 2014 · 1 revision

Přesun obálek v původní velikosti z DB na souborový systém

Obálky se v projektu obálky knih.cz ukládají v následujících velikostech:

  • Náhledy ve velikosti 27x36 tzv. THUMBNAIL,
  • náhledy ve velikosti 54x68 tzv. ICON ,
  • náhledy ve velikosti 170x240 tzv. MEDIUM a
  • obálky v originální velikosti.
Obálky ve Všech velikostech jsou ukládány do relační databáze MySQL na backend serveru (BE). Úložiště pro tuto relační databázi je optimalizováno na výkon a právě obálky v originální velikosti tento prostor velice rychle vyčerpávají. Po uvážení, že tyto data nejsou v současnosti poskytována veřejnosti vůbec a jejich velikost se typicky pohybuje mezi 10-20MB je rozumný jejich přenos na levnější a pomalejší souborový systém.

Proces přesunu bude navržen tak, aby umožňoval pozdější přístup k těmto datům.

Koncept scriptu pro jednorázový přesun obálek v plné velikosti na souborový systém

  • Budou vyhledány všechny záznamy v tabulce "cover", které obsahují náhledy v plné velikosti.
  • Obálky v originální velikosti, původně uložené v tabulce "fileblob" budou uloženy na souborový systém v podobě samostatného souboru.
  • Záznam v tabulce "fileblob" bude zachován, ale data ze sloupce "content" budou uloženy na souborový systém do vyhrazeného adresáře.
  • Název souboru bude stejný jako primární klíč z tabulky "fileblob".
  • Soubory budou rozděleny do adresářů po max. 25tis souborů v jednom.
  • Název adresáře bude možné odvodit přímo z názvu souboru, tj. z primárního klíče záznamu v tabulce "fileblob" zaokrouhlením na 100tis nahoru. Tím že, náhledy k jedné obálce jsou v současnosti ve 3 velikostech + originál a primární klíč je přidělován sekvenčně, bude počet souborů v adresáři dodržen 100tis/4=25tis.
Pro tento účel byl vyvinut script /bin/fileblob_data_export.pl, který se v dávkách stará o přesun obálek v původní velikosti z databáze na souborový systém.

Script uchovává poslední procesované ID záznamu v tabulce fileblob a při dalším spuštění bude exportovat záznamy od tohoto ID. Je to z důvodu, že script bude spouštěn opakovaně po např. 100-1000 záznamech a kompletní opakované prohledávání (table scan) celé tabulky cover by bylo zdlouhavé. Proto se bude prohledávat pouze od posledního procesovaného záznamu.

Script k svému běhu potřebuje tabulku pro zálohování přesouvaných dat. To z důvodu neočekávané chyby při přesunu na souborový systém. Tuto tabulku lze pojmenovat libovolně a může být nad ní zaveden partitioning nad primárním klíčem. Nebo je možné založit X takovýchto tabulek a po jistém počtu záznamů bude plněna nová záložní tabulka. To je výhodné, protože starší náhledy v originální velikosti byly menší než v současnosti 10-20MB. Není možné stanovit, že pokud chceme záložní tabulku max. velkou např. 20GB je potřebné uložit právě 1mil záznamů. To může platit po starší záznamy, ale rozhodně ne pro novější. Proto, pokud bude tato tabulka pro zálohování u procesu přesunu obálek v originální velikosti použita, je doporučeno vytvořit tabulku podle následujícího create scriptu a po několika záznamech, až tabulka dosáhne Vámi stanovenou velikost ji vyměnit za novou a vyjmenovat ji v proměnné "$TMP_TABLE" ve scriptu. Pokud bude přenos na souborový systém úspěšný je možné všechny tyto záložní tabulky smazat.

CREATE TABLE IF NOT EXISTS `fileblob_orig_zal_X` (
  `id` int(11) NOT NULL,
  `mime` varchar(64) NOT NULL,
  `medium` varchar(64) NOT NULL,
  `content` mediumblob NOT NULL,
  `cover` int(11) unsigned DEFAULT NULL
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
Clone this wiki locally