Jul 072012
 

A volte è utile sincronizzare automaticamente i file in una rete tra 2 o più computer, magari si desidera mantenere alcuni file di configurazione allineati su server diversi o forse avete un cluster di server web e desiderate mantenere la loro document root allineata in modo che il cliente veda sempre lo stesso risultato.

Si potrebbe ottenere questo con un filesystem di rete come NFS, GlusterFS o il file system Coda.

Ma perché fare le cose complicate quando si potrebbe facilmente ottenere questo risultato sincronizzando i filesystem locali ?

In un articolo precedente ho parlato di Unison per ottenere un risultato di questo tipo, e funziona, il limite di Unison è che si può avere solo 2 nodi, ma se avete più nodi è necessario utilizzare una soluzione diversa come quella che vi presento oggi: csync2


Csync2 è uno strumento dper la sincronizzazione asincrona dei file in un cluster. Può essere utilizzato per mantenere i file su più host di un cluster in sincronia. Csync2 è in grado di gestire configurazioni complesse con molti più di 2 server, gestire le eliminazioni dei file ed è in grado di rilevare i conflitti.

E’ una buona soluzione per cluster-HA cluster-HPC, COWs e server farm.

Perché non basta usare rsync?

Questa potrebbe essere una domanda comune, rsync è un buon strumento e credo che ogni amministratore linux prima o poi lo abbia usato, potreste essere quindi tentati di pensare che questa soluzione è più che sufficiente per gestire la sincronizzazione tra file system.

Diciamo che avete solo 3 server che devono avere il filesystem /www/ allineato tra di loro, il webserver di ciascuno di questi 3 nodi è in grado di scrivere in questo FS e quindi non si dispone di un server master.

Si potrebbe eseguire un processo rsync in cron su ogni server che sincronizza il contenuto locale con gli altri 2 nodi, ma ci sono alcuni problemi in questa configurazione in quanto crea un bel po’ di traffico, e terrà pure i singoli nodi abbastanza occupati come cpu. Dopo tutto, rsync controlla se ogni file esiste sul nodo, confronta i contenuti, dimensione o data dell’ultima modifica e crea un elenco dei file da trasferire sulla base di questo. E ogni volta ha bisogno di connettersi ad ogni nodo. Questo va bene per gli aggiornamenti occasionali, meno bene per quelle più regolari, o se si hanno un gran numero di file.

Csync2 mantiene un piccolo database (sqlite come default), che contiene lo stato di ogni file. Questo significa che ogni volta che viene richiamato, prima aggiorna il database – e avvia la connessione ai nodi solo nel caso in cui file siano stati aggiunti, modificati o cancellati. Una vittoria enorme nel numero di collegamenti necessari tra i vari nodi, in quanto la maggior parte del tempo non ci saranno nuovi file. Ed è anche molto più veloce nei controlli di un Rsync.

Naturalmente più nodi avete più si guadagna nell’usare csync2.

Installazione e configurazione

L’installazione dovrebbe essere facile nella maggior parte delle distribuzioni Linux, csync2 è incluso nel repository di Debian, Ubuntu, Fedora, Gentoo ed è anche disponibile in repository esterni per CentOS e Red Hat Enterprise Linux, quindi in generale una procedura di installazione con il vostro gestore di pacchetti dovrebbe essere sufficiente per installarlo.

Per avere un buon punto di partenza per la configurazione vi consiglio di leggere il linbit paper su csync2, questo vi darà tutte le le informazioni che servono per gestire e configurare csync2.

1) Pre-shared Keys

L’autenticazione viene effettuata utilizzando gli indirizzi IP le chiavi pre-shared (già condivise) in Csync2. Ogni gruppo di sincronizzazione (un gruppo di host che hanno uno o più file in sync) nel file di configurazione deve avere esattamente una indicazione della chiave che specifica il file contenente la chiave già condivisa per questo gruppo. Si raccomanda di utilizzare una chiave separata per ciascun gruppo di sincronizzazione e inserire solo un file di chiave su questi host che in realtà sono membri del gruppo di sincronizzazione corrispondente.

Il file con la chiave può essere generato con il seguente comando sul vostro primo nodo:

csync2 -k /etc/csync2.key

2) Certificato SSL

Dopodiché è necessario creare un certificato SSL per il server locale di Csync2 . Sul vostro primo nodo dare questi comandi:

openssl genrsa -out /etc/csync2_ssl_key.pem 1024
openssl req -batch -new -key /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.csr
openssl x509 -req -days 3600 -in /etc/csync2_ssl_cert.csr -signkey /etc/csync2_ssl_key.pem -out /etc/csync2_ssl_cert.pem

3) Csync2 file di configurazione

