Registrierung
leer
leer
newposts
Users
search
FAQ
Login
Start

Hallo Gast, und Willkommen im Forum. Sie müssen sich einloggen oder registrieren, um alle Funktionen nutzen zu können.


PN's Forum \ Computer \ Software \ Betriebssysteme \ Linux \ Synchronisation zweier Master-Master Server mittels rsync


 Poison Nuke  *

#1 Verfasst am 05.05.2010, um 10:58:17



Hallo,

in diesem Thread:

http://forum.poisonnuke.de/index.php?action=ViewThread&TID=3559

hab ich die Master-Master Replikation mittels MySQL beschrieben, damit man zwei parallel arbeitendende Server über DNS Round Robin nutzen kann, also die einfachste Form der Hochverfügbarkeit mit nur zwei Servern.


Da man normalerweise nicht nur MySQL Daten hat sondern auch Dateien (Bilderuploads, Änderungen am Quellcode der Seiten usw), muss auch der Dateibestand beider Server synchron gehalten werden.
Dies geht am einfachsten mit dem unter Linux verfügbaren "rsync", eins der mächtigsten Tools zur Synchronisation von Datenbeständen uvm.



vorher erstmal einige Vorüberlegungen:

Ausgangssituation, wir haben zwei Server mit identischem Datenbestand. Woher können nun alles Daten kommen?

1. Manuelles Update der Sites und Dateien durch den Administrator
2. Upload von Dateien durch den User
3. (automatisches Backup)


im ersten Fall wird es sinn machen, wenn man einen Masterserver und einen "slave" Server hat. Im Fall vom Forum ist dies "master.poisonnuke.de" und "backup.poisonnuke.de". Der Masterserver ist für mich also der, den ich immer anspreche wenn ich neue Dateien habe oder wenn ich Änderungen an den Scripten durchführe.
Somit muss also nur der zweite Server regelmäßig den Datenbestand mit dem Masterserver synchronisieren.


Im Falle des Uploads teilt sich aber das ganze auf beide Server auf. Man halt also ein Uploadverzeichnis, dass sich beide Server gegenseitig synchronisieren müssen und hier treten dann Probleme auf:
Normalerweise sucht rsync nach den aktuellsten und neusten Dateien beim Sync. Wenn nun lokal eine Datei nicht vorhanden ist, die aber auf dem anderen vorhanden ist, dann wird sie kopiert weil man davon ausgeht, dass die Datei neu hochgeladen wurde.
Wenn nun aber eine Datei gelöscht wurde, dann ist sie lokal nicht vorhanden, rsync würde sie aber vom anderen System wiederherstellen.

Man könnte nun eins machen, dass man vorher den Timestamp der Datei des anderen Server prüft, ist dieser zu alt, dann wird die Datei nicht übertragen. Die Datei bleibt aber weiterhin auf dem Remotserver bestehen und es birgt das Risiko, dass ein Server nach einem Ausfall nicht die neuen Dateien überträgt die der andere Server in der Zeit angelegt hat.

Ergo muss man das Löschen von Dateien dann entweder manuell machen oder ein Script schreiben dass sich erstmal selbt auf beide Server synchronisiert und welches dann von einem eigenen Prozess abgearbeitet wird. Dazu später mehr.



Zu Punkt 3:
Wenn einem die Datensicherheit von zwei Servern nicht hoch genug ist und man ein Backup auf einen weiteren Server oder den Heimrechner macht, dann müssen die Backupdateien beider Server möglichst gleich sein. Bei zwei Server bietet es sich aufgrund der Last durch ein MySQL Dump an, wenn die Server das immer verteilt machen. Der eine Server zu jeder geraden Stunde, der andere zu jeder ungeraden Stunde z.B. Nun muss aber das Backup der anderen Stunden auf den jeweils anderen Server synchronisiert werden. Dies verhält sich grundsätzlich ähnlich wie das Synchronisieren der Uploadverzeichnisse.





Synchronisation der Masterverzeichnisse auf den Backupserver

grundlegend mach ich den rsync über SSH. Es muss also der Login per SSH-Key möglich sein von dem jeweils anderen Server auf den anderen mit dem User der für die Dateien verantwortlich ist und dem das Verzeichnis gehört.

