本文共 1123 字,大约阅读时间需要 3 分钟。
集中式存储是目前中小企业广泛采用的方案,随着时间的流逝,这些存储不可避免的膨胀。集中式存储的弊端愈加显现,同步就是其中一个。
环境:
文件容量以TB计,里面是千万/亿级的小文件,分布在成千上万的子文件夹内。
分析:
rsync几乎是唯一选择,海量小文件同步面临的问题主要是rsync无止境的扫描,同步进度难以把控,巨大的临时目录等。所以解决办法只能是庖丁解牛,将一个大任务分解成N个小任务。
场景假设如下:
1、源服务器目录结构是按照年月日分布,示例如下
1 | /www/images/ 2014 / 04 / 30 /xxx.png |
2、目标rsync服务器为 192.168.1.2::www,且可写。
解决办法:
很明显,同步最底层的目录最快。
1 2 3 4 5 6 | 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循环,比较好理解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/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足够优秀,但是还不完全成熟。