Soluzione 1:
Sebbene esistano patch "dispositivo di scrittura" e "dispositivo di copia" per RSync, funzionano bene solo su immagini piccole (1-2 GB). RSync impiegherà anni a cercare blocchi corrispondenti su immagini più grandi ed è quasi inutile su dispositivi/file da 40 GB o più grandi.
Utilizziamo quanto segue per eseguire un confronto di checksum per 1 MB e quindi copiamo semplicemente il contenuto se non corrisponde. Lo usiamo per eseguire il backup dei server su un host virtuale negli Stati Uniti su un sistema di backup nel Regno Unito, tramite Internet pubblico. L'attività della CPU e le prestazioni dell'istantanea sono molto ridotte solo dopo ore:
Crea istantanea:
lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1
export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='[email protected]';
Semina iniziale:
dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"
Backup notturno incrementale (invia solo i blocchi modificati):
ssh -i /root/.ssh/rsync_rsa $remote "
perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"
Rimuovi istantanea:
lvremove -f company-exchange-snap1
Soluzione 2:
A rsync standard manca questa funzione, ma c'è una patch per essa nel tarball rsync-patches (copy-devices.diff) che può essere scaricato da http://rsync.samba.org/ftp/rsync/Dopo l'applicazione e la ricompilazione , puoi sincronizzare i dispositivi con l'opzione --copy-devices.
Soluzione 3:
Le persone interessate a farlo in modo specifico con gli snapshot LVM potrebbero apprezzare il mio strumento lvmsync, che legge l'elenco dei blocchi modificati in uno snapshot e invia solo tali modifiche.
Soluzione 4:
Dai un'occhiata a Zumastor Linux Storage Project, implementa il backup "snapshot" utilizzando il binario "rsync" tramite lo strumento ddsnap.
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 5:
Esiste uno script Python chiamato blocksync che è un modo semplice per sincronizzare due dispositivi a blocchi su una rete tramite ssh, trasferendo solo le modifiche.
- Copia blocksync.py nella home directory sull'host remoto
- Assicurati che il tuo utente remoto possa sudo o sia esso stesso root
- Assicurati che il tuo utente locale (root?) possa leggere il dispositivo sorgente e ssh sull'host remoto
- Richiama:
python blocksync.py /dev/source [email protected] /dev/dest
Di recente l'ho hackerato per ripulirlo e modificarlo in modo che utilizzi lo stesso algoritmo di checksum rapido di rsync (Adler-32).