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:
- None Found
tool interessante, ma invece di usare il cron si potrebbe usare gli eventi del kernel (o stile dropbox)?
Si, potresti utilizzare la suite inotify, come ad esempio incron: http://linuxaria.com/article/incron-cron-inotify
Io sto guardando lsyncd, magari a breve un altro articolo su quest’altro tool.
Ciao
Good job. Thank for succinct overview!
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.
Hello,
yes you can have 4 hosts with csync2, in this article there is an example: http://en.onoclea.com/bits/csync2-multi-way-sync.html
nice job…..
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?
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.