Sul vostro primo nodo creare il file /etc/csync2.conf, in questo esempio voglio mantenere in sincronia solo 1 disrectory su 2 server (node1 e node2):

group mycluster
{
        host node1;
        host node2;
 
        key /etc/csync2.key;
 
        include /www/htdocs;
        exclude *~ .*;
}

La lista degli host è specificata usando la parola chiave host. È possibile specificare gli host sia in un elenco separato da spazi vuoti o utilizzare più istruzioni host, come fatto in questo esempio, per ogni host. I nomi host utilizzati devono essere i nomi degli host locali dei nodi del cluster.

4) Ora copiare tutti i file dal primo nodo (node1) a l’altro con:

scp /etc/csync2* node2:/etc/

E far ripartire su entrambi i nodi inetd (o xinetd se usate questo) con il comando:

 /etc/init.d/openbsd-inetd restart

5) Prima sincronizzazione

Avviare la sincronizzazione prima su node1 poi node2, dopo di che si può impostare un cronjob per allineare periodicamente i file.

csync2 -xv

Se avete dei conflitti utilizzare l’opzione -f

Questa configurazione è sufficiente per avere 2 nodi e 1 directory in sincronia, dovrete mettere nel crontab dei nodi qualcosa simile a questo:

*/2 * * * * csync2 -x


Azioni a seguito di una sincronizzazione

Ogni gruppo di sincronizzazione può avere qualsiasi numero di sezioni action. Queste sezioni action vengono utilizzate per specificare i comandi della shell, che devono essere eseguiti dopo che un file che corrisponde a uno dei criteri specificati viene sincronizzato . La direttiva exec viene utilizzata per specificare il comando che deve essere eseguito. Si noti che se più file che corrispondono al pattern vengono sincronizzati in una volta, il comando verrà eseguito solo una volta.

Il carattere speciale %% nella stringa di comando viene sostituito con l’elenco dei file che hanno attivato l’esecuzione del comando.

Esempio:

group g1 {
  host node1 node2;                          # hosts list
  key /etc/csync2.key_g1;                  # pre-shared key
 
  include /etc/xinetd.d;
 
  action {                                 
    pattern /etc/xinetd.d;
    exec "/etc/init.d/xinetd restart";
    logfile "/var/log/csync2_action.log";
  }

In questo esempio ogni volta che un file nel percorso /etc/xinetd.d è cambiato diamo il comando /etc/init.d/xinetd restart

Attività comuni di csync2

Queste sono alcune opzioni comuni e attività che è possibile utilizzare dalla riga di comando:

Sincronizzare

csync2 -x

forzare file locale ad essere più recente (deve essere seguito da csync2-x per la sincronizzazione)

csync2 -f filename

Mostrare le differenze tra i vari nodi

csync2 -T

Come -T ma mostra le differenze

csync2 -TT

Opzione con un output dettagliato per tutti i comandi: -v

csync2 -xv

opzione dry-run per tutti i comandi: -d

csync2 -xvd

Conclusioni

Csync2 è un grande strumento se si desidera mantenere la sincronizzazione di uno o più file system in maniera asincrona, ci sono molte altre opzioni, come dichiara un server come solo slave o utilizzare SSL o meno nella parte di collegamento tra i nodi.

Popular Posts:

Flattr this!

  8 Responses to “Csync2 uno strumento per sincronizzare filesystem per Linux”

  1. tool interessante, ma invece di usare il cron si potrebbe usare gli eventi del kernel (o stile dropbox)?

  2. Good job. Thank for succinct overview!

  3. sir, this tutorial is quite good
    can you tell me the changes in csync configuration file if there are more than two hosts,
    i mean if we have 4 hosts and wanted to sync host1 & 2 with each other and host3 & 4 with each other and as a whole this is a group.

  4. nice job…..

  5. I’ve tried, but experienced problems in ownership. Owner file can not follow the previous file owner if not root, so that ownership turned into numbers like this:

    -rw-r – r–. 1 567 567 21 May 14 2014 myfiletes

    should follow previous owner file, like this:

    -rw-r – r–. 1 myweb myweb 21 May 14 2014 myfiletes

    Is there a solution to this ownership issue?

  6. Io ho provato a farlo andare e sebbene sia tutto configurato correttamente ottengo che nulla si sincronizza

    root@node:/var/run/nginx-cache# csync2 -Tv
    Running in-sync check for node node 2.
    Connecting to host node2 (SSL) ...
    Connect to 46.XXX.XXX.XX:30865 (node 2).
    Connection closed.
    Finished with 0 errors.


    root@node2:/var/lib/csync2# csync2 -xv
    Connection closed.
    Finished with 0 errors.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*