Ein logisches Volume über das Netzwerk direkt von einem Server auf einen anderen verschieben?


13

Ich habe einen KVM-Hostcomputer mit mehreren VMs. Jede VM verwendet ein logisches Volume auf dem Host. Ich muss die LVs auf einen anderen Hostcomputer kopieren.

Normalerweise würde ich so etwas verwenden:

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

So wandeln Sie den LV in eine Image-Datei um und verschieben ihn mit SCP. Verwenden Sie dann DD, um die Datei zurück in eine neue LV auf dem neuen Host zu kopieren.

Das Problem bei dieser Methode ist, dass Sie doppelt so viel Speicherplatz benötigen, wie die VM auf beiden Computern benötigt. dh Ein 5-GB-LV verwendet 5 GB Speicherplatz für das LV, und die dd-Kopie verwendet zusätzlich 5 GB Speicherplatz für das Image. Dies ist in Ordnung für kleine LVs, aber was ist, wenn Sie (wie in meinem Fall) eine 500-GB-LV für eine große VM haben? Der neue Host-Computer verfügt über eine 1-TB-Festplatte, kann also keine 500-GB-DD-Image-Datei speichern und verfügt über ein logisches 500-GB-Volume zum Kopieren sowie über Platz für das Host-Betriebssystem und andere kleinere Gäste.

Was ich gerne machen würde, ist so etwas wie:

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

Mit anderen Worten, kopieren Sie die Daten direkt über das Netzwerk von einem logischen Volume auf das andere und überspringen Sie die Zwischenimagedatei.

Ist das möglich?


Antworten:


24

Natürlich ist es möglich.

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

Boom.

Tun Sie sich jedoch selbst einen Gefallen und verwenden Sie etwas, das größer als die Standardblockgröße ist. Fügen Sie vielleicht bs = 4M hinzu (Lesen / Schreiben in Stücken von 4 MB). Sie können sehen, dass es in den Kommentaren ein bisschen Unsinn über Blockgrößen gibt. Wenn Sie dies öfter tun, nehmen Sie sich ein wenig Zeit, um es ein paar Mal mit unterschiedlichen Blockgrößen zu versuchen, und sehen Sie selbst, wie Sie die besten Übertragungsraten erzielen.

Beantwortung einer der Fragen aus den Kommentaren:

Sie können die Übertragung durch pv leiten , um Statistiken über die Übertragung abzurufen . Es ist viel schöner als die Ausgabe, an die Sie Signale senden dd.

Ich werde auch sagen, dass die Verwendung von Netcat - oder etwas anderem, das den Aufwand für die Verschlüsselung nicht mit sich bringt - zwar effizienter sein wird, ich jedoch in der Regel feststellen muss, dass die zusätzliche Geschwindigkeit mit einem gewissen Komfortverlust einhergeht. Wenn ich mich nicht in wirklich großen Datenmengen bewege, bleibe ich trotz des Overheads normalerweise bei ssh, da in den meisten Fällen bereits alles auf Just Work eingestellt ist.


1
Beeinflusst das bs nur die Kopiergeschwindigkeit oder wirkt es sich auf die Speicherung der Daten aus?
Nick

3
Es hat keine Auswirkung auf die Speicherung der Daten, ist jedoch wesentlich effizienter als die Verwendung der Standardblockgröße (512 Byte) zum Lesen und Schreiben.
Larsks

3
@Nick: Unter Linux können Sie dem ddProzess das USR1Signal senden , dass er eine Statuszeile mit dem überwiesenen Betrag anzeigt. Holen Sie sich die Prozessnummer Ihres ddProzesses mit etwas wie ps aux | grep ddund verwenden Sie dann diese PID mit dem Befehl kill -USR1 $PID. Die Nachricht wird auf dem ursprünglichen Terminal angezeigt, an dem Sie gestartet haben dd.
Sven

