首先,请确保未安装逻辑卷。如果是,并且您要进行“热复制”,请首先创建一个快照,然后使用它:
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是加密密钥,则应该对其进行更改。