Spostare un volume logico direttamente da un server all'altro sulla rete?


13

Ho una macchina host KVM con diverse macchine virtuali su di essa. Ogni VM utilizza un volume logico sull'host. Devo copiare i LV su un'altra macchina host.

Normalmente, userei qualcosa del tipo:

dd if=/the/logical-volume of=/some/path/machine.dd

Per trasformare LV in un file immagine e usare SCP per spostarlo. Quindi utilizzare DD per copiare il file in un nuovo LV sul nuovo host.

Il problema con questo metodo è che è necessario il doppio dello spazio su disco della VM in entrambe le macchine. vale a dire. un LV da 5 GB utilizza 5 GB di spazio per l'LV e la copia dd utilizza anche altri 5 GB di spazio per l'immagine. Questo va bene per i piccoli LV, ma cosa succede se (come nel mio caso) hai un LV da 500 GB per una grande VM? Il nuovo computer host ha un disco rigido da 1 TB, quindi non può contenere un file immagine dd da 500 GB e ha un volume logico da 500 GB su cui copiare e spazio per il sistema operativo host e spazio per altri guest più piccoli.

Quello che vorrei fare è qualcosa del tipo:

dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv

In altre parole, copiare i dati direttamente da un volume logico all'altro sulla rete e saltare il file di immagine intermedio.

È possibile?


Risposte:


24

Certo, certo che è possibile.

dd if=/dev/mygroup-mylv | ssh 192.168.1.103 dd of=/dev/newvgroup-newlv

Boom.

Fatti un favore, però, e usa qualcosa di più grande della dimensione di blocco predefinita. Forse aggiungi bs = 4M (leggi / scrivi in ​​blocchi di 4 MB). Puoi vedere che c'è un pignolo sulle dimensioni dei blocchi nei commenti; se questo è qualcosa che ti capita di fare abbastanza spesso, prenditi un po 'di tempo per provarlo un paio di volte diverse con diverse dimensioni di blocco e vedi di persona ciò che ti offre le migliori velocità di trasferimento.

Rispondere a una delle domande dai commenti:

È possibile reindirizzare il trasferimento tramite pv per ottenere statistiche sul trasferimento. È molto più bello dell'output che ricevi dall'invio di segnali dd.

Dirò anche che, mentre ovviamente uso di netcat - o qualsiasi altra cosa che non imponga il sovraccarico della crittografia - sarà più efficiente, di solito trovo che la velocità aggiuntiva derivi da una certa convenienza. A meno che non stia spostando set di dati molto grandi, di solito resto con ssh nonostante il sovraccarico perché nella maggior parte dei casi tutto è già impostato su Just Work.


1
Bs influisce solo sulla velocità di copia o influisce sul modo in cui i dati vengono archiviati?
Nick,

3
Non ha alcun effetto sul modo in cui i dati vengono archiviati, ma è molto più efficiente rispetto all'utilizzo del blocco predefinito (di 512 byte) per la lettura e la scrittura.
Larks

3
@Nick: su Linux, è possibile inviare al ddprocesso il USR1segnale per farlo visualizzare una riga di stato con l'importo trasferito. Ottieni il numero di processo del tuo ddprocesso con qualcosa di simile ps aux | grep dde quindi utilizza questo PID con il comando kill -USR1 $PID. Il messaggio verrà visualizzato sul terminale originale da cui è stato avviato dd.
Sven

3
Probabilmente non vuoi usare un bs così grande poiché bloccherà semplicemente la scrittura sulla pipe su ssh fino a quando non potrà trasferirne la maggior parte sul socket di rete, durante il quale il disco diventerà inattivo. Poiché la dimensione predefinita del readahead è 128k, è probabile che tu voglia attenersi a questo. O aumentare la dimensione del readahead del disco.
psusi,

1
@psusi: il link che Zoredache ha inserito come commento sotto la domanda ha dimostrato il contrario, hanno ottenuto il risultato più veloce con dimensioni del blocco di 16M, ma hanno usato netcat invece di ssh come metodo di trasferimento, che è sempre un'opzione migliore quando non è richiesta la crittografia.
Sven

18

Ecco una versione ottimizzata, che mostra i progressi con pve utilizza BS per blocchi più grandi e utilizza anche gzipper ridurre il traffico di rete.

È perfetto quando si spostano i dati tra connessioni lente come i server Internet. Consiglio di eseguire il comando all'interno di una schermata o di una sessione tmux. In questo modo la connessione ssh all'host da cui si esegue il comando può essere disconnessa senza problemi.

$ dd if=/dev/volumegroupname/logicalvolume bs=4096 | pv | gzip | \
    ssh root@78.46.36.22 'gzip -d | dd of=/dev/volumegroupname/logicalvolume  bs=4096'

2
È possibile utilizzare ssh -Cinvece di gzip. Non sono sicuro che ci sia un impatto sulle prestazioni, ma è molto meno digitando.
Samuel Edwin Ward,

1
Suggerisco anche di usare pigz o pxz -1 invece di gzip, il multithreading aiuta davvero su qualsiasi server moderno.
sCiphre,

