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.