通过网络将逻辑卷直接从一台服务器移动到另一台服务器?


13

我有一台带有多台VM的KVM主机。每个VM在主机上使用逻辑卷。我需要将LV复制到另一台主机。

通常,我会使用类似:

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

要将LV转换为图像文件并使用SCP对其进行移动。然后使用DD将文件复制回新主机上的新LV。

这种方法的问题是,两台计算机上所需的磁盘空间是VM的两倍。即。一个5GB的LV会为LV使用5GB的空间,而dd副本也会为映像使用一个额外的5GB的空间。对于小型LV来说这很好,但是(如果是我的情况)如果您有500GB的LV用于大型VM,该怎么办?新主机具有1TB硬盘,所以它不能保持一个500GB的DD镜像文件,并有一个500GB的逻辑卷复制到有房的主机操作系统房间其他较小的客人。

我想做的是这样的:

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

换句话说,将数据直接从一个逻辑卷通过网络复制到另一个逻辑卷,并跳过中间映像文件。

这可能吗?


Answers:


24

当然可以。

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

繁荣。

不过,请帮自己一个忙,并使用比默认块大小更大的值。也许添加bs = 4M(以4 MB的块读取/写入)。您可以看到评论中有些关于块大小的挑剔。如果您发现自己经常这样做,请花一点时间尝试使用不同的块大小在不同的时间尝试一下,然后自己看看什么可以让您获得最佳的传输速率。

回答评论中的一个问题:

您可以通过pv传输传输,以获取有关传输的统计信息。这比将信号发送到所得到的输出要好得多dd

我还要说的是,尽管当然使用netcat或其他任何不会增加加密开销的方法都将变得更加高效,但我通常会发现额外的速度会带来一些便利。除非我要移动非常大的数据集,否则尽管有很多开销,但我通常还是坚持使用ssh,因为在大多数情况下,所有内容都已设置为Just Work。


1
bs仅影响复制速度,还是对数据的存储方式有影响?
尼克

3
它对数据的存储方式没有影响,但是比使用默认的块大小(512字节)进行读取和写入要有效得多。
larsks 2012年

3
@Nick:在Linux上,您可以向dd进程发送USR1信号,以使其显示状态行以及已传输的金额。使用dd类似的方法获取您的进程的进程号,ps aux | grep dd然后将此PID与命令配合使用kill -USR1 $PID。该消息将显示在您开始的原始终端上dd
斯文

3
您可能不希望使用那么大的bs,因为它只会阻止向ssh写入管道,直到它可以将大部分传输到网络套接字,在此期间磁盘将处于空闲状态。由于默认预读大小为128k,您可能要坚持这样做。或增加磁盘预读大小。
psusi'2

1
@psusi:问题下方的注释中Zoredache的链接显示了相反的结果,它们以16M的块大小获得了最快的结果,但是使用netcat而不是ssh作为传输方法,当不需要加密时,这总是一个更好的选择。
斯文

18

这是一个优化的版本,它显示了pv使用BS并将其用于更大块的进度,还用于gzip减少网络流量。

在慢速连接(例如Internet服务器)之间移动数据时,这是完美的选择。我建议在屏幕或tmux会话中运行命令。这样,从您执行命令的主机到ssh的连接就可以断开而不会出现问题。

$ 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
您可以使用ssh -C代替gzip。我不确定是否会对性能产生影响,但是打字会少很多。
塞缪尔·埃德温·沃德

1
我还建议使用Pigz或pxz -1代替gzip,多线程在任何现代服务器上都确实有用
sCiphre

pv可能会导致出现字节数的问题(在我的经验中,将更多的500 vps迁移到使用此系统的其他服务器),并且出现此问题后,lvm卷不一致。看工作进展的受益者为null和dangeorus。如果您喜欢查看进度,请使用例如ifto打开控制台。
abkrim

4

如何使用旧朋友来执行此操作。NetCat。

在丢失逻辑卷类型的系统上

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

然后在接收系统上。类型

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

将原始文件dd转换为原始文件,并将其通过管道传递到将侦听此端口的nc(netcat)。在接收系统上,netcat如果没有数据,将等待10秒钟,然后关闭[port]上的[ip或name],然后将该数据通过管道传递给dd以将其写出。


2
Netcat不在这些选项上使用UDP。
塞缪尔·埃德温·沃德

3

首先,我将为lv拍摄快照:

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

之后,您必须在新主机上创建一个具有相同大小的新lv(例如,使用lvcreate)。然后,您可以将数据直接复制到新主机。这是我的copy命令示例:

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

我使用此过程将proxmox pve维护的VM复制到另一台主机。逻辑卷包含由VM本身维护的几个其他LV。


2

首先,请确保未安装逻辑卷。如果是,并且您要进行“热复制”,请首先创建一个快照,然后使用它: lvcreate --snapshot --name transfer_snap --size 1G

我必须在两台连接1Gbit的服务器之间传输大量数据(7TB),因此我需要尽可能快的方法。

您应该使用SSH吗?

毫无疑问,使用ssh并不是因为它的加密(如果您的CPU具有AES-NI支持,那么它不会受到太大影响),而是因为它的网络缓冲区。那些扩展不好。有一个修补的Ssh版本可以解决此问题,但是由于没有预编译的软件包,因此不太方便。

使用压缩

传输原始磁盘映像时,始终建议使用压缩。但是您不希望压缩成为瓶颈。大多数unix压缩工具(例如gzip)都是单线程的,因此,如果压缩使一个CPU饱和,则将成为瓶颈。因此,我始终使用Pigz,这是一种gzip变体,它使用所有CPU内核进行压缩。这对于您要达到和超过GBit速度是必要的。

使用加密

如前所述,ssh很慢。如果您具有AES-NI CPU,那么这不会成为瓶颈。因此,我们可以直接使用openssl而不是使用ssh。

速度

为了让您了解组件的速度影响,这是我的结果。这些是在两个生产系统之间进行读取和写入内存的传输速度。您的实际结果取决于网络速度,HDD速度和源CPU速度!我这样做是为了表明至少没有巨大的性能下降。 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 结论:使用压缩可以显着提高速度,因为它大大减少了数据大小。如果您的网络速度较慢,这一点尤为重要。使用压缩时,请注意您的CPU使用情况。如果使用量已满,则可以尝试不使用它。使用压缩仅对AES-NI系统产生很小的影响,恕我直言只是因为它从压缩中窃取了大约30-40%的cpu。

使用屏幕

如果像我一样正在传输大量数据,则不希望由于ssh客户端的网络断开而中断数据,因此最好从两侧的屏幕开始。这只是一个注释,我不会在此处编写屏幕教程。

让我们复制

安装一些依赖项(在源和目标上): apt install pigz pv netcat-openbsd

然后在目标上创建与源大小相同的卷。如果不确定,请在源代码上使用lvdisplay获取大小并创建目标,即: lvcreate -n lvname vgname -L 50G

接下来,准备接收数据的目的地:

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

准备好后,在源上开始传输:

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

注意:如果要在本地传输数据或不关心加密,则只需从两侧移除Openssl部分。如果您愿意,asdkjn2hb是加密密钥,则应该对其进行更改。


永远不要在PROXMOX服务器上执行此操作:apt install netcat-openbsd安装netcat-openbsd会完全抹去服务器上的ProxMox,并导致5个小时以上的停机和工作!!!
Zoltan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.