Gibt es eine Möglichkeit, zwei Server unter Ubuntu zu spiegeln?

8

Ich habe mich gefragt, ob es möglich ist, zwei Server zu spiegeln, so wie Sie Dateien auf einen Server hochladen könnten und sie auf den anderen Server übertragen würden usw. Ich bin neugieriger auf die Dateispiegelung, sie muss nicht die Paketverwaltung spiegeln und Setup (Aber das wäre auch cool!)

Kyle
quelle
Dateispiegelung: Gluster oder DRDB; Website-Spiegelung: Lack oder HAProxy; DB Mirroring: MySQL Circular Replication oder Postgres Replication.; - Die meisten Serverpakete verfügen über einen Cluster-Betriebsmodus, oder es gibt Reverse-Proxys, mit denen Sie dies tun können.
Tom O'Connor

Antworten:

6

Es kommt sehr auf den jeweiligen Job an.

Warum brauchen Sie eine Dateispiegelung? Möchten Sie so etwas wie eine Website oder ein Content-Repository aktualisieren, wo es normalerweise in Ordnung ist, regelmäßig zu aktualisieren? Oder benötigen Sie eine Echtzeitsynchronisation von Daten?

Für die regelmäßige asynchrone Spiegelung von Dateien ist es normalerweise ausreichend, über einen Staging-Bereich zu verfügen, in den Sie alle Ihre Daten hochladen. Und von wo aus Sie es an die Server verteilen. In Ihrem Fall - mit zwei Servern - können Sie auf srv1 ein Staging-Fileshare erstellen, in das Sie die Daten übertragen (über FTP, NFS, DAV, SFTP usw.), und dann die Dateien per Cronjob in die "Live" -Verzeichnisse von synchronisieren srv1 und srv2. In diesem Fall können Sie rsync am einfachsten verwenden, indem Sie ein ssh-Schlüsselpaar generieren, das Sie für die Datenübertragung verwenden und das auf allen Servern in Ihrem Cluster autorisiert ist.

Beispiel:

srv1:/data/staging/  <= is where you upload your data
srv1:/data/production/ <= is where your servers get their production data from
srv2:/data/production/

srv1$ cat /etc/cron.d/syncdata.cron
=====
*/5 * * * * syncuser rsync -a --delete /data/staging/ /data/production/
*/5 * * * * syncuser rsync -az --delete -e ssh /data/staging/ srv2:/data/production/
=====

Dies sollte Ihnen eine Grundidee geben. Natürlich möchten Sie die rsync-Aufrufe in einige Skripte einschließen und eine ordnungsgemäße Sperre implementieren, damit sie nicht zweimal ausgeführt wird, falls die Synchronisierung länger als 5 Minuten dauert usw. Außerdem ist es selbstverständlich, dass ein Staging-Bereich nicht obligatorisch ist. Sie können auch srv1: Produktion direkt mit srv2: Produktion synchronisieren. Nur als srv2 könnten Daten angezeigt werden, die bis zu 5 Minuten älter sind als die von srv1. Welches könnte ein Problem sein, abhängig davon, wie Sie zwischen den beiden balancieren.

Eine andere Möglichkeit, Dateien asynchron zu verteilen, besteht darin, sie als RPM- oder in Ihrem Fall als Deb-Dateien zu verpacken. Stellen Sie diese in ein zentrales Repository und lassen Sie sie über etwas wie cfengine, monkey oder eine auf DIY-Nachrichtenbussen basierende Lösung installieren / aktualisieren. Dies hat den netten Nebeneffekt der Versionierung der bereitgestellten Daten, ist jedoch nur für kleinere Datenmengen geeignet, die Sie selbst erstellen und bereitstellen (wie Versionen Ihrer eigenen Software). Sie möchten damit keine TBs an Daten verteilen, und es ist auch nicht geeignet, Inhalte zu spiegeln, die sich wie jede zweite Minute oder so mit hoher Häufigkeit ändern.

Wenn Sie Daten nahezu in Echtzeit replizieren müssen, aber nicht unbedingt synchron, anstatt von Zeit zu Zeit einen Cron aufzurufen, können Sie Ihre Synchronisierungsskripte mit einer auf Inotify basierenden Methode wie dem bereits erwähnten Incron aufrufen. Eine andere Möglichkeit besteht darin, Gamin zu verwenden (das auch inotify verwendet, wenn es im Kernel vorhanden ist) und Ihren eigenen kleinen Synchronisierungsdämon zu schreiben. Wenn nicht alle Dateien über z. B. SFTP auf einen Server hochgeladen werden, können Sie überprüfen, ob Sie mit Ihrem SFTP-Server Hooks definieren können, die nach bestimmten Ereignissen aufgerufen werden, z. B. beim Hochladen von Dateien. Auf diese Weise können Sie Ihren Server anweisen, Ihr Synchronisierungsskript auszulösen, wenn neue Daten hochgeladen werden.