Es wird mit dem eingeloggten User ein Crontab (crontab -e) erstellt:

Quellcode
*/5 * * * * rsync -auve 'ssh -p xxx' master.poisonnuke.de:/remoteverzeichnis/ /lokalesverzeichnis/


Das Updateintervall beträgt hier 5min, es kann aber auch kleiner eingestellt werden, jenachdem wie viel los ist, weniger als 2min ist aber normalerweise nicht nötig, da es auch die Last der Systeme bei vielen Dateien erhöht, bzw es kann dazu kommen dass sich zwei rsyncs überschneiden, wenn große Datenbestände hochgeladen wurden.

folgende Optionen werden für rsync verwendet:

-a = archive (rekursiv, Dateieigenschaften werden beibehalten)
-u = update (es werden nur neue oder geänderte Dateien übertragen)
-v = verbose (nicht unbedingt nötig, gibt einem vorallem für manuelle Testläufe eventuelle Probleme aus)
-e = welches Protokoll, in dem Fall SSH, was in Anführungszeichen geschrieben ist. Wenn SSH einen anderen Port verwendet kann der wie oben geschrieben mit angegeben werden.


auf diese Weise werden sämtliche Verzeichnisse des Masters auf den zweiten Server übertragen.



Die Rückwärtssynchronisation des Backup auf den Master sieht etwas anders aus, weil hier soll nur das Uploadverzeichnis synchronisiert werden:

Quellcode
*/5 * * * *  rsync -auve 'ssh -p xxx' backup.poisonnuke.de:/remoteverzeichnis/upload/ /lokalesverzeichnis/upload/




Auf diese Weise sind nun die Datenbestände beider Server synchron, solange keine Dateien gelöscht werden.






Löschen von Dateien
um nun auch eine Dateilöschung zu synchronisieren, ohne dass es unmöglich wird, neue Dateien hochzuladen, muss man dies auf zwei Arten machen:

wenn Dateien per FTP oder so gelöscht werden sollen, bleibt nichts anderes übrig, als dies manuell auf beiden Servern gleichzeitig zu machen. Glücklicherweise sollte man auf einem Server eh keine Daten löschen, wenn diese einmal irgendwo verlinkt waren, denn dies ist eins der größten Probleme im Internet, irgendwelche Admins die einfach nach ein paar Monaten Dateien löschen nur weil sie sie selbst nicht mehr brauchen, dass dadurch aber auf zig Seiten die das vllt mal verlinkt hatten, dann der link nicht mehr geht und viele User dann wieder lustige 404 Fehler sehen, wissen die wenigsten Admins. Daher sollte das auch nicht automatisiert werden!


Für Uploadverzeichnisse sollte es ebenfalls keine Löschfunktion für den User selbst geben !
genau aus dem obigen Grund. Allerdings sollte der Admin löschen können, wenn es doch mal nötig ist (anstößiges Material, oder User hatte beim hochladen einen Fehler gemacht).

Um das zu realisieren lässt man von PHP im Uploadverzeichnis eine einfache Textdatei erstellen, bzw die ist immer vorhanden. Wenn eine Datei gelöscht werden soll, hängt PHP an diese Datei eine neue Zeile mit dem Namen der Datei an.

als nächstes schreibt man ein Shellscript, welches regelmäßig (alle 10min reicht normalerweise) per Cronjob aufgerufen wird, dieses ließt die Datei aus und löscht dann die Dateien. Diese Script sollte allerdings zeitgleich auf beiden Servern laufen, wenige Sekunden nach der letzten Synchronisierung.

Das Script selbst liefere ich dann später noch nach.


greetz
Poison Nuke

PN's Forum \ Computer \ Software \ Betriebssysteme \ Linux \ Synchronisation zweier Master-Master Server mittels rsync


- Zurück zur Homepage - Eigene Beiträge - Neue Beiträge - Wer ist online? - Impressum - Datenschutz - Statistiken -



Board coded and provided by: Poison Nuke
Copyright 2007-2014, Robert Menger