go-fastdfs 高性能、高可靠分布式文件系统开源项目

我要开发同款
匿名用户2019年01月24日
170阅读
开发技术GO语言
所属分类Google Go、分布式应用/网格、服务器软件
授权协议Unlicense

作品详情

 

go-fastdfs是一个基于http协议的分布式文件系统,它基于大道至简的设计理念,一切从简设计,使得它的运维及扩展变得更加简单,它具有高性能、高可靠、无中心、免维护等优点。

支持curl命令上传支持浏览器上传支持HTTP下载支持多机自动同步支持断点下载支持配置自动生成支持小文件自动合并(减少inode占用) 支持秒传支持一键迁移支持并行体验支持断点续传(tus)支持docker部署支持自监控告警支持集群文件信息查看使用通用HTTP协议无需专用客户端(支持wget,curl等工具)类fastdfs高性能(使用leveldb作为kv库)高可靠(设计极其简单,使用成熟组件)无中心设计(所有节点都可以同时读写)优点无依赖(单一文件)自动同步失败自动修复按天分目录方便维护支持不同的场景文件自动去重支持目录自定义支持保留原文件名支持自动生成唯一文件名支持浏览器上传支持查看集群文件信息支持集群监控邮件告警支持小文件自动合并(减少inode占用)支持秒传  极低资源开销支持断点续传(tus)支持docker部署  支持一键迁移(从其他系统文件系统迁移过来)支持并行体验(与现有的文件系统并行体验,确认OK再一键迁移)支持token下载 token=md5(file_md5+timestamp)运维简单,只有一个角色(不像fastdfs有三个角色TrackerServer,StorageServer,Client),配置自动生成每个节点对等(简化运维)所有节点都可以同时读写启动服务器(已编译,下载极速体验,只需一分钟)

./fileserver

命令上传

curl-Ffile=@http-index-fshttps://10.1.xx.60:8080/upload

WEB上传(浏览器打开)

https://yourserverip:8080 注意:不要使用127.0.0.1上传

代码上传(选项参阅浏览器上传)

python版本

importrequestsurl='https://10.1.5.9:8080/upload'files={'file':open('report.xls','rb')}options={'output':'json','path':'','scene':''}#参阅浏览器上传的选项r=requests.post(url,files=files)print(r.text)

golang版本

packagemainimport(  "fmt"  "github.com/astaxie/beego/httplib")funcmain(){  varobjinterface{}  req:=httplib.Post("https://10.1.5.9:8080/upload")  req.PostFile("file","path/to/file")  req.Param("output","json")  req.Param("scene","")  req.Param("path","")  req.ToJSON(&obj)  fmt.Print(obj)}

java版本

依赖(这里使用了hutool工具包,更简便)

  cn.hutool  hutool-all  4.4.3

上传代码

