13
2020
06
18:07:16

Linux转移海量小文件的技巧

在做文件迁移或者服务器迁移的时候,有时候会遇到海量小文件的情况,尤其是有那种用户上传文件,图片,附件的服务器,动辄就是几十上百G的文件,而每个文件只有几K到几十K,使用普通的cp,scp,ftp传输非常慢而且不支持断点续传。如果通过先打包再传输的方式,要消耗掉大量的存储空间,而且压缩和解压又要消耗双倍的时间,非常不划算。下面介绍几种备份海量小文件的方法,持续更新。


1、rsync同步


通过cp,scp,ftp备份文件不仅要考虑到网络带宽,并且在文件又小又多的情况下传输速度也上不去,而且不支持断点续传,rsync同样使用网络进行备份,不过有很大的好处,比如不受文件系统的约束,只要是文件就可以远程传输,而且可以断点续传,rsync会自动扫描哪些传输完成,哪些没有完成,哪些传输损坏,所以我们可以不受限与时间和空间,分批传输。


rsync的搭建非常简单,只需安装然后写一个配置文件即可


被复制端安装rsync服务器


yum install rsync

编写配置文件 


vi /etc/rsyncd.conf

配置文件内容,这里假设我们要同步/app下面的所有内容


uid=nobody

gid=nobody

max connetctions=4

use chroot=no

log file=/var/log/rsyncd.log

transfer logging=yes

log format=%t %a %m %f %b

pid file=/var/run/rsyncd.pid

lock file=/var/run/rsyncd.lock

 

[app]

path=/app/

comment=app files

ignore errors

read only=yes

list=yes

最后启动rsyncd


/usr/bin/rsync --daemon

 


然后在接收文件的服务器上,安装rsync,然后只需一条命令就可以完成备份,但是要注意文件的权限问题,如果源文件属于root,备份命令由root发出,那么同步完后文件所属也是root;如果源文件是root,备份命令由nfsnobody发出,那么备份后的文件所属为nfsnobody。


rsync -avzP root@192.168.1.2::app  /data/app/

比如执行上面的命令,我们就可以把宿主机192.168.1.2上面的[app]中记录的路径/app下面的所有文件和目录结构都传输到备份服务器上,并且支持断点续传,甚至原服务器文件更新了,新增了也可以同步过来,如果加上了--delete参数,那么源服务器删除的文件也会在备份服务器上删除。


 


2、克隆磁盘


众所周知小文件的复制要远远慢于单个大文件的,因为文件不停的创建,写入,关闭要浪费巨大的开销。但是我们可以把一块磁盘,一个块设备,甚至一个LV看成一个文件,然后通过块拷贝的方式进行快速复制,绕过操作系统对文件的读写。说白了就是克隆一块硬盘。硬盘的读写速度最高能达到100MB/s左右,SSD甚至能达到600MB/s左右,而拷贝小文件也就几十MB的速度,所以说通过牺牲空间的方式来提高速度。这个在虚拟机上非常容易实现,直接克隆虚拟机或者vmdk磁盘就可以了。


但是这种方式受制于你把文件存储在哪里了,如果是物理磁盘或者虚拟机vmdk磁盘上非常容易克隆,可是如果是使用了LVM的VG和LV怎么办,当然也是可以的,因为LV在linux里也算是块文件,这里我们要用到linux系统的一个命令,就是dd。


dd命令可以实现以块的方式读取块设备,比如硬盘,然后再以块的方式进行写入,通过这种方式,就不需要考虑文件大小和文件数量的问题了,因为dd命令不同与cp命令,是以块为单位的,并且整块磁盘上的分区表,引导区都会被克隆到新磁盘上。


但是dd命令相对与cp命令有一个缺点,就是不能直接拷贝文件夹,而必须是一个块设备,也就是/dev里面的块设备。一般来说,拷贝一块完整的物理硬盘应该是这样的(两块硬盘的大小完全一样)


dd if=/dev/sda of=/dev/sdb

根据这个,我们可以把一块空白硬盘插到源服务器上,通过dd命令把源服务器的一个LV的命令全部拷贝到空白硬盘上,再把这个硬盘拆下来放到备份服务器上。在虚拟机上这都是很容易实现的。


磁盘 /dev/mapper/rhel-rpms:80.0 GB, 79993765888 字节,156237824 个扇区

Units = 扇区 of 1 * 512 = 512 bytes

扇区大小(逻辑/物理):512 字节 / 512 字节

I/O 大小(最小/最佳):512 字节 / 512 字节

 

Disk /dev/sdb: 85.9 GB, 85899345920 bytes, 167772160 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

 


比如我这里VG名称是rhel,LV的逻辑文件位置是/dev/mapper/rhel-rpms,新插入的空白硬盘逻辑文件是/dev/sdb。我打算直接把文件和文件系统同步到sdb上,不在sdb上划分区和建立文件系统。当然你也可以划分分区比如sdb1,sdb2等,都是一样的


dd if=/dev/mapper/rhel-rpms of=/dev/sdb

注意这里的sdb要和被克隆的LV完全一样的大小,由于LV的大小经常不是整数,所以我这里建立的/dev/sdb要比LV中的已用空间稍微大一些,但是不能大的太多,因为多出来的部分也会被dd命令写入,白白浪费时间。


同样,如果想要把文件系统做的灵活,也可以从一个LV拷贝到另一个LV中,注意在拷贝的过程中两个LV最后都umount掉,防止有程序再写入或者修改文件。其实不umount也有很大概率成功,我试过,不过还是推荐先umount。


这个方法告诉我们,如果我们要存储一些大量文件,最好是放到单独的LV或者磁盘下面,这样以后迁移或者备份都会容易一些。


 


3、直接远程挂载


有些情况下,我们不需要把文件完全的拷贝或者迁移,只要新的服务器能够读到就可以了,如果对文件IO要求不太大,可以直接把原来的服务器作为文件服务器使用,通过NFS的方式,把文件系统通过网络让远程服务器进行挂载,简单的说,就是把源服务器改造成一个NAS服务器


yum install nfs-utils

然后编辑nfs配置文件


vi /etc/exports

/data/app         192.168.1.2(rw,async,all_squash,no_subtree_check)

第一个参数是要分享的目录,第二个参数是允许连接的IP地址,如果允许多个IP,可以重复写上面这句多行。


rw代表可读写,async代表支持异步读写(速度更快),sync即变化立即写入磁盘(事务性更好)


all_squash是把所有用户建立的文件所属都降低成nfsnobody,如果是root_squash则是只把root用户创建的文件所属变为nfsnobody,其他用户的文件还是保留原所属,这样会带来一些权限问题导致的无法修改或创建。


启动nfs服务


service nfs start

在远程服务器只需修改/etc/fstab进行挂载即可,加入如下一行


192.168.1.1:/data/app   /app                  nfs     defaults        0 0




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/1389.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: