Git Product home page Git Product logo

sjqzhang / go-fastdfs Goto Github PK

View Code? Open in Web Editor NEW
3.8K 128.0 728.0 37.89 MB

go-fastdfs 是一个简单的分布式文件系统(私有云存储),具有无中心、高性能,高可靠,免维护等优点,支持断点续传,分块上传,小文件合并,自动同步,自动修复。Go-fastdfs is a simple distributed file system (private cloud storage), with no center, high performance, high reliability, maintenance free and other advantages, support breakpoint continuation, block upload, small file merge, automatic synchronization, automatic repair.(similar fastdfs).

Home Page: https://gitee.com/sjqzhang/go-fastdfs

License: The Unlicense

Go 56.76% Python 0.36% Dockerfile 0.98% HTML 17.02% Shell 2.22% CSS 7.12% JavaScript 14.62% Makefile 0.91%
storage-servers distributed-file-storage distributed-file-system godfs file-system go-fastdfs fastdfs breakpoint-resume small-file-merge tus

go-fastdfs's Introduction

愿景:为用户提供最简单、可靠、高效的分布式文件系统。

logo

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

大家担心的是这么简单的文件系统,靠不靠谱,可不可以用于生产环境?答案是肯定的,正因为简单所以高效,因为简单所以稳定。如果你担心功能,那就跑单元测试,如果担心性能,那就跑压力测试,项目都自带了,跑一跑更放心^_^。

注意:使用前请认真阅读使用文档视频教程

  • 支持curl命令上传
  • 支持浏览器上传
  • 支持HTTP下载
  • 支持多机自动同步
  • 支持断点下载
  • 支持配置自动生成
  • 支持小文件自动合并(减少inode占用)
  • 支持秒传
  • 支持跨域访问
  • 支持一键迁移(搬迁)
  • 支持异地备份(特别是小文件1M以下)
  • 支持并行体验
  • 支持断点续传(tus)
  • 支持docker部署
  • 支持自监控告警
  • 支持图片缩放
  • 支持google认证码
  • 支持自定义认证
  • 支持集群文件信息查看
  • 使用通用HTTP协议
  • 无需专用客户端(支持wget,curl等工具)
  • 类fastdfs
  • 高性能 (使用leveldb作为kv库)
  • 高可靠(设计极其简单,使用成熟组件)
  • 无中心设计(所有节点都可以同时读写)

优点

  • 无依赖(单一文件)
  • 自动同步
  • 失败自动修复
  • 按天分目录方便维护
  • 支持不同的场景
  • 文件自动去重
  • 支持目录自定义
  • 支持保留原文件名
  • 支持自动生成唯一文件名
  • 支持浏览器上传
  • 支持查看集群文件信息
  • 支持集群监控邮件告警
  • 支持小文件自动合并(减少inode占用)
  • 支持秒传
  • 支持图片缩放
  • 支持google认证码
  • 支持自定义认证
  • 支持跨域访问
  • 极低资源开销
  • 支持断点续传(tus)
  • 支持docker部署
  • 支持一键迁移(从其他系统文件系统迁移过来)
  • 支持异地备份(特别是小文件)
  • 支持并行体验(与现有的文件系统并行体验,确认OK再一键迁移)
  • 支持token下载 token=md5(file_md5+timestamp)
  • 运维简单,只有一个角色(不像fastdfs有三个角色Tracker Server,Storage Server,Client),配置自动生成
  • 每个节点对等(简化运维)
  • 所有节点都可以同时读写

极速体验,只需一分钟

