Configurare la sincronizzazione file live tra host remoti¶
La sincronizzazione tra host remoti è ottenuta più efficacemente usando programmi come rsync su SSH, possibilmente sotto crontab.
Discutiamo qui un paio di modi alternativi per live file-sync (sincronizzazione file live), ovvero una sincronizzazione continua in cui un trasferimento viene avviato ogni volta che un file cambia alla sorgente.
Lsyncd¶
Questo è disponibile a questo URL. Nelle parole degli sviluppatori, è più adatto per la sincronizzazione (unidirezionale, mio commento) tra un albero di directory locale con basso profilo di cambiamenti attesi e un mirror remoto. Per ulteriori informazioni consultare la pagina wiki.
Lsyncd osserva un filesystem per i cambiamenti (via Inotify o fsevents), attende alcuni secondi per aggregare i cambiamenti e infine attiva la sincronizzazione (via rsync+SSH).
Prima di installarlo:
- Crea chiave SSH:
ssh-keygen -o
-
Scambia le chiavi tra gli host. Su hostB aggiungi il contenuto di hostA:/root/.ssh/id_rsa.pub a hostB:/root/.ssh/authorized_keys, e viceversa.
-
Prova a connetterti da hostA a hostB e viceversa: assicurati che i Security Group lo consentano.
Procedi con l'installazione:
- il pacchetto dovrebbe essere già disponibile, installazione rapida con:
apt-get install -y lsyncd # installerà le dipendenze lua5.X e liblua5.X
- oppure puoi ricompilare
lsyncd:
cd <some_base_dir>
git clone https://github.com/axkibe/lsyncd
# installa le dipendenze come da file INSTALL, ad esempio
apt-get install -y gcc g++ cmake make binutils rsync
# Leggi il file INSTALL e compila/installa, ad esempio
mkdir build
cd build
cmake ..
make
sudo make install
Configura:
-
guarda in /etc/init.d/lsyncd e controlla qual è il nome atteso per il file di configurazione, nel mio caso (Ubuntu 16.04) era /etc/lsyncd/lsyncd.conf.lua
-
crea il tuo file di configurazione:
mkdir /etc/lsyncd
mkdir /var/log/lsyncd/
touch /var/log/lsyncd/lsyncd.{log,status}
cp -p /usr/share/doc/lsyncd/examples/lrsyncssh.lua /etc/lsyncd/lsyncd.conf.lua
- modifica il file di configurazione come desiderato, nel mio caso il risultato era (per favore controlla l'opzione delete nel manuale):
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
statusFile = "/var/log/lsyncd/lsyncd.status",
}
sync {
default.rsyncssh,
source = "/home/diskVdb/dirPa",
host = "<remoteHostIP>",
targetdir = "/home/diskVdb/dirPa",
delete = "running",
rsync = {
archive = true,
compress = false,
update = true,
whole_file = false
},
delay = 5,
}
- riavvia il programma:
systemctl enable lsyncd
systemctl restart lsyncd
Eseguire lsyncd come mirroring bidirezionale può causare race conditions, e il programma potrebbe essere confuso dalla comparsa/scomparsa di file temporanei. A seconda del tuo caso d'uso specifico, potresti considerare:
- alla luce di questo messaggio dell'autore, imposta temp_dir su un percorso fuori dall'albero di sincronizzazione,
- usa exclude o excludeFrom nella sezione sync del file di configurazione, in modo che i nomi dei file che corrispondono a specifici pattern non siano considerati per il mirroring.
Mirror¶
Mirror è disponibile a questo URL. Le caratteristiche salienti di questa applicazione sono che è bidirezionale e che è attivata da eventi del filesystem (Inotify).
Possibili svantaggi sono che è progettata per sincronizzare una singola directory (sebbene tu possa eseguire più istanze del programma per gestire più directory), che la proprietà dei file non è preservata (i file sono posseduti dall'utente/gruppo che esegue mirror) e che la sincronizzazione non sfrutta la crittografia TLS: quest'ultimo inconveniente può essere superato eseguendo mirror all'interno di un tunnel SSH, vedi la documentazione per ulteriori informazioni.
Installazione:
- installa Java 8 con:
apt install openjdk-8-jre - installa watchman secondo le istruzioni, per favore leggile attentamente. Al momento della scrittura il set minimo di passaggi (ma di nuovo, controlla per configurazioni più sofisticate nella pagina web sopra) devi:
apt-get install -y gcc g++ cmake make binutils apt-get install -y libssl-dev autoconf automake libtool python-dev pkg-config mkdir -p <someBaseDir> cd <someBaseDir> git clone https://github.com/facebook/watchman.git cd watchman git checkout v4.9.0 # the latest stable release ./autogen.sh ./configure make sudo make install - scarica gli eseguibili di mirror in qualche directory nel tuo path:
cd /usr/local/bin wget http://repo.joist.ws/mirror-all.jar . wget http://repo.joist.ws/mirror . chmod u+x mirror - regola i limiti di inotify (vedi anche questa pagina):
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p echo fs.inotify.max_queued_events=50000 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - eleggi uno dei tuoi host come server e avvia
mirror:cd /usr/local/bin/ ./mirror server - sull'altro host, esegui il client così:
cd /usr/local/bin/ ./mirror client -h remote-host -l /the/source/dir/ -r /the/remote/dir/