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


环境:

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


分析

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


场景假设如下:


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

1
/www/p_w_picpaths/2014/04/30/xxx.png


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


解决办法:

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


1
2
3
4
5
6
find /www/p_w_picpaths \
    -mindepth 3 \
    -maxdepth 3 \
    -type d \
    -exec rsync -aquR  {}/ 192.168.1.2::www/p_w_picpaths/ \; \
    -exec echo /www/p_w_picpaths/{} done \;


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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env bash
 
dir="www/p_w_picpaths"
 
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足够优秀,但是还不完全成熟。


本文出自 “专注Linux 运维” 博客,请务必保留此出处http://purplegrape.blog.51cto.com/1330104/1404981