Wenn Sie eine synchrone Echtzeitspiegelung von Daten benötigen, ist möglicherweise ein Cluster-Dateisystem in Ordnung. DRDB wurde bereits benannt. Es ist sehr gut für die Replikation auf Blockebene geeignet und wird häufig für hochverfügbare MySQL-Setups verwendet. Vielleicht möchten Sie auch einen Blick auf GFS2, OCFS2, Lustre und GlusterFS werfen. Obwohl Lustre und GlusterFS für ein Setup mit zwei Servern nicht wirklich geeignet sind.

Lukas Loesche
quelle
DRBD sieht gut aus. Ist es schlecht, dies zu verwenden, wenn ein Server aktiv ist? Wie würde sich das auf den Live-Server auswirken?
Kyle
Kommt drauf an - was macht der Live Server? Ist es ein Webserver, Datenbankserver, Dateiserver usw.? DRBD führt eine synchrone Replikation mit allen damit verbundenen Auswirkungen durch. Abhängig davon, ob Sie Single-Primary oder Dual-Primary planen, gelten bestimmte Einschränkungen für das E / A-Caching (und das Dateisystem), die sich wiederum auf Ihre Anwendungen auswirken. Für Details empfehle ich, das DRBD-Benutzerhandbuch drbd.org/users-guide-emb zu lesen, das sehr gut geschrieben ist und alle Auswirkungen ausführlich erklärt.
Lukas Loesche
5

Grundsätzlich haben Sie 3 Möglichkeiten:

  1. Lassen Sie Ihre Anwendung die Dateien auf beide Server übertragen.
  2. Asynchrone Replikation, z. B. rsync alle 15 Minuten (oder weniger) mit einem Cron-Job
  3. Synchrone Replikation auf Dateisystem- (z. B. GlusterFS ) oder Blockgeräteebene (z . B. DRBD ). Wenn Sie die Replikation auf Blockgeräteebene verwenden, benötigen Sie ein Dateisystem, das verteiltes Sperren unterstützt (z. B. OCFS2 oder GFS2 ), wenn Sie von beiden Servern gleichzeitig auf die Dateien zugreifen möchten.
Joschi
quelle
1

Abhängig von Ihrem spezifischen Anwendungsfall - Sie könnten etwas Ähnliches wie DRBD verwenden. Http://www.drbd.org/

Keiran Holloway
quelle
1

Wenn Sie versuchen, hier eine Backup-Lösung zu erstellen (was ich persönlich in fast demselben Setup getan habe), seien Sie vorsichtig. Es gibt viele verschiedene Thigns, gegen die Sie eine Sicherungskopie erstellen müssen. Eine der (wohl) größten ist das Löschen von Akzenten - jedes Live-Replikationssystem repliziert nur die Löschung und bietet keine Sicherheit. Dafür funktioniert die tägliche Replikation, ist aber eine ziemlich schwache Antwort. Versuchen Sie es mit RSnapshot.

Unison mag für Sie arbeiten, aber ich habe keine persönliche Erfahrung.

Das Ausführen von Rsync in beide Richtungen mit den aproprate-Flags kann funktionieren, hat jedoch das ziemlich schwierige Problem, wie gelöschte Dateien ohne spezielle Behandlung behandelt werden. Es stellt einfach die Dateien wieder her, was in Ordnung ist, wenn Sie nie etwas wie mich löschen, aber ein bisschen sonst arm. Es macht auch seltsame Dinge, wenn eine Datei verschoben wird.

Was auch immer Sie tun, wenn eine Situation eintreten kann, in der Dateien an beiden Enden gleichzeitig bearbeitet werden können, haben Sie ein Problem. Unison ist die einzige Lösung, von der ich weiß, dass sie dies sogar nahezu zufriedenstellend bewältigen kann.

Thingomie
quelle
Beachten Sie, dass die unten genannten Schleifen bei Rsync kein Problem darstellen, da die Änderungsdaten der übertragenen Dateien bei korrekter Einstellung beibehalten werden.
Thingomy
0

Wenn es sich um eine Einbahnstraße handelt (ich meine, immer von einem Server zu einem anderen Server, aber nicht umgekehrt), können Sie sie verwenden incron. Es ist wie Cron, basiert jedoch auf Dateisystemereignissen.

Jedes Mal, wenn eine Datei erstellt oder geändert wird, wird ein scp oder rsync für den anderen Server ausgelöst.

Bidirektional hat das Problem der Schleifen :).

chmeee
quelle
0

es hängt von Ihren Bedürfnissen ab ..... Ich habe ein sehr "billiges und einfaches" Setup für Cluster-Webserver.

Ich habe einfach einen "Dateiserver" (NFS), auf dem alle Webserver die folgenden Verzeichnisse bereitstellen:

/etc/apache/sites-enabled
/etc/apache2/sites-avaliable
/var/www

ganz einfach und funktionierend

bmaeser
quelle
0

Clonezilla kann auch angeschaut werden, welche rsync verwendet

dream_liner2k2
quelle
Ich bin mir nicht sicher, ob Clonezilla hier anwendbar ist ... aber es ist ein nettes Dienstprogramm.
HopelessN00b