Soluzione 1:
rsync --ignore-existing --sparse ...
Per creare nuovi file in modalità sparse
Seguito da
rsync --inplace ...
Per aggiornare sul posto tutti i file esistenti (inclusi quelli sparsi creati in precedenza).
Soluzione 2:
Rsync trasferisce solo le modifiche a ciascun file e con --inplace dovrebbe riscrivere solo i blocchi che sono stati modificati senza ricreare il file. Dalla loro pagina delle caratteristiche.
rsync è un programma di trasferimento file per sistemi Unix. rsync utilizza l'"algoritmo rsync" che fornisce un metodo molto rapido per sincronizzare i file remoti. Lo fa inviando solo le differenze nei file attraverso il collegamento, senza richiedere che entrambi i gruppi di file siano presenti in anticipo a una delle estremità del collegamento.
L'uso di --inplace dovrebbe funzionare per te. Questo ti mostrerà i progressi, comprimere il trasferimento (al livello di compressione predefinito), trasferire i contenuti della directory di archiviazione locale in modo ricorsivo (quella prima barra finale è importante), apportare le modifiche ai file sul posto e utilizzare ssh per il trasporto. /P>
rsync -v -z -r --inplace --progress -e ssh /path/to/local/storage/ \
[email protected]:/path/to/remote/storage/
Uso spesso anche il flag -a che fa altre cose. È equivalente a -rlptgoD Ti lascerò il comportamento esatto da cercare nella pagina man.
Soluzione 3:
Dai un'occhiata a Zumastor Linux Storage Project implementa il backup "snapshot" utilizzando il binario "rsync" tramite ddsnap
strumento.
Dalla pagina man:
ddsnap fornisce la replica del dispositivo a blocchi data una funzione di snapshot a livello di blocco in grado di conservare in modo efficiente più snapshot simultanei. ddsnap può generare un elenco di blocchi di istantanee che differiscono tra due istantanee, quindi inviare tale differenza in rete. Su un server downstream, scrivi i dati aggiornati su un dispositivo a blocchi con snapshot.
Soluzione 4:
Ho finito per scrivere software per fare questo:
http://www.virtsync.com
Questo è un software commerciale che costa $49 per server fisico.
Ora posso replicare un file sparse da 50 GB (con 3 GB di contenuto) in meno di 3 minuti attraverso la banda larga residenziale.
[email protected]:~$ time virtsync -v /var/lib/libvirt/images/vsws.img backup.barricane.com:/home/chris/
syncing /var/lib/libvirt/images/vsws.img to backup.barricane.com:/home/chris/vsws.img (dot = 1 GiB)
[........>.........................................]
done - 53687091200 bytes compared, 4096 bytes transferred.
real 2m47.201s
user 0m48.821s
sys 0m43.915s
Soluzione 5:
Per sincronizzare file enormi o dispositivi a blocchi con differenze da basse a moderate puoi fare una semplice copia o usare bdsync, rsync non è assolutamente adatto a questo caso particolare*.
bdsync
ha funzionato per me, sembra abbastanza maturo, la sua cronologia dei bug è incoraggiante (piccoli problemi, risoluzione rapida). Nei miei test la sua velocità era vicina al massimo teorico che potresti ottenere ** (ovvero puoi sincronizzare all'incirca nel tempo necessario per leggere il file). Finalmente è open source e non costa nulla.
bdsync
legge i file da entrambi gli host e scambia i checksum per confrontarli e rilevare le differenze. Tutto questo contemporaneamente . Infine crea un file di patch compresso sull'host di origine. Quindi sposti quel file sull'host di destinazione ed esegui bdsync una seconda volta per correggere il file di destinazione.
Quando lo si utilizza su un collegamento piuttosto veloce (ad es. 100 Mbit Ethernet) e per file con piccole differenze (come spesso accade sui dischi VM) riduce il tempo di sincronizzazione al tempo necessario per leggere il file. Su un collegamento lento hai bisogno di un po' più di tempo perché devi copiare le modifiche compresse da un host all'altro (sembra che tu possa risparmiare tempo usando un bel trucco ma non l'hai testato). Per i file con molte modifiche, dovrebbe essere preso in considerazione anche il tempo necessario per scrivere il file di patch su disco (e hai bisogno di spazio libero sufficiente in entrambi gli host per contenerlo).
Ecco come utilizzo tipicamente bdsync. Questi comandi vengono eseguiti su $LOCAL_HOST
per "copiare" $LOCAL_FILE
a $REMOTE_FILE
il $REMOTE_HOST
. Uso pigz
(un gzip
più veloce ) per comprimere le modifiche, ssh
per eseguire bdsync sull'host remoto e rsync
/ssh
per copiare le modifiche. Tieni presente che sto controllando se la patch è stata applicata correttamente, ma stampo solo "Aggiornamento riuscito" quando lo fa. Potresti voler fare qualcosa di più intelligente in caso di fallimento.
REMOTE_HOST=1.2.3.4
LOCAL_FILE=/path/to/source/file
REMOTE_FILE=/path/to/destination/file
PATCH=a_file_name
LOC_TMPDIR=/tmp/
REM_TMPDIR=/tmp/
# if you do use /tmp/ make sure it fits large patch files
# find changes and create a compressed patch file
bdsync "ssh $REMOTE_HOST bdsync --server" "$LOCAL_FILE" "$REMOTE_FILE" --diffsize=resize | pigz > "$LOC_TMPDIR/$PATCH"
# move patch file to remote host
rsync "$LOC_TMPDIR/$PATCH" $REMOTE_HOST:$REM_TMPDIR/$PATCH
# apply patch to remote file
(
ssh -T $REMOTE_HOST <<ENDSSH
pigz -d < $REM_TMPDIR/$PATCH | bdsync --patch="$REMOTE_FILE" --diffsize=resize && echo "ALL-DONE"
rm $REM_TMPDIR/$PATCH
ENDSSH
) | grep -q "ALL-DONE" && echo "Update succesful" && rm "$LOC_TMPDIR/$PATCH"
# (optional) update remote file timestamp to match local file
MTIME=`stat "$LOCAL_$FILE" -c %Y`
ssh $REMOTE_HOST touch -c -d @"$MTIME_0" "$REMOTE_FILE" </dev/null
*:rsync è estremamente inefficiente con file enormi. Anche con --inplace leggerà prima l'intero file sull'host di destinazione, DOPO inizierà a leggere il file sull'host di origine e infine trasferirà le differenze (basta eseguire dstat o simili durante l'esecuzione di rsync e osservare). Il risultato è che anche per i file con piccole differenze ci vuole circa il doppio del tempo necessario per leggere il file per sincronizzarlo.
**:Partendo dal presupposto che non hai altro modo per sapere quali parti dei file sono cambiate. Gli snapshot LVM utilizzano bitmap per registrare i blocchi modificati in modo che possano essere estremamente più veloci (il readme di lvmsync ha maggiori informazioni).