【golang分布式文件系统】go-fastdfs分布式文件系统搭建

【go-fastdfs】go-fastdfs 分布式文件系统搭建

一、FastDFS简介

go-fastdfs是一个基于http协议的开源的分布式文件系统,它基于大道至简的设计理念,一切从简设计,使得它的运维及扩展变得更加简单,它具有高性能、高可靠、无中心、免维护等优点。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。 
项目地址:https://github.com/happyfish100/fastdfs

二、go-fastdfs (go语言版本的FastDFS)

项目地址:https://github.com/sjqzhang/go-fastdfs 
编译版本下载地址:https://github.com/sjqzhang/go-fastdfs/releases

1.文档介绍

中文Wiki地址:https://github.com/sjqzhang/go-fastdfs/blob/master/README-en.md

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

支持curl命令上传 
支持浏览器上传 
支持HTTP下载 
支持多机自动同步 
支持断点下载 
支持小文件自动合并(减少inode占用 
支持配置自动生成 
支持自监控告警 
支持集群文件信息查看 
使用通用HTTP协议 
无需专用客户端(支持wget,curl等工具) 
类fastdfs 
高性能 (使用leveldb作为kv库) 
高可靠(设计极其简单,使用成熟组件) 
无中心设计(所有节点都可以同时读写)

优点

无依赖(单一文件) 
自动同步 
失败自动修复 
按天分目录方便维护 
支持不同的场景 
文件自动去重 
支持目录自定义 
支持保留原文件名 
支持自动生成唯一文件名 
支持浏览器上传 
支持查看集群文件信息 
支持集群监控邮件告警 
支持token下载 token=md5(file_md5+timestamp) 
运维简单,只有一个角色(不像fastdfs有三个角色Tracker Server,Storage Server,Client),配置自动生成 
每个节点对等(简化运维) 
所有节点都可以同时读写

部署图

【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第1张图片

 

2.安装

1.首先下载官网的编译版本

【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第2张图片

 

2.运行可执行文件fileserver,然后 就会生成各种需要的配置文件.

3.配置

运行后生成的目录结构

 【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第3张图片
conf文件夹:里面cfg.json是主要的配置文件,里面配置端口号、集群、外网访问url等。

【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第4张图片
需要注意的是配置文件中peers参数会自动生成一个本地主机ip,但还是需要配置增加一个内网ip.


不然使用api时会报以下信息:

Can only be called by the cluster ip or 127.0.0.1 or admin_ips(cfg.json),current ip:192.168.88.1

 

files文件夹:是图片上传以后保存的路径,默认是按日期划分,也可以指定路径。 
log文件夹:是上传信息和运行的日志信息。 
static文件夹:是放置一些前端静态页面xml文件。 
data文件夹:里面是一些上传的后的图片信息记录保存在ldb格式文件,如文件的md5值,上传后的路径,时间戳,Szie大小等.

三、启动服务器

配置完cfg.json后直接运行可执行文件fileserver,运行成功后会显示如下内容:

Listen on:8080

运行成功后可按以下三种上传方式进行测试:

命令上传

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

WEB上传(浏览器打开)

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

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

golang版本

 

package main

 

import (

"fmt"

"github.com/astaxie/beego/httplib"

)

 

func main() {

var obj interface{}

req:=httplib.Post("http://10.1.5.9:8080/upload")

req.PostFile("file","filename")//注意不是全路径

req.Param("output","json")

req.Param("scene","")

req.Param("path","")

req.ToJSON(&obj)

fmt.Print(obj)

}

上传成功后会返回以下信息:

 

{

"url":"http://192.168.88.132:8080/group1/test/企业微信截图_15616176241551.png",

"md5":"baa10e8600a47f2aa0f8c2c926cfe409",

"path":"/group1/test/企业微信截图_15616176241551.png",

"domain":"http://192.168.88.132:8080",

"scene":"default",

"size":79491,

"mtime":1561619383,

"scenes":"default",

"retmsg":"",

"retcode":0,

"src":"/group1/test/企业微信截图_15616176241551.png"

}

四、API说明

 

一、统一使用POST请求

二、返回格式统一为json

  格式如下

{

"status":"ok",

"message":"",

"data":{}

}

二、url中的group只有在support_group_manage设置为true才有。

例如:

http://10.1.5.9:8080/group/reload

默认:

http://10.1.5.9:8080/reload

说明:url中的group为cfg.json中的group参数值。

1.配置管理API

http://192.168.88.132:8080/reload?action=set&cfg=addr

参数:

参数名 类型 描述
action string set修改参数,get获取参数
cfg string 配置文件参数参数名称与action=set配合完成参数设置

返回参数如下:

 

{

"data": {

"addr": ":8080",

"admin_ips": [

"127.0.0.1"

],

"alarm_receivers": [],

"alarm_url": "",

"auth_url": "",

"auto_repair": true,

"default_download": true,

"default_scene": "default",

"download_domain": "",

"download_token_expire": 600,

"download_use_token": false,

"enable_cross_origin": true,

"enable_custom_path": true,

"enable_distinct_file": true,

"enable_download_auth": false,

"enable_google_auth": false,

"enable_merge_small_file": false,

"enable_migrate": false,

"enable_tus": true,

"enable_web_upload": true,

"extensions": [],

"file_sum_arithmetic": "md5",

"group": "group1",

"host": "http://192.168.88.132:8080",

"mail": {

"host": "smtp.163.com:25",

"password": "abc",

"user": "[email protected]"

},

"peer_id": "1",

"peers": [

"http://192.168.88.1"

],

"queue_size": 10000,

"read_only": false,

"refresh_interval": 1800,

"rename_file": false,

"scenes": [],

"show_dir": true,

"support_group_manage": false

},

"message": "",

"status": "ok"

}

2.文件统计信息API

http://192.168.88.132:8080/stat 
返回参数如下:

 

{

"data": [

{

"date": "20190625",

"fileCount": 3,

"totalSize": 94210

},

{

"date": "20190627",

"fileCount": 0,

"totalSize": 0

},

{

"date": "all",

"fileCount": 3,

"totalSize": 94210

}

],

"message": "",

"status": "ok"

}

 

3.系统状态信息API

http://192.168.88.132:8080/status 
返回参数如下:

 

{

"data": {

"Fs.AutoRepair": true,

"Fs.FileStats": [

{

"date": "20190625",

"fileCount": 3,

"totalSize": 94210

},

{

"date": "20190627",

"fileCount": 0,

"totalSize": 0

},

{

"date": "all",

"fileCount": 3,

"totalSize": 94210

}

],

"Fs.Local": "http://192.168.88.132:8080",

"Fs.Peers": [

"http://192.168.88.1"

],

"Fs.QueueFileLog": 0,

"Fs.QueueFromPeers": 0,

"Fs.QueueToPeers": 0,

"Fs.RefreshInterval": 1800,

"Fs.ShowDir": true,

"Sys.Alloc": 47888528,

"Sys.Frees": 7989,

"Sys.GCCPUFraction": 0.000016509381835168312,

"Sys.GCSys": 2977792,

"Sys.HeapAlloc": 47888528,

"Sys.HeapObjects": 7580,

"Sys.NumCpu": 4,

"Sys.NumGC": 15,

"Sys.NumGoroutine": 437,

"Sys.TotalAlloc": 90639280

},

"message": "",

"status": "ok"

}

4.文件上传API

http://192.168.88.132:8080/upload 
参数:

参数名 类型 描述
file string 上传的文件
scene string 默认default
path string 自定义存储路径
output string 输出格式默认json
auth_token string 非必须,配置文件设置是否必须

返回参数如下:

 

{

"url":"http://192.168.88.132:8080/group1/test/企业微信截图_15616176241551.png",

"md5":"baa10e8600a47f2aa0f8c2c926cfe409",

"path":"/group1/test/企业微信截图_15616176241551.png",

"domain":"http://192.168.88.132:8080",

"scene":"default",

"size":79491,

"mtime":1561619383,

"scenes":"default",

"retmsg":"",

"retcode":0,

"src":"/group1/test/企业微信截图_15616176241551.png"

}

5.文件删除

http://192.168.88.132:8080/delete?md5= 
参数:

参数名 类型 描述
md5 string 图片的MD5值与Path二选一
path string 文件上传后返回的路径,与MD5值二选一

说明:md5或path都是上传文件时返回的信息,要以json方式返回才能看到(参阅浏览器上传) 
返回参数:

 

{

"data": null,

"message": "remove success",

"status": "ok"

}

 

6.获取文件信息

http://192.168.88.132:8080/get_file_info?md5= 
参数:

参数名 类型 描述
md5 string 图片的MD5值与Path二选一
path string 文件上传后返回的路径,与MD5值二选一

说明:md5或path都是上传文件时返回的信息,要以json方式返回才能看到(参阅浏览器上传) 
返回参数:

 

{

"data": {

"md5": "8fe6dcd07da307ac3fd128aedccd2e45",

"name": "企业微信截图_15613392198494.png",

"offset": -1,

"path": "files/test",

"peers": [

"http://192.168.88.132:8080"

],

"rename": "",

"scene": "default",

"size": 18866,

"timeStamp": 1561623822

},

"message": "",

"status": "ok"

}

7.搜索文件信息

http://192.168.88.132:8080/search?md5= 
参数:

参数名 类型 描述
md5 string 图片的MD5值与Path二选一
path string 文件上传后返回的路径,与MD5值二选一

说明:md5或path都是上传文件时返回的信息,要以json方式返回才能看到(参阅浏览器上传) 
返回参数:

 

{

"data": [

{

"md5": "d41d8cd98f00b204e9800998ecf8427e",

"name": "企业微信截图_15613394634070.png",

"offset": -1,

"path": "files/test",

"peers": [

"http://192.168.88.132:8080"

],

"rename": "",

"scene": "default",

"size": 0,

"timeStamp": 1561624299

},

{

"md5": "794a1079f1cbfbacc4c4404d59ce1917",

"name": "企业微信截图_15613392903775.png",

"offset": -1,

"path": "files/test",

"peers": [

"http://192.168.88.132:8080"

],

"rename": "",

"scene": "default",

"size": 35224,

"timeStamp": 1561457713

},

{

"md5": "8fe6dcd07da307ac3fd128aedccd2e45",

"name": "企业微信截图_15613392198494.png",

"offset": -1,

"path": "files/default/20190627/18/00/1",

"peers": [

"http://192.168.88.132:8080"

],

"rename": "",

"scene": "default",

"size": 18866,

"timeStamp": 1561629630

}

],

"message": "",

"status": "ok"

}

8.获取文件列表

http://192.168.88.132:8080/list_dir?dir=test 
参数:

参数名 类型 描述
dir string 文件夹名字

返回参数:

 

{

"data": [

{

"is_dir": false,

"md5": "6ce2b43b9ffd3237a30aeac2a88e355f",

"mtime": 1561457713,

"name": "企业微信截图_15613392903775.png",

"path": "test",

"size": 35224

},

{

"is_dir": false,

"md5": "37ea6cda16362a3c4af86ba8614dde0c",

"mtime": 1561624299,

"name": "企业微信截图_15613394634070.png",

"path": "test",

"size": 0

}

],

"message": "",

"status": "ok"

}

9.同步文件

http://192.168.88.132:8080/sync?date=20160502&force=1 
参数:

参数名 类型 描述
date string 日期,格式为20160502
force int 1.表示是否强制同步当天所有(性能差),0.表示只同步失败的文件

返回参数:

 

{

"data": null,

"message": "require paramete date \u0026force , ?date=20181230",

"status": "fail"

}

五.管理后台系统:go-fastdfs-web

项目地址:https://github.com/perfree/go-fastdfs-web 
各打包版本下载地址:https://github.com/perfree/go-fastdfs-web/releases

0.介绍

go-fastdfs在官方文档中有介绍为了方便对文件的监控是支持Web端后台管理系统.

1.安装

到官网地址https://github.com/perfree/go-fastdfs-web/releases下载所需要的版本

【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第5张图片
首先我们来查看目录结构:

 【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第6张图片
config文件夹:主要的一些配置文件信息,如端口号等。 
log文件夹:日志信息文件。 
db文件夹:里面是存储一些fastDFS的设置信息,如文件系统部署机器的ip,集群,登录用户名等信息。

启动

使用管理脚本启动,在使用脚本启动时遇到因为编码问题找不到Shell脚本解析器,使用以下方式解决编码问题,并使用脚本运行成功.

 

sed -i 's/\r$//' goFastDfsWeb.sh 编码设置

 

./goFastDfsWeb.sh start 脚本运行

Start go-fastdfs-web.jar success... 运行成功信息

2.登录

启动后我们可以直接登录管理后台系统 http://youserver_ip:8088,默认端口是8088,也可以在配置文件中设置,登录后会进入配置信息界面,如下。

 【golang分布式文件系统】go-fastdfs分布式文件系统搭建_第7张图片
按自己的go-fastDFS配置文件的信息,填写并设置用户名和密码登入。

 

登入以后可以再管理系统中可以批量上传、删除、对集群的管理等操作。

六、常见问题说明

1.如何上传文件夹?

DIR=log && ls DIR -F file=@$DIR/{} http://192.168.88.132:8080/upload 
上面命令的log为要上传的目录,如果代码上传就是简单的循环上传就OK。

2.如何缩放图片?

在下载url中加入width各height参数 
例如:http://192.168.88.132:8080/group1/test/15613392198494.png?download=0&width=100&height=100 
特明说明是:如果要等比例缩放,请将width或height设为0

3.如何在浏览器中直接显示图片?

在下载url中加入download=0参数 
例如:http://192.168.88.132:8080/group1/test/15613392198494.png?download=0

4.Docker如何部署?

步骤: 
方式一、 
一、构建镜像 
docker build . -t fastdfs 
二、运行容器(使用环境变量 GO_FASTDFS_DIR 指向存储目录。) 
docker run –name fastdfs -v /data/fastdfs_data:/data -e GO_FASTDFS_DIR=/data fastdfs 
方式二、 
一、拉取镜像 
docker pull sjqzhang/go-fastdfs 
二、运行容器 
docker run –name fastdfs -v /data/fastdfs_data:/data -e GO_FASTDFS_DIR=/data fastdfs

 

你可能感兴趣的:(【golang分布式文件系统】go-fastdfs分布式文件系统搭建)