original in en Atif Ghaffar
en to de Katja Socher
Atif ist ein Cham�leon. Er �ndert seine Rollen von Systemadministrator zu
Programmierer, Lehrer, Projektmanager, zu was auch immer erforderlich ist, um
die Arbeit getan zu kriegen.
Atif denkt, da� er Linux, der Open Source Gemeinde und Projekten, die seine
Lehrer waren, viel schuldet.
Mehr �ber ihn kann auf seiner Homepage gefunden werden
Sollten Fileserver nicht Daten f�r die Kunden verf�gbar machen?
Ja, das sollten sie.
Wenn wir einen Fileserver benutzen, der Dateien �ber NFS oder SMB etc. teilt,
dann haben wir einen Flaschenhals und einen Single Point Of Failure
(Einzelpunkt des Versagens).
Wenn wir Daten �ber GFS teilen mit geteilter Speicherung
(SAN oder MultiChannel SCSI) haben wir einen Speicherkasten als einen
Einzelpunkt des Versagens und es ist sehr teuer, so ein System mit dieser
Konfiguration aufzusetzen.
Wir k�nnen NBD (Network Block Devices) benutzen, um einen Netzwerkspiegel
aufzusetzen, aber ich f�hle mich nicht sehr wohl dabei. NBDs haben ihre Grenzen,
sind schwierig aufzusetzen und zu verwalten und sind einfach zu viel Aufwand,
wenn alles, was man braucht, ein paar replizierte Webserverdaten �ber einige
wenige Webserver sind.
Okay, la�t uns versuchen, Daten zu replizieren.
Hier ist ein Szenario
Du hast zwei Webserver, einen als Hauptserver und den anderen als Backup.
Du machst alle �nderungen auf dem Masterrechner und rsync-st die �nderungen zum
zweiten Rechner.
Einfach?
Aber wie automatisiert man das? Deine Benutzer werden FTP zum Masterrechner
mehrere Male am Tag benutzen. Was passiert, wenn der Masterrechner versagt und
der Backserver �bernimmt? Einfach. Ich habe die Antwort daf�r. Sie sehen die
�nderungen nicht, die sie gemacht haben und sind dar�ber sehr ver�rgert. :)
Nun, du kannst "rsync -av --delete source destination" von CRON alle 5 Sekunden
laufen lassen, aber dann ist dein Rechner nicht mehr wirklich zu etwas anderem
zu gebrauchen, oder?
Hier ist ein weiteres Szenario
Du hast einen FTPserver, um die Daten darauf zu laden und
sechs Webserver, die nach dem round robin Algorithmus darauf antworten.
Deshalb sollten die Daten auf jedem Rechner diesselben sein. Du kannst mit NFS
f�r einige Zeit davon kommen, wenn du Gl�ck hast, aber nicht f�r lange.
Nun, was sollte getan werden?
Ich denke, die Antwort ist "kopiere die Daten zu den Webservern nur dann, wenn
es �nderungen an den Dateien gegeben hat", und wenn es keine �nderungen
an den Daten gibt, mache nichts.
Das ist genau das, was wir durch Benutzen von "fam" tun werden.
So, wie wissen wir, da� es eine �nderung an den Dateien gibt?
Hier ist eine Antwort, die ich von einem M$ Windows Entwickler erwarten w�rde.
Wir k�nnen das Verzeichnis durchsuchen, das wir alle paar Sekunden beobachten
und die Zeitstempel und Gr��e mit der Version, die wir im Cache haben,
vergleichen.
Ja, richtig
Umfrage: Suchen nach Dateizeitstempeln/Gr��e und Vergleichen mit der
�lteren Version ist teuer.
Stell dir vor, da� dein Rechner alle 5 Sekunden "ls -lR /somedirectory" auf
deinem Webserver laufen l��t :)
Der elegante Weg w�re, da� die Datei uns mitteilt, wenn sie sich ge�ndert hat,
so da� wir dann daraufhin handeln k�nnen.
Dies ist genau das, was "IMON" f�r uns macht.
source: http://oss.sgi.com/projects/fam/faq.html
fam, der File Alteration Monitor, liefert ein API, das Applikationen benutzen
k�nnen, um benachrichtigt zu werden, wenn bestimmte Dateien oder Verzeichnisse
ge�ndert wurden.
FAM besteht aus zwei Teilen: fam, der Daemon, der auf Anfragen h�rt und
Benachrichtigungen liefert und libfam, eine Bibliothek, die
Clientapplikationen benutzen k�nnen, um mit FAM zu kommunizieren.
Wenn die beobachteten Dateien von einem remote host gemountet werden, wird der
lokale fam versuchen, fam auf dem remote host zu kontaktieren und die Anfragen
an den remote fam weiterzuleiten.
fam kann auch seine Clients benachrichtigen, wenn eine Datei eine Ausf�hrung
beginnt und stoppt. (Der IRIX Interactive Desktop z.B. benutzt dies, um ein
Programmicon zu �ndern, w�hrend es l�uft.)
fam wurde urspr�nglich 1989 von Bruce Karsh f�r IRIX geschrieben und 1995
von Bob Miller umgeschrieben. Dieser Open-Source Release von fam baut und l�uft
sowohl auf Linux als auch auf IRIX, und ist derselbe fam, der mit
IRIX 6.5.8. dabei ist.
source: http://oss.sgi.com/projects/fam/faq.html
imon, der Inode Monitor, ist der Teil des Kernels, der fam sagt, wenn Dateien
sich ge�ndert haben. Wenn Applikationen fam erz�hlen, da� sie an Dateien oder
Verzeichnissen interessiert sind, leitet fam dieses Interesse an imon weiter.
Wenn Dateioperationen auf Dateien, die von imon beobachtet werden, ausgef�hrt
werden, erz�hlt es der Kernel imon; imon erz�hlt es fam und fam benachrichtigt
die Anwendungen, die an den Dateien interessiert sind.
imon wurde urspr�nglich 1989 von Wiltse Carpenter f�r den IRIX Kernel
geschrieben; die Linuxportierung wurde von Roger Chickering gemacht. Die
Linuximplementation im
imon Kernelpatch ist �berwiegend �hnlich zur IRIXimplementation, aber sie hakt
sich anders im Kerneldateisystem fest.
FAM und IMON sind beide auf der SGI Webseite verf�gbar. Sieh die Ressourcen
unten.
IMON ist ein Patch, den du auf deinen Kernel anwenden kannst. Dies f�gt
M�glichkeiten f�r deinen Kernel hinzu, Inodes zu beobachten.
Um den Kernel zu patchen, cd zu deinem Kernelquellverzeichnis und wende den
Patch an
cd /usr/src/linux
patch -pi < patchfile
dann la� make config oder make menuconfig laufen und w�hle, wenn du danach
gefragt wirst
Inode Monitor (imon) support (EXPERIMENTAL)
Im Dateisystemabschnitt
kompilierst du den Kernel ganz normal und rebootest
(tut mir leid).
FAM selbst zu kompilieren ist ganz einfach.
cd zum fam Quellenverzeichnis und la�
./configure && make all install
laufen
Voila, es ist installiert.
Als n�chstes installieren wir ein Perlmodul namens SGI::FAM, damit wir unseren
event handler in Perl schreiben k�nnen.
Du dachtest nicht wirklich, da� ich dich fragen w�rde, in C/C++ zu
programmieren. Oder?
Nun, ich wei� nichts �ber dich, aber ich bin zu faul und ungeduldig, deshalb
schreibe ich meinen Datenreplizierer in Perl.
Lade es herunter und installiere
SGI::FAM von Jesse N. Glick
Um diese Module zu installieren, la� einfach das CPAN Modul laufen
perl -MCPAN -e shell
install SGI::FAM
dies sollte SGI::FAM installieren und alle n�tigen Module.
fam_mirror ist ein Skript, das ich geschrieben habe, um die
Replizierung zu automatisieren.
Du kannst es hier anschauen
oder herunterladen.
Du kannst es editieren und
$replicaHosts ver�ndern, so da� es zu deinen hosts pa�t,
$rsh �ndern, mit was auch immer f�r einem Befehl, den du von einer
Maschine zur anderen laufen lassen kannst und dasselbe gilt f�r $rsync.
So, zur�ck zu Szenario 1
2 Rechner laufen als Webserver (web1, web2). 1 von ihnen als Master
(web1) und der andere als Slave (web2).
Prim�rer FTPserver ist (web1).
web2 hat �berhaupt keinen FTPdienst laufen. (sonst w�rden die Benutzer
vielleicht versuchen, auf Daten zu schreiben, sogar, wenn das System im
Backupmode ist)
Das web-dokument root ist auf beiden Rechnern /var/www
setup rsh oder ssh. web2 sollte web1
erlauben, remote Befehle laufen zu lassen, ohne Pa�wortabfrage.
Ich f�ge normalerweise meinen ssh_key zu den autorisierten Schl�sseln
des replica Hosts hinzu.
rsync alle Daten von web1 nach web2
rsync -avz /var/www/ web2:/var/www/
Editiere fam_mirror und �ndere @replicaHosts in
@replicaHosts=qw(web2)
La� fam_mirror auf web1 laufen.
fam_mirror /var/www &
und ver�ndere dann die Dateien auf web1. Alle
�nderungen werden auch auf web2 geschrieben.
Jetzt zu Szenario 2 (Eine Farm von Webservern)
Hosts "linuxweb1", "linuxweb2", "linuxweb3" und "linuxweb4" laufen als
Webserver
Host "linuxftp1" l�uft als ftp server (Hauptfileserver)
Webhosts erlauben den Benutzern kein FTP.
Installiere fam, imon, SGI::FAM und fam_mirror auf
host "linuxftp1"
Setze rsh oder ssh zwischen den Rechnern auf.
hosts linuxweb[1-4] sollte linuxftp1 remote Befehle ohne
sofortige Nachfrage nach dem Pa�wort erlauben.
Editiere fam_mirror und setze @replicaHosts zu
@replicaHosts=qw(linuxweb1 linuxweb2 linuxweb3 linuxweb4);
�ndere $rsh und $rsync, wenn n�tig.
Angenommen, da� das webdokument root auf allen Rechnern /var/www ist.
La� auf linuxftp1
INIT_MIRROR=1 fam_mirror /var/www &
laufen
Jetzt sollten alle �nderungen auf linuxftp1 auch auf
linuxweb[1-4]sichtbar sein.