pvpuò causare problemi (nella mia esperienza spostando più di 500 vps su altri server con questo sistema) con il numero di byte e, dopo questo problema, i volumi di LVM sono incoerenti. I vantaggi di vedere l'avanzamento dei lavori sono nulli e oscuri. Se ti piace vedere i progressi, apri una console con ifto, ad esempio.
abkrim,

4

Che ne dici di usare un vecchio amico per farlo. Netcat.

Sul sistema che sta perdendo il tipo di volume logico

  • $ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]

Quindi sul sistema ricevente. genere

  • $ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]

Traducendo, scatola originale dd questo file e reindirizzarlo a nc (netcat) che ascolterà questa porta. Sul sistema di ricezione, netcat attenderà 10 secondi se non riceve dati prima di chiudere su [ip o nome] su [porta], quindi reindirizzare quei dati a dd per scriverli.


2
Netcat non utilizza UDP con queste opzioni.
Samuel Edwin Ward,

3

Per prima cosa farei un'istantanea di LV:

lvcreate --snapshot --name my_shot --size <thesize> /dev/<name of vg>/<name of lv>

Dopodiché devi creare un nuovo LV sul nuovo host (ad es. Usando lvcreate) con le stesse dimensioni. Quindi è possibile copiare direttamente i dati sul nuovo host. Ecco il mio esempio del comando copia:

dd if=/dev/vg0/my_shot bs=4096 | pv | ssh root@some_host -C 'dd of=/dev/vg1/<created lv> bs=4096'

Ho usato la procedura per copiare un VM gestito da proxmox pve su un altro host. Il volume logico conteneva diversi LV aggiuntivi gestiti dalla VM stessa.


2

Assicurarsi innanzitutto che il volume logico non sia montato. Se lo è e si desidera creare una "copia di riserva", creare prima un'istantanea e utilizzare invece questa: lvcreate --snapshot --name transfer_snap --size 1G

Devo trasferire molti dati (7 TB) tra due server collegati da 1 Gbit, quindi avevo bisogno del modo più veloce possibile per farlo.

Dovresti usare SSH?

L'uso di ssh è fuori discussione, non a causa della sua crittografia (se si dispone di una CPU con supporto AES-NI, non fa molto male) ma a causa dei suoi buffer di rete. Quelli non stanno ridimensionando bene. Esiste una versione di Ssh con patch che risolve questo problema, ma poiché non ci sono pacchetti precompilati, non è molto conveniente.

Usando la compressione

Quando si trasferiscono immagini del disco non elaborate, è sempre consigliabile utilizzare la compressione. Ma non vuoi che la compressione diventi un collo di bottiglia. La maggior parte degli strumenti di compressione unix come gzip sono a thread singolo, quindi se la compressione satura una CPU, sarà un collo di bottiglia. Per questo motivo, utilizzo sempre pigz, una variante gzip che utilizza tutti i core della CPU per la compressione. E questo è necessario per farti salire e superare le velocità GBit.

Utilizzando la crittografia

Come detto prima, ssh è lento. Se hai una CPU AES-NI, questo non dovrebbe essere un collo di bottiglia. Quindi, invece di usare ssh, possiamo usare openssl direttamente.

costi

Per darti un'idea dell'impatto sulla velocità dei componenti, ecco i miei risultati. Queste sono le velocità di trasferimento tra due sistemi di produzione che leggono e scrivono in memoria. I risultati effettivi dipendono dalla velocità della rete, dalla velocità dell'HDD e dalla velocità della CPU di origine! Lo sto facendo per dimostrare che almeno non c'è un enorme calo delle prestazioni. Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s Conclusione: l'utilizzo della compressione offre un notevole aumento della velocità, in quanto riduce notevolmente le dimensioni dei dati. Ciò è ancora più importante se si hanno velocità di rete inferiori. Quando si utilizza la compressione, controllare l'utilizzo della CPU. se l'utilizzo viene massimizzato, puoi provare senza di esso. Utilizzando la compressione solo come un piccolo impatto sui sistemi AES-NI, imho solo perché ruba circa il 30-40% di cpu dalla compressione.

Utilizzando lo schermo

Se stai trasferendo molti dati come me, non vuoi che vengano interrotti da una disconnessione di rete del tuo client SSH, quindi è meglio avviarlo con lo schermo su entrambi i lati. Questa è solo una nota, non scriverò un tutorial sullo schermo qui.

Consente di copiare

Installa alcune dipendenze (sull'origine e sulla destinazione): apt install pigz pv netcat-openbsd

quindi creare un volume sulla destinazione con le stesse dimensioni dell'origine. In caso di dubbi, utilizzare lvdisplay sull'origine per ottenere le dimensioni e creare l'obiettivo, ad esempio: lvcreate -n lvname vgname -L 50G

quindi, preparare la destinazione per la ricezione dei dati:

nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname

e quando è pronto, avvia il trasferimento su Source:

pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1

Nota: se si trasferiscono i dati localmente o non si cura la crittografia, rimuovere la parte Openssl da entrambi i lati. Se ti interessa, asdkjn2hb è la chiave di crittografia, dovresti cambiarla.


NON FARLO MAI SU UN SERVER PROXMOX: apt install netcat-openbsd L'installazione di netcat-openbsd ha cancellato completamente ProxMox dal server e ha causato oltre 5 ore di inattività e lavoro !!!
Zoltan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.