Nástroj rsync a jeho (ne)výhody
Snad každý, kdo někdy v Linuxu synchronizoval nějaké adresářové stromy, zná tradiční nástroj rsync. Ten porovnává soubory ve stromech a pomocí přenosu změn provede synchronizaci podle požadavků.
Rsync může pracovat jak lokálně (mezi různými místy adresářového stromu), tak i vzdáleně – typicky běží jako démon na portu 873, lze ho ale také spouštět například přes inetd/xinetd. Dokáže pracovat i přes SSH a zajistit tak šifrování přenosu (i když lze využít například také stunnel).
Typicky se pak synchronizace spouští periodicky, v intervalu podle potřeby. Pokud je ale souborů hodně a současně je potřeba rychle reagovat na jejich změny (které přitom nemusejí nastávat moc často), způsobuje rsync poměrně významnou zátěž a oba stroje znatelně brzdit. Proto je žádoucí použít něco jiného.
Co je Lsyncd
Již poměrně dlouho existuje v linuxovém jádře technologie inotify, která umožňuje efektivně sledovat změny souborů (čekat na ně například pomocí volání epoll()
) a reagovat na ně. Pokud například dojde k zápisu do souboru (nebo vytvoření nového souboru v adresáři, smazání souboru apod.), proces sledující změny v souborech získá informace o události.
Právě inotify lze velmi efektivně využít pro synchronizaci souborů na základě změn. Nástrojů na to existuje více, jedním z nich je Lsyncd, na nějž se podíváme blíže. Lsyncd podporuje synchronizaci místní i vzdálenou a je implementován tak, aby synchronizoval efektivně.
Lsyncd podporuje tři druhy přenosu: přímý, rsync a rsyncssh. První se hodí pro synchronizaci místních adresářových stromů. Lsyncd pro prvotní synchronizaci využije vnitřně rsync, ale pak už používá standardní systémové příkazy, takže například přesun souboru je velmi rychlý.
Pro vzdálenou synchronizaci se používá buď přenos rsync nebo rsyncssh. Druhý z nich je efektivnější, protože při přesunu nepřenáší data znovu, místo toho soubor přímo přesune v rámci cílového stromu. Ať už se ale použije kterákoli metoda, pro přístup na vzdálený stroj se vždy používá SSH (nikoli rsync běžící jako démon).
Synchronizační mechanismy si lze ale také úplně přepsat podle svého, přestože to asi nebude úplně častá věc.
Pokud by Lsyncd reagoval přímo na jednotlivé události, nebyla by synchronizace efektivní, protože takových událostí – zejména při postupném zápisu do souboru – může nastávat velmi mnoho. Proto se vždycky chvilku čeká na případné další události, aby se pak změny provedly hromadně. Navíc výchozím chováním je synchronizace až po uzavření souboru otevřeného k zápisu.
Lsyncd lze ve velmi širokých mezích přizpůsobovat konkrétním potřebám, a to prostřednictvím argumentů příkazové řádky a hlavně konfiguračního souboru, který se píše v jazyce Lua a lze si tak vytvářet celé programy pro synchronizaci (ale není to nutnost, mnohdy si lze vystačit i s výchozí konfigurací nebo malými změnami).
Kde Lsyncd získat
Nejlepší situace je tam, kde existují balíčky přímo pro danou linuxovou distribuci. Například Debian, Ubuntu nebo Fedora mají balíčky ve standardních repozitářích, takže je stačí nainstalovat běžným nástrojem. Tam, kde balíčky nejsou, si lze stáhnout zdrojové kódy a zkompilovat je pomocí cmake
a make
.
Jak synchronizovat data
Použití je velmi jednoduché. Stačí uvést metodu synchronizace, zdrojový a cílový adresář:
lsyncd -direct /var/backups /mnt/backup
V tomto případě se použije metoda direct
, tedy přímé příkazy na místním souborovém systému. Lsyncd se spustí jako démon a až do svého ukončení bude synchronizovat data z adresáře /var/backups
do adresáře /mnt/backup
. Projeví se veškeré změny ve struktuře zdrojového stromu a jeho souborech, naopak se neprojeví změny atributů (například vlastníků nebo oprávnění).
Lsyncd lze spustit i na popředí, což se hodí pro ladění, protože ho lze snadno ukončit a zprávy vypisuje přímo do konzole. Současně s tím lze i změnit úroveň logování – následující příkaz způsobí, že bude logovat všechno (a Lsyncd poběží na popředí):
lsyncd -nodaemon -log all -direct /var/backups /mnt/backup
Synchronizační metodu rsync
lze použít i lokálně, ale významnější je pro případy, kdy se data přenášejí na vzdálený stroj. Pak by příkaz vypadal například takto:
lsyncd -rsync /var/backups backup@backupserver:/backup
Lsyncd se přihlásí přes SSH jako uživatel backup
na server backupserver
(samozřejmě to předpokládá, aby byl připraven klíč – ať už přímo nebo přes agenta – povolený na serveru, případně aby se zadalo heslo pro přihlášení) a synchronizuje data pomocí metody rsync
. Obdobně by se použila metoda rsyncssh
, jen syntaxe bude mírně jiná (místo oddělující dvojtečky mezera):
lsyncd -rsyncssh /var/backups backup@backupserver /backup
Zajímavé může být nastavit si zpoždění začátku synchronizace (výchozí hodnota se liší podle verze a případně úpravy pro distribuční balíček). Čím vyšší hodnota, tím vyšší efektivita – lze nastavit třeba minutu, pokud to nebude ničemu vadit:
lsyncd -delay 60 -direct /var/backups /mnt/backup
Konfigurace
Pomocí konfiguračního souboru lze mnohem detailněji ovlivnit fungování Lsyncd. Někdy v budoucnu se podíváme na to, co všechno s tím lze dělat.