海量小文件同步

集中式存储是目前中小企业广泛采用的方案,随着时间的流逝,这些存储不可避免的膨胀。集中式存储的弊端愈加显现,同步就是其中一个。


环境:

文件容量以TB计,里面是千万/亿级的小文件,分布在成千上万的子文件夹内。


分析

rsync几乎是唯一选择,海量小文件同步面临的问题主要是rsync无止境的扫描,同步进度难以把控,巨大的临时目录等。所以解决办法只能是庖丁解牛,将一个大任务分解成N个小任务。


场景假设如下:


1、源服务器目录结构是按照年月日分布,示例如下

/www/images/2014/04/30/xxx.png


2、目标rsync服务器为 192.168.1.2::www,且可写。


解决办法:

很明显,同步最底层的目录最快。


find /www/images \
    -mindepth 3 \
    -maxdepth 3 \
    -type d \
    -exec rsync -aquR  {}/ 192.168.1.2::www/images/ \; \
    -exec echo /www/images/{} done \;


注:-R 可解决远程rsync服务器的目录结构问题。


另一种方法是for循环,比较好理解。

#!/usr/bin/env bash

dir="www/images"

for year in  2014 2015 ;do
        for month in `seq 1 12`;do
                for day in `seq 1 31`;do
                        if [  -d /$dir/$year/$month/$day ];then
                                rsync -aqu /$dir/$year/$month/$day/  192.168.1.2::$dir/$year/$month/$day/
                        else
                                echo "directory /$dir/$year/$month/$day not exist."
                        fi
                done
        done
done


集中式存储的缺点是: 必须提前做容量规划,存储严格控制在设计容量内之内,如果要扩展,必须重新进行容量规划。


要根本解决这个问题,终极的办法似乎只有分布式文件系统,用全新的设计理念的来解决存储问题,按需扩展。


可惜的是,目前的分布式文件系统几乎都是为大文件而设计,对于海量小文件支持都不够。ceph足够优秀,但是还不完全成熟。


### 使用 `rsync` 进行大量小文件迁移的最佳实践 #### 优化传输效率 为了提高 `rsync` 对于大量小文件的处理速度,可以调整一些参数来减少每次同步时建立连接的时间消耗。通过增加批量处理能力并启用压缩功能,能够显著提升整体性能。 ```bash rsync -avz --partial --progress /source/directory/ user@remote:/destination/ ``` 此命令中的 `-a` 参数保持原有属性不变;`-v` 显示详细过程;`-z` 启用压缩机制以加快网络上传输速率;`--partial` 允许断点续传;`--progress` 展示进度条以便观察当前状态[^1]。 #### 减少元数据开销 当面对海量的小型文档时,频繁读取和写入这些对象会带来额外负担。因此,在启动服务之前应考虑关闭不必要的日志记录选项,并设置合适的缓存策略减轻 I/O 负载: ```bash rsync -aq --delete-after --bwlimit=1000 --stats source_dir dest_dir ``` 这里使用了更安静模式 (`-q`) 来降低输出级别,同时利用 `--delete-after` 确保删除动作发生在所有成功传输之后,从而避免中途失败影响最终一致性。另外还加入了带宽限制(`--bwlimit`) 和统计报告(`--stats`) 功能方便监控资源占用情况[^2]。 #### 并发多线程加速 针对支持多核 CPU 的现代计算机环境,可以通过开启多个并发进程进一步缩短总耗时。这不仅适用于本地磁盘间的转移任务,也适合远程主机之间的大规模数据交换活动。 ```bash rsync -avP --max-size='1M' --iconv=utf8,utf8mb4 -e "ssh -T -c arcfour -o Compression=no -x" ./ remote:/path/to/dir & for i in {1..9}; do rsync -avP --max-size='1M' --min-size='1k' --files-from=<(find . -type f | shuf) \ --iconv=utf8,utf8mb4 -e "ssh -T -c arcfour -o Compression=no -x" ./ remote:/path/to/dir & done wait ``` 上述脚本创建了一个由十个独立后台作业组成的队列,它们各自负责一部分随机选取出来的文件集合。注意这里的 SSH 配置被简化为仅采用最基础的安全协议,实际部署前需根据具体需求做适当修改[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值