Instant data kopiëren onder Linux.

ArticleCategory:

System Administration

AuthorImage:

[Photo of the Author]

TranslationInfo:

original in en Atif Ghaffar

en to nl Tom Uijldert

AboutTheAuthor:

Atif is een kameleon. Hij veranderd van rol, van systeembeheerder naar programmeur naar leraar naar projectleider, al naar gelang het werk vereist.
Atif is van mening dat hij veel aan Linux en de open source gemeenschap met zijn projecten te danken heeft vanwege de leerzame ervaringen.
Je kunt meer over hem vinden op zijn homepage.

Abstract:

In dit artikel onderzoeken we het instant kopiëren van data onder Linux zonder gebruik te maken van dure oplossingen als SAN (Storage Area Network zoals GFS) of andere apparaten met bloksgewijze netwerktoegang. We zullen FAM en IMON gebruiken voor het kopiëren.
FAM (File Alteration Monitor) en IMON (Inode monitor) zijn oorspronkelijk door SGI ontwikkeld voor IRIX.

De mensen van SGI hebben een prima keuze gedaan door het op Linux te zetten en er open source van te maken.

Als geld geen rol speelt zou ik voor GFS (Global File System) of een op SAN gebaseerde oplossing gaan maar als kosten een belangrijke overweging zijn en je wilt toch data spiegelen dan zijn er weinig keuzes.
Ik heb een aantal keuzes hier op een rij. In dit artikel zullen we ze bespreken en de voor- en nadelen bekijken.

ArticleIllustration:

[Illustratie]

ArticleBody:

Waarom kopiëren en niet gewoon delen?

Zijn bestandsservers niet bedoeld voor het beschikbaar maken van data aan clients?
Jazeker

Als we echter data van bestandsservers beschikbaar maken over NFS of SMB dan creëren we een knelpunt en een single point of failure (één foutgevoelige plek of achilleshiel in het systeem).

Als we data over GFS delen met gedeelde opslag (SAN of Multichannel SCSI) dan is de doos voor opslag hier de Achilleshiel en bovendien is het heel duur om een dergelijk systeem op te zetten.

We kunnen NBD (Network Block Devices) gebruiken om via het netwerk data te kopiëren, maar ik ben niet gecharmeerd van een dergelijke oplossing. NBD's hebben hun beperkingen, zijn moeilijk te implementeren en onderhouden en gewoon te veel moeite als je alleen maar wat webserver data over verschillende webservers wil kopiëren.

Hou 't simpel

Ok, laten we het kopiëren eens proberen:
Hier is een scenario
Je hebt 2 webservers, één server om het werk te doen en één als reserve.
Je brengt alle veranderingen aan op de server en voert deze door op de reserve via een rsync.
Simpel?
Maar hoe dit nu te automatiseren? Je gebruikers zullen meerdere malen per dag met FTP data veranderen. Wat gebeurt er nu als de server plat gaat en de reserve neemt het werk over?
Ik heb hier een eenvoudig antwoordt op. Ze zullen hun veranderingen niet zien en daar behoorlijk geïrriteerd over zijn :)
Je kunt natuurlijk iedere 5 seconden vanuit cron een $ rsync -av --delete source destination draaien maar dan zul je de machine niet bepaald voor nog iets anders kunnen gebruiken, niet?

Hier nog een ander scenario
Je hebt één FTP server voor het deponeren van data en zes webservers die om de beurt de rest van het verkeer afhandelen.
De data op iedere machine moet dan hetzelfde zijn. Je kunt hier voor een korte tijd met NFS wegkomen als je geluk hebt, maar dat zal niet lang duren.

Dus, wat moeten we doen?
Ik denk dat het antwoord als volgt is: "Kopieer alleen die data naar de webservers die veranderd is". En data die niet veranderd is kopieer je niet.

Dat zullen we nu precies gaan doen met "FAM".

Hou 't slim

Hoe weten we nu dat data veranderd is?
Hier een antwoord wat ik verwacht van een Windows ontwikkelaar.
We doorzoeken de betreffende directory iedere paar seconden en onderzoeken de datum en grootte van de bestanden op veranderingen in vergelijking met onze cache.
Jaja

Polling: het regelmatig vergelijken van datum en grootte van bestanden met oudere versies is een dure oplossing. Stel je maar eens voor dat je webserver iedere 5 seconden het commando "ls -lR/eendirectory" uitvoert :)

De elegante oplossing zou zijn dat het bestand ons vertelt wanneer het is veranderd, zodat we daarop actie kunnen ondernemen. Dat is nou precies wat "IMON" voor ons doet.

Wat is FAM?

Link: http://oss.sgi.com/projects/fam/faq.html
FAM, of File Attention Monitor, heeft een koppeling die door toepassingen kunnen worden gebruikt om een seintje te krijgen wanneer bepaalde bestanden of directories zijn veranderd.
FAM bestaat uit 2 delen: fam, de daemon die een verzoek afhandelt en het seintje geeft, en libfam, de koppeling die toepassingen kunnen gebruiken voor het communiceren met FAM.
Als de te controleren bestanden op een andere machine staan, dan zal de lokale fam contact opnemen met die op de andere machine en alle verzoeken daar naartoe doorspelen.
fam kan clients ook een seintje geven wanneer een bestand wordt uitgevoerd en wanneer het stopt met uitvoeren (De IRIX Interactive Desktop gebruikt dit bijvoorbeeld om het icoon van een programma te veranderen als dit wordt uitgevoerd).
fam is van origine voor IRIX in 1989 geschreven door Bruce Karsh en is herschreven in 1995 door Bob Miller. Deze open source versie van fam is geschikt voor zowel Linux als IRIX en is dezelfde als die in IRIX 6.5.8.

