FastDFS扩容最佳实践-真实经历
团队正准备对当前生产文件服务器一块高效云盘进行自盘扩容时,发现如下提示:
经过查询资料确认,数据盘支持创建GPT分区和MBR分区,二者区别如下:
● GPT:能够识别大于2 TiB的分区,创建分区数量无限制。
● MBR:只能识别小于或等于2 TiB的分区,最多创建4个分区。
而我们目标扩容磁盘,正是MBR分区+EXT3文件系统,不改变分区格式情况下,无法通过增加数据盘空间来扩容。[捂脸哭]
需要调整方案,兵法两路,首先本地备份快照点后的差异数据,开始从fastdfs本身的扩容机制上下手的探索,查了半小时线上案例和官方资料,基本可确定实施方向,可以保证不影响线上数据且操作可回退!
第一步,购买一块新盘,然后手动格式化和挂载新分区到新的文件路径/mnt2,做为新存储路径,这块按照官方文档操作,亲测可行:https://help.aliyun.com/document_detail/25426.html
第二步,采用基于fastdfs多store_path机制的扩容方式:
核心原理就一句话:fastdfs在一台服务器支持多个store_path,每个store_path指向一个存储路径
1、确保文件tracker.conf的此配置项如下:
# the method of selecting group to upload files
# 0: round robin
# 1: specify group
# 2: load balance, select the max free space group to upload file
store_lookup=2
2、两个文件(storage.conf,mod_fastdfs.conf)共同修改配置:
# path(disk or mount point) count, default value is 1
store_path_count=2
# store_path#, based 0, if store_path0 not exists, it's value is base_path
# the paths must be exist
store_path0=/mnt/fdfs/storage
store_path1=/mnt2/fdfs/storage #新磁盘路径
3、nginx.conf配置修改如下:
location ~/group[0-9]/M00 {
root /mnt/fdfs/storage/data;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
if ($arg_attname) {
add_header Content-Disposition "attachment;filename=$arg_attname;filename*=utf-8''$arg_attname";
}
ngx_fastdfs_module;
}
# 新磁盘路径配置
location ~/group[0-9]/M01 {
root /mnt2/fdfs/storage/data;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS') {
return 204;
}
if ($arg_attname) {
add_header Content-Disposition "attachment;filename=$arg_attname;filename*=utf-8''$arg_attname";
}
ngx_fastdfs_module;
}
4、先关闭fastdfs再启动
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
nginx -s reload
实操有用的参考文档:
https://blog.csdn.net/qq_41303447/article/details/121634918
https://wenku.baidu.com/view/133742db971ea76e58fafab069dc5022aaea46a3.html
https://www.cnbiancheng.com/?p=49670
总结原理分析:
参考文章https://www.cnblogs.com/wlandwl/p/fastdfsAdd.html
1、一个storage属于一个分组group,一个分组group对应的数据存储目录地址可一个或多个。(这一点保证了group的文件地址容量扩展)
2、一个group的一个目录存储地址最多可存储的文件个数为:256*256*1000=65536000。storage文件存储机制中,有小文件合并存储到一个大文件的机制。
3、一个storage可以配置多个tracker地址,同理一个tracker可以分配文件存储到多个storage上面。(这一点保证了服务器storage容量扩展)
4、当一个storage中有多个文件目录地址时,通过tracker.conf中的关键参数store_path,可以配置一个文件在存储时,多个对应存储目录地址的存储机制,如轮询或选择剩余空间大的文件目录。
5、当一个tracker对应的存储storage具有多个时,通过tracker.conf中的store_lookup,store_server,可以配置当文件上传时,对应多个storage服务器的存储机制,如轮询或选择空间大的服务器。
6、storage文件服务器默认存储空间配置时,当达到文件目录空间不足10%时,便不可以存储文件,可通过tracker.conf中的reserved_storage_space参数修改默认值。(我们配置的是50G,
一周30G增长量,一年1.5T)
7、多个storage可以属于一个组或多个组,当两个或多个storage属于一个组时,各个storage中的文件相互备份。这种机制的优点是保证了文件服务器的备份和负载均衡,缺点是两个storage的存储容量是两个中较小storage的存储容量。