C'è un modo per eseguire il mirroring di due server su Ubuntu?


8

Mi chiedevo se fosse possibile eseguire il mirroring di due server, come se potessi caricare i file su un server e questi avessero spinto sull'altro server, ecc. Sono più curioso di eseguire il mirroring dei file, non è necessario eseguire il mirroring della gestione dei pacchetti e setup (Ma sarebbe anche bello!)


File Mirroring: Gluster o DRDB; Mirroring del sito Web: vernice o HAProxy; DB Mirroring: MySQL Circular Replication o Postgres Replication .; - La maggior parte dei pacchetti server ha una modalità operativa cluster, oppure esistono proxy inversi che ti consentono di farlo.
Tom O'Connor,

Risposte:


6

Dipende molto dal lavoro a portata di mano.

Perché hai bisogno del mirroring dei file. Vuoi aggiornare qualcosa come un sito Web o un repository di contenuti dove di solito va bene aggiornarlo periodicamente. O hai bisogno della sincronizzazione in tempo reale dei dati?

Per il mirroring periodico asincrono dei file, in genere è sufficiente disporre di un'area di gestione temporanea in cui caricare tutti i dati. E da dove lo distribuisci ai server. Nel tuo caso - con due server - potresti creare una condivisione file di gestione temporanea su srv1 dove trasferisci i dati (tramite FTP, NFS, DAV, SFTP, ecc.) E quindi avere un cronjob sincronizzare i file nelle directory "live" di srv1 e srv2. Il modo più semplice di usare rsync in quel caso è generare una coppia di chiavi ssh che userete per i trasferimenti di dati e che è autorizzata su tutti i server del cluster.

Esempio:

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/
=====

Questo dovrebbe darti un'idea di base. Naturalmente vorrai racchiudere le chiamate rsync in alcuni script e implementare un blocco adeguato in modo che non venga eseguito due volte nel caso in cui la sincronizzazione impieghi più di 5 minuti, ecc. Inoltre, è ovvio che un'area di gestione temporanea non è obbligatoria. Potresti anche sincronizzare srv1: production con srv2: production direttamente. Solo che srv2 potrebbe mostrare dati fino a 5 minuti più vecchi di quelli di srv1. Quale potrebbe essere un problema, a seconda di come si bilancia tra i due.

Un altro modo per distribuire i file in modo asincrono è comprimerli come rpm o nei file deb del caso. Mettili in un repository centrale e installali / aggiorna tramite qualcosa come cfengine, monkey o qualche soluzione basata su bus di messaggi fai da te. Ciò ha il piacevole effetto collaterale del controllo delle versioni dei dati distribuiti, ma è adatto solo per piccole quantità di dati prodotti e distribuiti dall'utente (come le versioni del proprio software). Non vorrai distribuire TB di dati con questo e inoltre non è adatto per il mirroring di contenuti che cambiano ad alta frequenza, come ogni altro minuto.

Se hai bisogno di replicare i dati quasi in tempo reale ma non necessariamente in modo sincrono invece di chiamare un cron ogni tanto puoi usare un metodo basato su inotify come l'incron già menzionato per chiamare i tuoi script di sincronizzazione. Un'altra possibilità è usare Gamin (che usa anche inotify se presente nel kernel) e scrivere il proprio piccolo demone di sincronizzazione. Ultimo ma non meno importante, se tutti i file vengono caricati su un server tramite ad esempio SFTP, è possibile verificare se il server SFTP consente di definire hook che vengono chiamati dopo determinati eventi, come il caricamento di file. In questo modo potresti dire al tuo server di attivare lo script di sincronizzazione ogni volta che vengono caricati nuovi dati.

Se è necessario il mirroring sincrono in tempo reale dei dati, un file system del cluster potrebbe essere in ordine. DRDB è già stato nominato. È molto utile per la replica a livello di blocco e spesso utilizzato per configurazioni MySQL ad alta disponibilità. Potresti anche dare un'occhiata a GFS2, OCFS2, Lustre e GlusterFS. Sebbene Lustre e GlusterFS non siano realmente adatti per una configurazione a due server.


DRBD sembra carino. È male usarlo con un server attivo? Come influirebbe sul server live?
Kyle

Dipende: cosa sta facendo il server live? È un server web, un server di database, un file server, ecc.? DRBD esegue la replica sincrona, con tutte le implicazioni che ne derivano. A seconda che si preveda di applicare restrizioni di memorizzazione nella cache I / O (e filesystem) Single-primary o Dual-primary che a loro volta si applicano alle applicazioni. Per i dettagli suggerisco di leggere la Guida dell'utente di DRBD drbd.org/users-guide-emb, che è scritta molto bene e spiega tutte le implicazioni in grande dettaglio.
Lukas Loesche,

5

Fondamentalmente hai 3 possibilità:

  1. Lascia che l'applicazione invii i file a entrambi i server.
  2. Replica asincrona, ad es. Rsync ogni 15 minuti (o meno) con un processo cron
  3. Replica sincrona su file system (ad es. GlusterFS ) o blocco a livello di dispositivo (ad es. DRBD ). Se si utilizza la replica a livello di dispositivo a blocchi, è necessario un file system che supporti il ​​blocco distribuito (ad esempio OCFS2 o GFS2 ) se si desidera avere accesso r / w ai file da entrambi i server contemporaneamente.



1

Se stai cercando di creare una soluzione di backup qui (cosa che ho fatto personalmente nella stessa configurazione), fai attenzione. Ci sono molte diverse tendenze su cui è necessario eseguire il backup, una delle (probabilmente la) più grande è la cancellazione accidentale - qualsiasi sistema di replica live replicherà solo la cancellazione e non fornirà sicurezza. Per questa replica quotidiana funziona, ma è una risposta piuttosto debole. Prova RSnapshot.

Unison potrebbe funzionare bene per te, ma non ho esperienza personale.

L'esecuzione di Rsync in entrambe le direzioni con i flag appropriati può funzionare, ma ha il problema piuttosto complicato di come gestire i file eliminati, senza una gestione speciale, ripristina semplicemente i file, il che va bene se non elimini mai qualcosa come me, ma un po ' povero altrimenti. Fa anche cose strane se un file viene spostato.

Qualunque cosa tu stia facendo, se può verificarsi una situazione in cui i file possono essere modificati simultaneamente ad entrambe le estremità, hai un problema. l'unisono è l'unica soluzione che conosco in grado di gestirlo anche in modo soddisfacente.


Si noti che i loop menzionati di seguito non saranno un problema con Rsync, poiché mantiene le date di modifica dei file che trasferisce se impostato correttamente.
Thingomy

0

Se è unidirezionale (voglio dire, sempre da un server all'altro), ma non viceversa) potresti usare incron. È come cron ma basato su eventi del filesystem.

Ogni volta che un file viene creato o modificato, verrà attivato scp o rsync sull'altro server.

Il bidirezionale ha il problema dei loop :).


0

dipende dalle tue esigenze ..... ho una configurazione molto "economica e semplice" per i server web cluster.

ho semplicemente un "fileserver" (NFS) in cui tutti i server web montano le seguenti directory:

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

morto semplice e funzionante


0

clonezilla può anche guardare quale utilizza rsync


Non sono sicuro che Clonezilla sia applicabile qui ... tuttavia, è una bella utility.
HopelessN00b,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.