Wat is IMON?

Link: http://oss.sgi.com/projects/fam/faq.html
imon, de Inode Monitor, is het stuk van de kernel wat fam vertelt wanneer een bestand veranderd is. Wanneer toepassingen aan fam meedelen in welke bestanden en directories ze geïnteresseerd zijn, dan zal fam deze informatie doorspelen aan imon. Wanneer deze bestanden en directories worden veranderd dan zal de kernel imon hiervan op de hoogte stellen. Op zijn beurt speelt imon deze informatie door aan fam, die het op zijn beurt zal distribueren naar alle toepassingen die hiervoor interesse hebben getoond.
imon is van origine in 1989 voor Irix geschreven door Wiltse Carpenter. Overzetten op Linux is gedaan door Roger Chickering. De Linux implementatie van de kernel veranderingen wijkt niet veel af van de implementatie op IRIX, maar het haakt op een andere manier aan in de kernel bestandscode.

Het installeren van FAM en IMON

Beide programma's zijn beschikbaar op de website van SGI. Zie de referenties aan het eind van dit artikel.
IMON is een patch op de kernel. Hiermee krijg je de mogelijkheid in de kernel om veranderingen op inodes in de gaten te houden.
Doe een cd naar de directory van je kernel boncode en installeer de patch:
$ cd /usr/src/linux
$ patch -p < patchbestand

Voer nu $ make config of $ make menuconfig uit en kies de volgende optie: inode Monitor (imon) support (EXPERIMENTAL) in het Filesystems-gedeelte.
Compileer de kernel opnieuw en herstart (sorry) de machine.
Het compileren van FAM is eenvoudig. Doe een cd naar de broncode en geef het commando $ ./configure && make all install. Ziedaar, alles geïnstalleerd.

Vervolgens installeren we een Perl-module met de naam SGI::FAM, zodat we het geheel in Perl kunnen schrijven.

Het installeren van de SGI::PAM module

Je dacht toch niet dat ik je ging vragen het in C/C++ te doen, wel?
Ik weet niet hoe jij er over denkt maar persoonlijk ben ik te lui en ongeduldig, dus schrijf ik mijn spiegel-programma met Perl.

Haal SGI::FAM (door Jesse N. Glick) van het net en installeer het. Voer de CPAN module uit om dit te installeren, als volgt:

$ perl -MCPAN -e shell
$ install SGI::FAM
Hiermee zou SGI::FAM en verdere relevante modules geïnstalleerd moeten zijn.

Kopiëren met fam_mirror

fam_mirror is het script wat ik heb gemaakt voor het automatisch kopiëren van gewijzigde bestanden. Je kunt het hier bekijken of hier ophalen.
Je kunt dit vervolgens wijzigen door $replicaHosts aan te passen op jouw configuratie en mogelijk $rsh te wijzigen in wat voor commando je dan ook gebruikt om iets op een andere machine uit te voeren. Idem voor rsync.

En nu terug naar scenario 1
2 machines als webservers (web1 en web2). Eén als primaire server (web1) en de andere als reserve (web2). Primaire FTP-server is web1. web2 doet niet aan FTP (anders gaan gebruikers ook bestanden schrijven terwijl het systeem op z'n reserve draait).

Het startdocument op het web is voor beide machines /var/www.
Configureer rsh of ssh op beide machines. web2 moet toestemming verlenen aan web1 om van afstand commando's te kunnen geven zonder dat er een wachtwoord nodig is. Meestal doe ik dat door mijn ssh_key toe te voegen aan de authorized_keys van replicaHosts.
Doe een rsync van alle data van web1 naar web2:

$ rsync -avz /var/www web2:/var/www
Verander fam_mirror door @replicaHosts te vervangen door @replicaHosts=qw(web2);.
Start fam_mirror op web1:
$ fam_mirror /var/www &
en wijzig vervolgens bestanden op web1. Deze veranderingen zullen ook door worden gevoerd op web2.

En nu dan scenario 2 (een aantal webservers).
We hebben machines "linuxweb1", "linuxweb2", "linuxweb3" en "linuxweb4" als webservers. Machine "linuxftp1" is de ftp server (primaire bestandsserver). De webmachines staan geen ftp toe aan gebruikers.
Installeer fam, imon, SGI::FAM en fam_mirror op de "linuxftp1" machine. Configureer vervolgens rsh of ssh voor alle machines.
linuxweb[1-4] moeten daarbij linuxftp1 toestemming verlenen om commando's op hun machines uit te voeren zonder het ingeven van een wachtwoord.
Wijzig fam_mirror en laat @replicaHosts verwijzen naar: @replicaHosts=qw(linuxweb1 linuxweb2 linuxweb3 linuxweb4);.
Wijzig $rsh en $rsync indien nodig. Aannemende dat het startdocument wederom in /var/www is te vinden op alle machines, geef het volgende commando op linuxftp1:

$ INIT_MIRROR=1 fam_mirror /var/www &

Alle veranderingen op linuxftp1 zouden nu te zien moeten zijn op linuxweb[1-4].

Referenties

Bekende problemen

Ik heb gemerkt dat de oplossing, hier gegeven, een probleempje heeft: het werkt niet voor grote directories (directories met 4 of 5 duizend sub directories). De kernel gaat klagen over kmalloc en zo.
Ik werk aan een oplossing. Zodra ik die heb zal ik hem verwerken in het artikel. Laat het me even weten wanneer je al een oplossing hebt.