启动服务器(已编译,下载

./fileserver #注意:线上使用请使用项目的control文件进行管理,直接运行,关闭终端会退出。

命令上传

curl -F file=@http-index-fs http://10.1.xx.60:8080/group1/upload

WEB上传(浏览器打开)

http://yourserver ip:8080 注意:不要使用127.0.0.1上传

如果你觉得本项目不错,请点击项目顶部的 star 按钮关注本项目

QQ交流群:964274270(go-fastdfs技术交流群)已满

QQ交流群:709218487(go-fastdfs技术交流群)已满

QQ交流群:749893275(go-fastdfs技术交流群)

QQ交流群:579196810(go-fastdfs技术交流群)

同时要说明的是,该群是一个学习交流群,如果是程序相关问题,请直接提交issues,不接受邮件求助、微信求助和QQ私信求助

go-fastdfs's People

Contributors

ah0210 avatar andglf avatar busyfree avatar fulltimelink avatar gongycn avatar jrohy avatar junmoka avatar liu-junlin avatar phanirithvij avatar satbirdd avatar sjqzhang avatar testwill avatar tonypy avatar ukid avatar zhangwenlong8911 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

go-fastdfs's Issues

windows server2008R2,以相对路径启动成功后访问时404错误

操作系统:windows server2008R2 Standard ,Service Pack1。
fastdfs版本:V1.2.7
问题描述:
fileserver.exe存储路径为D:\go-fastdfs\fileserver.exe,打开命令行,切换到D:\go-fastdfs路径下,然后fileserver.exe启动。启动成功后访问http://localhost:8080,结果返回:404 page not found

fileserver.exe存储路径不变,不管当前路径是什么,直接复制fileserver.exe全路径,例如:D:\go-fastdfs\fileserver.exe,然后回车启动。启动成功后访问http://localhost:8080,访问成功。

结论:
windows server2008R2 Standard ,Service Pack1环境下,fileserver.exe绝对路径启动访问成功,但相对路径启动则404。
但windows10 professional版,无论绝对路径还是相对路径,都是OK的。

目前不支持跨域?

谢谢提供这个工具
我在用javascript上传的时候,浏览器发送OPTIONS请求的时候,因为没有反馈跨域相关的Response Headers,被拒绝了,这个能支持吗?

文件服务器是怎样扩容的?

文件服务器的扩容是怎样实现的呢?比如现在已经配置了三个peer节点,这三个节点对等,会自动同步文件,实现了文件服务器的高可用。但发现有一天文件服务器磁盘快满了,我应该怎样扩容呢?
扩容方案:
1)增加服务器,新增加的服务器跟现有peer节点之间数据不再同步,而是跟现有peer节点间形成2个分片式集群。也就是可以形成多个分片,每个分片数据都不相同,每个分片都可以有多个对等节点,形成高可用。这种实现方式有点类似于solr。
2)在现有节点上挂载新空间。利用存量对等节点,给每个节点都分配新的存储空间。这种方式有点类似于TFS。

无法跨域上传,不好意思再打开这个问题

还是无法跨越上传,下载的是最新版本了。v1.2.6 错误信息:X-Requested-With is not allowed by Access-Control-Allow-Headers in preflight response. 应该是ajax请求响应的json无法跨域。
看了你源码只设置了allowedOrigins,allowedHeaders也应该设置才对吧?