publicstaticvoidmain(String[]args){//文件地址Filefile=newFile("D:\\git\\2.jpg");//声明参数集合HashMapparamMap=newHashMap<>();//文件paramMap.put("file",file);//输出paramMap.put("output","json");//自定义路径paramMap.put("path","image");//场景paramMap.put("scene","image");//上传Stringresult=HttpUtil.post("https://xxxxx:xxxx/upload",paramMap);//输出json结果System.out.println(result);}

更多语言请参考

断点续传示例

golang版本

packagemainimport("os""fmt""github.com/eventials/go-tus")funcmain(){f,err:=os.Open("100m")iferr!=nil{panic(err)}deferf.Close()//createthetusclient.client,err:=tus.NewClient("https://10.1.5.9:8080/big/upload/",nil)fmt.Println(err)//createanuploadfromafile.upload,err:=tus.NewUploadFromFile(f)fmt.Println(err)//createtheuploader.uploader,err:=client.CreateUpload(upload)fmt.Println(err)//starttheuploadingprocess.fmt.Println(uploader.Upload())}

更多客户商请参考

部署图 

有问题请点击反馈

重要说明

在issue中有很多实际使用的问题及回答(很多已关闭,请查看已关闭的issue)

项目从v1.1.8开始进入稳定状态

Q&A最佳实战?一、如果是海量存储,不要开启文件token认证功能,减少性能开消。二、尽量用标准上传,上传后业务保存path,在业务用的时候再并接上域名(方便迁移扩展等)。三、如果使用断点续传,上传后一定要用文件id置换成path存储(如何置换看QA/API文档),为后面访问减少性能开消。四、尽量使用物理服务器部署,因为主要压力或性能来自于IO总结:业务保存的文件的path,减少后期访问路径转换带来开消,文件访问权限由业务来完成,这样性能最好,通用性强(可直接其它web服务器)。重要提醒:如果开启小文件合并功能,后期是无法删除小文件的。 有API文档么? API文档 在微信讨论群中大家都问到go-fastdfs性能怎样?  由于问的人太多,在这里统一回答。go-fastdfs的文件定位与其它分布式系统不同,它的寻址是直接定位,不经过任何组件,所以可以近似时间复杂度为o(1)[文件路径定位]基本没有性能损耗,项目中也附有压测脚本,大家可以自已进行压测,群里就不要太多讨论问题了,人多每次回复同样的问题大家也会觉得这群无聊。已经使用fastdfs存储的文件可以迁移到gofastdfs下么?答案是可以的,你担心的问题是路径改变,gofastdfs为你考虑了这一点步骤:  一、下载最新版的go-fastdfs  二、将原来的fastdfs文件目录复制到go-fastdfs的files目录下  三、将配置enable_migrate设为true  注意:迁移过程中会扫描整下files目录下的所有文件,  速度较慢,迁移完成后请将enable_migrate设为false  什么是集群,如何用Nginx管理多集群?1、在go-fastdfs中,一个集群就是一个group。2、请参阅部署图注意:配置中的support_group_manage参数设为true时,所有的url中都自动添加组信息。例如:https://10.1.5.9:8080/group/status默认:https://10.1.5.9:8080/status区别:多了group,对应配置中的group参数,这样主要是为了解决一个Nginx反向代理多个group(集群)具体请参阅部署图如何搭建集群?一、先下载已编译的可执行文件(用最新版本)二、运行可执行文件(生成配置)三、修改配置  peers:增加对端的http地址  检查:  host:自动生成是否正确  peer_id:集群内是否唯一四、重新运行服器五、验证服务是否OK适合海量存储吗?答案:适合海量存储特别说明:需然用leveldb作为元数据存储,但不强依懒leveldb,并且进行超过1亿以上的文件进行压测(可以用项目提供的脚本进行压测,有问题及时反馈到issue),1亿文件元数据大小约5G,导出元数据文本大小22G  还需要安装nginx么?可以不安装,也可以选择安装gofastdfs本身就是一个高性能的web文件服务器。  能动态加载配置么?答案:是可以的,但要更新到最新版本步骤:1)修改conf/cfg.json文件2)访问https://10.1.xx.60:8080/reload3)注意:每个节点都需要进行同样的操作  如何查看集群文件信息?https://10.1.xx.60:8080/stat如果出现文件统计出错怎么办?请删除data目录下的stat.json文件重启服务,请系统自动重新计算文件数。或者调用https://10.1.xx.60:8080/repair_stat  可靠性怎样,能用于生产环境么?本项目已大规模用于生产环境,如担心不能满足可以在使用前对其各项特性进行压力测试,有任何问题可以直接提issue能不能在一台机器部置多个服务端?不能,在设计之初就已考虑到集群的高可用问题,为了保证集群的真正可用,必须为不同的ip,ip不能用127.0.0.1错误 "peers":["https://127.0.0.1:8080","https://127.0.0.1:8081","https://127.0.0.1:8082"]正确 "peers":["https://10.0.0.3:8080","https://10.0.0.4:8080","https://10.0.0.5:8080"]文件不同步了怎么办?正常情况下,集群会每小时自动同步修复文件。(性能较差,在海量情况下建议关闭自动修复)那异常情况下怎么?答案:手动同步(最好在低峰执行)https://172.16.70.123:7080/sync?date=20190117&force=1(说明:要在文件多的服务器上执行,相关于推送到别的服务器)参数说明:date表示同步那一天的数据 force 1.表示是否强制同步当天所有(性能差),0.表示只同步失败的文件不同步的情况:1)原来运行N台,现在突然加入一台变成N+1台2)原来运行N台,某一台机器出现问题,变成N-1台如果出现多天数据不一致怎么办?能一次同步所有吗?答案是可以:(最好在低峰执行)https://172.16.70.123:7080/repair?force=1 文件不同步会影响访问吗?答案:不会影响,会在访问不到时,自动修复不同步的文件。如何查看系统状态及说明?https://172.16.70.123:7080/status注意:(Fs.Peers是不带本机的,如果带有可能出问题)本机为Fs.Localsts["Fs.ErrorSetSize"]=this.errorset.Cardinality()这个会导致内存增加  如何编译(go1.9.2+)?gitclonehttps://github.com/sjqzhang/go-fastdfs.gitcdgo-fastdfsmvvendorsrcpwd=`pwd`GOPATH=$pwdgobuild-ofileserverfileserver.go如何跑单元测试(尽量在linux下进行)?gitclonehttps://github.com/sjqzhang/go-fastdfs.gitcdgo-fastdfsmvvendorsrcpwd=`pwd`GOPATH=$pwdgotest-vfileserver.gofileserver_test.go如何压测?先用gen_file.py产生大量文件(注意如果要生成大文件,自已在内容中乘上一个大的数即可)例如:#-*-coding:utf-8-*-importosj=0foriinrange(0,1000000):ifi%1000==0:j=ios.system('mkdir%s'%(i))withopen('%s/%s.txt'%(j,i),'w+')asf:f.write(str(i)*1024)接着用benchmark.py进行压测也可以多机同时进行压测,所有节点都是可以同时读写的代码为什么写在一个文件中?一、目前的代码还非常简单,没必要弄得太复杂。二、个人理解模块化不是分开多个文件就表示模块化,大家可以用IDE去看一下代码结构,其实是已经模块化的。  支持断点下载?答案:支持curlwget如何wget-chttps://10.1.5.9:8080/group1/default/20190128/16/10/2Gculr-C-https://10.1.5.9:8080/group1/default/20190128/16/10/2G Docker如何部署?步骤:方式一、一、构建镜像dockerbuild.-tfastdfs二、运行容器(使用环境变量GO_FASTDFS_DIR指向存储目录。)dockerrun--namefastdfs-v/data/fastdfs_data:/data-eGO_FASTDFS_DIR=/datafastdfs方式二、一、拉取镜像dockerpullsjqzhang/go-fastdfs二、运行容器dockerrun--namefastdfs-v/data/fastdfs_data:/data-eGO_FASTDFS_DIR=/datafastdfs大文件如何分块上传或断点续传?一般的分块上传都要客户端支持,而语言的多样性,客户端难以维护,但分块上传的功能又有必要,为此提供一个简单的实现思路。方案一、借助linuxsplitcat实现分割与合并,具体查看split与 cat帮助。分割:split-b1Mfilename#按每个文1M合并:catx*>filename#合并方案二、借助hjsplithttps://www.hjsplit.org/具体自行实现方案三、建议用go实现hjsplit分割合并功,这样具有跨平台功能。(未实现,等你来....)方案四、使用内置的继点续传功能(使用protocolforresumableuploads协议,[详情](https://tus.io/))注意:方案四、只能指定一个上传服务器,不支持同时写,并且上传的url有变化原上传url:https://10.1.5.9:8080//upload断点上传url:https://10.1.5.9:8080//big/upload/上传完成,再通过秒传接口,获取文件信息如何秒传文件?通过httpget的方式访问上传接口https://10.0.5.9:8080/upload?md5=filesum&output=json参数说明:md5=sum(file)文件的摘要算法要与文件务器的算法一致(算法支持md5|sha1),如果是断点续传,可以使用文件的id,也就是urlolad后的idoutput=json|text返回的格式集群如何规划及如何进行扩容?建议在前期规划时,尽量采购大容量的机器作为存储服务器,如果要两个复本就用两台组成一个集群,如果要三个复本就三台组成一个集群。(注意每台服务器最好配置保持一样)如果提高可用性,只要在现在的集群peers中加入新的机器,再对集群进行修复即可。修复办法https://172.16.70.123:7080/repair?force=1(建议低峰变更)如何扩容?为简单可靠起见,直接搭建一个新集群即可(搭建就是启动./fileserver进程,设置一下peers的IP地址,三五分钟的事)issue中chengyuansen同学向我提议使用增加扩容特性,我觉得对代码逻辑及运维都增加复杂度,暂时没有加入这特性。访问限制问题出于安全考虑,管理API只能在群集内部调用或者用127.0.0.1调用.有问题请点击反馈
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论