3
Sie möchten wahrscheinlich kein so großes bs verwenden, da es nur das Schreiben in die Pipe zu ssh blockiert, bis es das meiste davon auf den Netzwerk-Socket übertragen kann. In dieser Zeit wird die Festplatte inaktiv. Da die standardmäßige Readahead-Größe 128 KB beträgt, möchten Sie sich wahrscheinlich daran halten. Oder erhöhen Sie die Readahead-Größe der Festplatte.
Psusi

1
@psusi: Der Link Zoredache unter der Frage zeigte das Gegenteil, sie erzielten mit 16 Millionen Blockgrößen das schnellste Ergebnis, verwendeten jedoch netcat anstelle von ssh als Übertragungsmethode, was immer eine bessere Option ist, wenn keine Verschlüsselung erforderlich ist.
Sven

18

Hier ist eine optimierte Version, die den Fortschritt bei der Verwendung pvund Verwendung von BS für größere Blöcke sowie bei gzipder Reduzierung des Netzwerkverkehrs zeigt.

Das ist perfekt, wenn Sie Daten zwischen langsamen Verbindungen wie Internet-Servern verschieben. Ich empfehle, den Befehl in einer screen- oder tmux-Sitzung auszuführen. Auf diese Weise kann die SSH-Verbindung zum Host, von dem aus Sie den Befehl ausführen, problemlos getrennt werden.

$ 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
Sie könnten ssh -Canstelle von verwenden gzip. Ich bin mir nicht sicher, ob es Auswirkungen auf die Leistung gibt, aber es ist viel weniger Tippen.
Samuel Edwin Ward

1
Ich schlage auch vor, entweder pigz oder pxz -1 anstelle von gzip zu verwenden, das Multithreading hilft auf jedem modernen Server wirklich .
sCiphre

pvkann Probleme mit der Anzahl der Bytes verursachen (nach meiner Erfahrung werden mit diesem System mehr als 500 vps auf andere Server übertragen), und nach diesem Problem sind die lvm-Volumes inkonsistent. Vorteile des Arbeitsfortschritts sind null und dangeorus. Wenn Sie den Fortschritt sehen möchten, öffnen Sie zum Beispiel eine Konsole mit ifto.
abkrim

4

Wie wäre es mit einem alten Freund, um dies zu tun. NetCat.

Auf dem System, auf dem der logische Datenträgertyp verloren geht

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

Dann auf dem empfangenden System. Art

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

Übersetzen Sie diese Datei, und leiten Sie sie an nc (netcat) weiter, das diesen Port abhört. Auf dem empfangenden System wartet netcat 10 Sekunden, wenn es keine Daten erhält, bevor es auf [ip oder name] auf [port] schließt, und leitet diese Daten dann an dd weiter, um sie auszuschreiben.


2
Netcat verwendet mit diesen Optionen kein UDP.
Samuel Edwin Ward

3

Zuerst würde ich einen Schnappschuss von lv machen:

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

Danach müssen Sie auf dem neuen Host ein neues lv mit der gleichen Größe erstellen (z. B. mit lvcreate). Anschließend können Sie die Daten direkt auf den neuen Host kopieren. Hier ist mein Beispiel für den Kopierbefehl:

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

Ich habe die Prozedur verwendet, um eine von proxmox pve verwaltete VM auf einen anderen Host zu kopieren. Das logische Volume enthielt mehrere zusätzliche LVs, die von der VM selbst verwaltet wurden.


2

Stellen Sie zunächst sicher, dass das logische Volume nicht bereitgestellt ist. Wenn dies der Fall ist und Sie eine "heiße Kopie" erstellen möchten, erstellen Sie zuerst einen Schnappschuss und verwenden Sie stattdessen Folgendes: lvcreate --snapshot --name transfer_snap --size 1G

Ich muss eine Menge Daten (7 TB) zwischen zwei mit 1 GBit verbundenen Servern übertragen, daher brauchte ich die schnellstmögliche Möglichkeit, dies zu tun.

Solltest du SSH benutzen?

