集中式存儲是目前中小企業廣泛采用的方案,随着時間的流逝,這些存儲不可避免的膨脹。集中式存儲的弊端愈加顯現,同步就是其中一個。
環境:
檔案容量以TB計,裡面是千萬/億級的小檔案,分布在成千上萬的子檔案夾内。
分析:
rsync幾乎是唯一選擇,海量小檔案同步面臨的問題主要是rsync無止境的掃描,同步進度難以把控,巨大的臨時目錄等。是以解決辦法隻能是庖丁解牛,将一個大任務分解成N個小任務。
場景假設如下:
1、源伺服器目錄結構是按照年月日分布,示例如下
/www/p_w_picpaths/2014/04/30/xxx.png
2、目标rsync伺服器為 192.168.1.2::www,且可寫。
解決辦法:
很明顯,同步最底層的目錄最快。
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循環,比較好了解。
#!/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
集中式存儲的缺點是: 必須提前做容量規劃,存儲嚴格控制在設計容量内之内,如果要擴充,必須重新進行容量規劃。
要根本解決這個問題,終極的辦法似乎隻有分布式檔案系統,用全新的設計理念的來解決存儲問題,按需擴充。