//设置允许跨域的路径
registry.addMapping("/**")
//设置允许跨域请求的域名
.allowedOrigins("")
//设置请求头跨域类型
//.allowedHeaders("client", "accessToken", "Response-Wrapper")
//是否允许证书 不再默认开启
.allowCredentials(true)
//设置允许的方法
.allowedMethods("
")
//跨域允许时间
.maxAge(18000);

以上是java代码设置跨域访问的示例

有时候会产生没有文件实体的空文件夹

往由2台服务器构成的集群的其中一台上传文件,上传完毕后由于MD5值相同(但文件内容不同),没有实际上传文件只是直接返回了已经上传完毕的相同MD5的文件路径。但这时产生了一个空文件夹,里面没有文件实体。上传过程中遇到过2次这种情况。过一段时间空文件夹被自动清除。

File write locking

Is there a way to ensure a file is written to by only one client? (Merging not desirable)

同一个文件第二次上传问题

同一个文件第二次上传指定另外的目录,实际是没有上传,直接返回第一次上传文件的信息
1.但是另外的目录是创建了,既然不上传到这个目录为什么要创建目录?
2.判断为重复文件直接返回第一次上传文件的信息,这里设计的有点简单粗暴。

java client InputStream的问题

在使用java版的客户端上传文件时,如果是文件流的话,怎么上传?
或者是Base64转码后的图片怎么上传?

google认证开启后不传验证码依旧可以上传文件

开启验证后,如果在上传地址中不加入场景参数如图:
image
依旧可以上传成功。并且还是保存在defalut的场景下,只有添加了场景名,如图:
image

才会提示无效的code。
有没有什么办法,让不传场景名时也能走验证方法呢。
文件配置信息如下:
image

定时同步的问题

看您文档的描述,多服务器之间的文件同步不是实时的,而是每小时同步一次。这会造成一个问题就是当我通过nginx负载均衡访问一个文件的时候,正好这个文件所在的服务器宕机了,但这个文件还没有来得及同步到别的机器上,那么这个文件就无法访问到,也无法通过访问文件的方式实现自动同步,因为源文件服务器挂了。这样可用性就会降低。
各文件服务器间能否通过异步方式实现数据同步呢?当然这样肯定性能会有所损失。

有问题如何快速解决?

大家有问题时,解决办法:
一、先阅读一下QA
二、看一下已关闭的issue 有没有相关的回答 如果没有就加QQ群,在群里问,看看有没有人遇到相关问题。

多机自动同步失败

"peers": ["http://127.0.0.1:8080","http://127.0.0.1:8081","http://127.0.0.1:8082"],
我是这样设置的,不知道是不是有问题? 请指正,谢谢

双机文件没有自动同步

双机配置文件相同:"peers": ["http://192.168.1.199:8080","172.16.70.123:7080"], "group": "group1",
一台centos7.4,172.16.70.123:7080。一台win10,http://192.168.1.199:8080。先单独启动172.16.70.123:7080(此时peers节点没有配置http://192.168.1.199:8080),上传2个文件。查看状态结果如下:[{"date":"20190117","totalSize":8944,"fileCount":2},{"date":"all","totalSize":8944,"fileCount":2}]。
把win10节点配置好并启动fileserver,把centos节点纳入集群,并重新启动2台server。发现win10上并没有自动把centos上已上传的2个文件同步过来。状态:[{"date":"all","totalSize":0,"fileCount":0}]

如何自定义文件存放路径

目前文件存放在go-fastDFS的安装目录下。可不可以放在自定义的路径下。设置了GO_FASTDFS_DIR环境变量后没有任何反应,环境变量配置如下:
image

权限管理问题

您好,我在使用中感觉软件很不错,但是权限控制这个让我有点迷糊,白名单127.0.0.1,按理说除开集群本身的ip和这个127.0.0.1可以管理外其他的机器不可以管理啊,但是我用另外的机器可以上传可以删除,请问这个问题是必须要配合防火墙或nginx等三方软件,还是我设置有误?应该是软件没做这个限制吧,我在其他ip查看stat提示没权限.

断点上传返回地址错误

在使用TUS断点上传时返回地址没有端口

位置TusClient.createUpload
String urlStr = connection.getHeaderField("Location");

docker-compose.yml

version: "3.7"

services:
  fastdfs0:
    container_name: fastdfs0
    image: sjqzhang/go-fastdfs
    volumes:
      - ./data0:/data
    environment:
      GO_FASTDFS_DIR: /data
    networks:
      fastdfs:
        ipv4_address: 172.30.0.2

  fastdfs1:
    container_name: fastdfs1
    image: sjqzhang/go-fastdfs
    volumes:
      - ./data1:/data
    environment:
      GO_FASTDFS_DIR: /data
    networks:
      fastdfs:
        ipv4_address: 172.30.0.3

  fastdfs2:
    container_name: fastdfs2
    image: sjqzhang/go-fastdfs
    volumes:
      - ./data2:/data
    environment:
      GO_FASTDFS_DIR: /data
    networks:
      fastdfs:
        ipv4_address: 172.30.0.4

  fastdfs-nginx:
    container_name: fastdfs-nginx
    image: nginx
    volumes:
     - ./nginx:/etc/nginx/conf.d
    depends_on:
     - fastdfs0
     - fastdfs1
     - fastdfs2
    networks:
      fastdfs:
        ipv4_address: 172.30.0.250
    ports:
     - "8080:80"

networks:
  fastdfs:
     driver: bridge
     ipam:
       driver: default
       config:
         - subnet: 172.30.0.0/16

nginx default.conf

upstream group1{
  server 172.30.0.2:8080;
  server 172.30.0.3:8080;
  server 172.30.0.4:8080;
  ip_hash;
}

log_format  upstream  '$remote_addr - $remote_user [$time_local] "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for" '
            '$upstream_addr $request_time $upstream_response_time ';

client_max_body_size 100M;

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/access.log  upstream;

    location /{
      proxy_set_header    Host $host;
      proxy_set_header    X-Real-IP $remote_addr;
      proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

      proxy_pass http://group1;
    }

    location /group1{
      proxy_set_header    Host $host;
      proxy_set_header    X-Real-IP $remote_addr;
      proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

      proxy_pass http://group1;
    }

    #location / {
    #    root   /usr/share/nginx/html;
    #    index  index.html index.htm;
    #}

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

几个问题?

1、文件上传如何直接通过浏览器打开访问?
如上传图片文件成功后,响应地址http://localhost:8080/group1/image/logo_icon.png,直接通过google和360浏览器打开均弹出下载框了,是否需要做什么配置?

2、签权上传?
假设上传接口直接对外开放,是否支持类似nginx的push签权模式?要如何实现公网上传的签权?

3、断点续传?
能够提供java版断点续传的示例或实现机制?目前看到官网是go版的示例

同步gitee

请同步更新gitee,国内github慢得。。。

如何支持批量文件迁移

现在有50万个文件,现在一次性上传到某个目录下,怎么把这些文件重建到文件服务器的数据库,并同步到集群?急需,多谢!

go vendor 缺少依赖

缺少以下三个依赖
"github.com/deckarep/golang-set"
"github.com/json-iterator/go"
"github.com/syndtr/goleveldb/leveldb"

文件去重可能出现问题?

测试时候发现不是必然发生,但是概率不低。
就是多次上传相同文件,按照去重,应该返回的都是第一次上传的文件信息,但是有时候却返回的是无法打开文件失败,路径指向的是最新的地址。
open files/video/20190226/18/08/8/test.mp4: no such file or directory

使用的是sha1去重,搭建两台服务器,使用nginx做负载均衡。

首次启动无权限报错

在CentOS7中,首次启动报错如下

panic: open file path: conf/cfg.json error: open conf/cfg.json: permission denied


goroutine 1 [running]:
main.ParseConfig(0x99d8f6, 0xd)
	/root/fileserver.go:422 +0x76b
main.init.0()
	/root/fileserver.go:2801 +0x222
main.init()
	<autogenerated>:1 +0x12b

启动用户为普通账户,非root账户

解决方法也简单,首次启动时,生成的目录给属主有x权限即可,即

chmod u+x conf
chmod u+x files

上传文件不存在,也是由于目录权限导致
./files/default无权限导致

建议代码中所有os.mkdir权限全部改为0775

動態加載

更改cfg.conf後
執行reload 會顯示下列訊息
Can only be called by the cluster ip

上传文件重名覆盖问题

上传文件时,同一分钟上传文件如果文件名重复了,文件就直接覆盖。有没有好的方法解决。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.