Die Verwendung von ssh kommt nicht wegen seiner Verschlüsselung in Frage (wenn Sie eine CPU mit AES-NI-Unterstützung haben, schadet dies nicht so sehr), sondern wegen seiner Netzwerkpuffer. Diese skalieren nicht gut. Es gibt eine gepatchte Ssh-Version , die dieses Problem behebt. Da es jedoch keine vorkompilierten Pakete gibt, ist dies nicht sehr praktisch.

Komprimierung verwenden

Bei der Übertragung von Raw-Disk-Images empfiehlt es sich immer, die Komprimierung zu verwenden. Sie möchten jedoch nicht, dass die Komprimierung zu einem Engpass wird. Die meisten Unix-Komprimierungstools wie gzip sind Singlethread-Tools. Wenn die Komprimierung eine CPU auslastet, ist dies ein Engpass. Aus diesem Grund verwende ich immer pigz, eine gzip-Variante, bei der alle CPU-Kerne für die Komprimierung verwendet werden. Und das ist notwendig, um die GBit-Geschwindigkeit zu übertreffen.

Verschlüsselung verwenden

Wie gesagt, ssh ist langsam. Wenn Sie eine AES-NI-CPU haben, sollte dies kein Engpass sein. Anstatt also ssh zu verwenden, können wir openssl direkt verwenden.

Geschwindigkeiten

Um Ihnen eine Vorstellung von der Geschwindigkeit der Komponenten zu geben, sind hier meine Ergebnisse. Das sind Übertragungsgeschwindigkeiten zwischen zwei Produktionssystemen, die lesen und in den Speicher schreiben. Die tatsächlichen Ergebnisse hängen von der Netzwerkgeschwindigkeit, der Festplattengeschwindigkeit und der CPU-Quellgeschwindigkeit ab! Ich mache das, um zu zeigen, dass es zumindest keinen großen Leistungsabfall gibt. 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 Fazit: Durch die Komprimierung wird eine spürbare Beschleunigung erzielt, da die Datenmenge erheblich reduziert wird. Dies ist umso wichtiger, wenn Sie langsamere Netzwerkgeschwindigkeiten haben. Achten Sie bei der Verwendung der Komprimierung auf die CPU-Auslastung. Wenn die Nutzung maximal wird, können Sie versuchen, ohne es. Verwenden der Komprimierung als nur geringe Auswirkung auf AES-NI-Systeme, imho nur, weil sie der Komprimierung etwa 30-40% CPU stiehlt.

Bildschirm verwenden

Wenn Sie wie ich viele Daten übertragen, möchten Sie nicht, dass diese durch eine Netzwerkunterbrechung Ihres ssh-Clients unterbrochen werden. Beginnen Sie daher besser mit einem Bildschirm auf beiden Seiten. Dies ist nur ein Hinweis, ich werde hier kein Bildschirm-Tutorial schreiben.

Lets Copy

Installieren Sie einige Abhängigkeiten (von Quelle und Ziel): apt install pigz pv netcat-openbsd

Erstellen Sie dann auf dem Ziel ein Volume mit der gleichen Größe wie die Quelle. Wenn Sie sich nicht sicher sind, verwenden Sie lvdisplay für die Quelle, um die Größe zu ermitteln und das Ziel zu erstellen. lvcreate -n lvname vgname -L 50G

Bereiten Sie als nächstes das Ziel für den Empfang der Daten vor:

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

und wenn Sie fertig sind, starten Sie die Übertragung auf der Quelle:

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

Hinweis: Wenn Sie die Daten lokal übertragen oder sich nicht für die Verschlüsselung interessieren, entfernen Sie einfach den Openssl-Teil von beiden Seiten. Wenn es Ihnen wichtig ist, dass asdkjn2hb der Verschlüsselungsschlüssel ist, sollten Sie ihn ändern.


TUN SIE DAS NIEMALS AUF EINEM PROXMOX-SERVER: Installieren von netcat-openbsd Die Installation von netcat-openbsd löschte ProxMox vollständig vom Server und verursachte mehr als 5 Stunden Ausfallzeit und Arbeit !!!
Zoltan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.