Hlavní navigace

Synchronizujeme se zsync aneb rsync po běžném HTTP

9. 3. 2010
Doba čtení: 6 minut

Sdílet

Protokol rsync pravděpodobně znáte. Umožňuje synchronizovat soubory tak, že využívá co nejvíce starších dat, která má uživatel už na disku a tím výrazně šetří přenosové kapacity a pracuje velmi rychle. Velmi často ale potřebujeme rsync tam, kde prostě nemůžeme spustit příslušný software. K tomu je tu zsync.

Rsync je fajn, ale…

Rsync je velmi šikovný nástroj urychlující přenos dat. Jen ve zkratce k tomu, jak funguje: Pracuje v režimu klient-server, přičemž klient požádá o synchronizaci souboru, jehož starší verzi už má na disku. Společně se serverem se dohodnou na velikosti bloků, na které soubory na obou stranách „rozsekají“. Poté si začnou vyměňovat kontrolní součty těchto bloků a pokud se některý liší, server jej pošle klientovi. Ten si tak může poskládat u sebe stejnou verzi, která je na serveru. Tolik zjednodušeně k principu, více se dočtete v článku Pokročilé zálohování s Rsync.

Pro běžného uživatele se potřeba použití rsync projeví ve chvíli, kdy po relativně dlouhém stahování souboru zjistíme, že je poškozený. Stává se to například při stahování instalačních obrazů naší oblíbené distribuce. Za normálních okolností by bylo potřeba začít celé stahování znovu, ale rsync umí vše opravit během několika sekund. Stejně tak je možné starší obraz výrazně rychleji aktualizovat, umí to například některá zrcadla Ubuntu.

Problémem rsync je ale fakt, že musíme mít spuštěný už zmíněný rsync server. Pokud máme vlastní stroj, pak to obvykle není problém, ale v případě že hostujeme náš projekt na nějakém běžném hostingu, asi nám nikdo takovouto doplňkovou službu instalovat nebude. Naštěstí existuje velmi elegantní řešení, kterým je projekt zsync.

Jak funguje zsync?

To hlavní v jedné větě: zsync umí v principu totéž jako rsync, ale nevyžaduje speciální podporu na druhé straně. Samozřejmě neumí synchronizaci směrem na server, ale poslouží v situaci, kdy chcete nabídnout jednosměrný sync od serveru k uživateli. K přenosu používá jednoduše klasický HTTP protokol, kterým zvládne vše. Můžete ho tedy provozovat téměř všude.

Aplikace zsync funguje tak, že si vytvoří pomocný soubor s příponou .zsync, do kterého si předem uloží informace o hlavním stahovaném souboru. To znamená název, cestu k němu, kontrolní součet a především kontrolní součty všech bloků tohoto souboru. V případě, že chcete tento soubor synchronizovat, klientská aplikace si nejprve stáhne kontrolní soubor (ten má obvykle 0,2 – 0,3 % originálu) a podle něj se pak rozhodne, které části si potřebuje z HTTP serveru stáhnout.

Jedinou podmínkou fungování zsync je, aby použitý HTTP server uměl navazovaná spojení, to už ale dnes u moderních serverů není problém. Klient si pak jen řekne, od kterého bajtu chce začít stahovat a ve správnou chvíli pak stahování utne. Vše je kontrolováno kontrolními součty jednotlivých bloků i finálního souboru, nakonec se tak může aplikace ujistit, že vše proběhlo správně.

Praktická ukázka s příkladem

Abyste si vše mohli vyzkoušet, připravil jsem pro vás příkladový soubor, který si můžete zasynchronizovat pomocí zsync. Nejprve si nainstalujte stejnojmenný balíček. Pravděpodobně bude ve vaší distribuci (v Debianu i Ubuntu je) a má něco málo přes 100 KB.

Součástí balíčku je samotná klientská utilita zsync, ale také program zsyncmake pro tvorbu kontrolního souboru. K ní se dostaneme později.

Jako testovací soubor jsem vybral 10MB obraz linuxové distribuce Tiny Core Linux. Soubor je k dispozici na našem HTTP souborovém serveru a můžete si jej normálně stáhnout z adresy:

http://i.iinfo.cz/files/root/240/tinycore.iso

K dispozici je samozřejmě i kontrolní soubor, který sice leží v jiném adresáři, ale to vůbec nevadí. Jeho součástí je i cesta k originálnímu souboru. Můžete se přesvědčit:

http://i.iinfo.cz/files/root/261/tinycore-zsync.zsync

Oba soubory jsou dostupné skrze HTTP, takže je můžete stáhnout pomocí utility wget nebo normálně v prohlížeči. Pokud chcete provést synchronizaci (tedy vlastně úvodní stažení), spustíte jednoduše:

$ zsync http://i.iinfo.cz/files/root/261/tinycore-zsync.zsync
#################### 100.0% 0.0 kBps DONE

No relevent local data found - I will be downloading the whole file. If
that's not what you want, CTRL-C out. You should specify the local file is
the old version of the file to download with -i (you might have to
decompress it with gzip -d first). Or perhaps you just have no data that
helps download the file

downloading from http://i.iinfo.cz/files/root/240/tinycore.iso:
#################### 100.0% 882.2 kBps DONE

verifying download...checksum matches OK
used 0 local, fetched 11483448

Vidíte, že utilita nejprve stáhla kontrolní součet a pak oznámila, že žádný stejnojmenný soubor na disku (v aktuálním adresáři) nemáte a tak proběhne klasické stažení. Stalo se a na konci vidíte statistiku, která říká, že bylo použito 0 bajtů lokálních dat a získáno bylo 10 MB nových dat ze serveru. Můžeme zkusit akci hned zopakovat:

$  zsync http://i.iinfo.cz/files/root/261/tinycore-zsync.zsync
#################### 100.0% 0.0 kBps DONE

Read tinycore.iso. Target 100.0% complete.
verifying download...checksum matches OK
used 11483136 local, fetched 0

Opět byl stažen kontrolní soubor a utilita poznala, že kontrolní součet sedí a není tedy potřeba stahovat nic. Finální statistika pak znovu říká, že bylo použito 10 MB lokálních dat a nic nebylo staženo.

V rámci hry můžete zkusit soubor nějak poškodit. Já jsem jej otevřel v programu mcedit a v režimu přepisu i přidávání jsem do něj nasypal z klávesnice hromádku náhodných znaků asi na dvaceti místech. Opět náš oblíbený příkaz:

$ zsync http://i.iinfo.cz/files/root/261/tinycore-zsync.zsync
#################### 100.0% 0.0 kBps DONE

Read tinycore.iso. Target 99.6% complete.
downloading from http://i.iinfo.cz/files/root/240/tinycore.iso:
#################### 100.0% 0.0 kBps DONE

verifying download...checksum matches OK
used 11442176 local, fetched 42575

Teď teprve proběhla správná synchronizace, protože program zjistil, že se oba soubory liší. Bylo tedy potřeba pro opravu stáhnout asi 40 KB dat, tedy asi 0,4 % velikosti originálního souboru.

Jak si vytvořit kontrolní soubor

K vytvoření kontrolního souboru slouží už zmíněná utilita zsyncmake, jejíž ovládání je velmi jednoduché. Jediným povinným parametrem je jméno souboru, ze kterého budou počítány kontrolní součty. Pokud neuvedeme parametr -u s URL, na které bude soubor na serveru viditelný, bude aplikace předpokládat, že budou ve stejném adresáři.

K dispozici je také zajímavý parametr -b, kterým je možné ovlivnit velikost bloků, na které bude soubor rozdělen. Pokud ji nezvolíte sami, program podle velikosti hlavního souboru sám zvolí 2048 nebo 4096 bajtů. Pokud máte pocit, že vám tato hodnota nevyhovuje, můžete si zvolit libovolnou jinou, ale číslo musí být mocninou dvojky. Větší bloky přinášejí menší velikost kontrolního souboru, ale naopak zvětšují množství přenášených dat při synchronizaci.

Kontrolní soubor tedy můžete vytvořit například takto:

root_podpora

$ zsyncmake -u http://mujweb.cz/soubory/obraz.iso -b 8192 obraz.iso

Závěrem aneb příjemnou zsynchronizaci

Velkou výhodou zsync je právě ta vlastnost, že celý systém nevyžaduje žádnou speciální podporu na straně serveru. Toho využívá například Ubuntu, které už nějakou dobu soubory .zsync na svých zrcadlech nabízí. Podpora se navíc zaváděla velmi jednoduše – kontrolní soubory stačí vytvořit na hlavním serveru a zrcadla si je už stáhnou automaticky k sobě na disk. Protože v nich nejsou uvedené absolutní cesty, fungují proti libovolnému serveru, na kterém je i samotný ISO obraz Ubuntu.

Program zsync je samozřejmě možné využít i jiným způsobem, například k jednoduché distribuci databáze balíčků (jako Portage v Gentoo) nebo jiných souborů, které se často mění a vy potřebujete rychle dostat změny k uživatelům a zbytečně nezatěžovat linky.

Byl pro vás článek přínosný?

Autor článku

Petr Krčmář pracuje jako šéfredaktor serveru Root.cz. Studoval počítače a média, takže je rozpolcen mezi dva obory. Snaží se dělat obojí, jak nejlépe umí.