【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),配置自动生成 
每个节点对等(简化运维) 
所有节点都可以同时读写

部署图

2.安装

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

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

3.配置

运行后生成的目录结构

 
conf文件夹:里面cfg.json是主要的配置文件,里面配置端口号、集群、外网访问url等。


需要注意的是配置文件中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

参数:

参数名类型描述
actionstringset修改参数,get获取参数
cfgstring配置文件参数参数名称与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": "abc@163.com"

},

"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 
参数:

参数名类型描述
filestring上传的文件
scenestring默认default
pathstring自定义存储路径
outputstring输出格式默认json
auth_tokenstring非必须,配置文件设置是否必须

返回参数如下:

 

{

"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= 
参数:

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

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

 

{

"data": null,

"message": "remove success",

"status": "ok"

}

6.获取文件信息

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

参数名类型描述
md5string图片的MD5值与Path二选一
pathstring文件上传后返回的路径,与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= 
参数:

参数名类型描述
md5string图片的MD5值与Path二选一
pathstring文件上传后返回的路径,与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 
参数:

参数名类型描述
dirstring文件夹名字

返回参数:

 

{

"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 
参数:

参数名类型描述
datestring日期,格式为20160502
forceint1.表示是否强制同步当天所有(性能差),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下载所需要的版本


首先我们来查看目录结构:

 
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,也可以在配置文件中设置,登录后会进入配置信息界面,如下。

 
按自己的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

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Go语言基于Redis实现的分布式限流是一种常见的解决方案,可以有效地控制系统的并发访问流量,防止系统被过多的请求压垮。 首先,分布式限流需要使用Redis的计数器功能。通过对每个请求进行计数,并设置一个时间窗口,可以统计在该窗口内的请求次数。当请求次数超过某个阈值时,可以拒绝该请求或者进行降级处理。 其次,为了保证分布式限流的准确性和高效性,需要使用Redis的原子操作,例如INCR、EXPIRE等。INCR命令可以原子地将计数器的值加1,并返回加1后的结果,而EXPIRE命令可以设置计数器的过期时间。通过这些原子操作,可以在多个节点之间共享计数状态,并且保证计数器的同步和高效性。 此外,为了保证系统的稳定性和可靠性,需要考虑设置适当的限流阈值和时间窗口大小。根据系统的负载情况和性能需求,可以调整这些参数,实现对系统流量的合理控制。 在实际应用中,可以使用Go语言的Redis客户端连接Redis服务器,并通过相关命令操作计数器。同时,还可以结合其他的组件和技术,如分布式锁、消息队列等,增强系统的稳定性和可扩展性。 总之,Go语言基于Redis实现的分布式限流是一种可行且有效的解决方案,可以帮助我们应对大流量的并发请求,保证系统的稳定运行。通过合理设定限流参数和灵活运用Redis的功能,我们可以实现流量控制、降级和保护系统免受恶意请求的攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LCS-312

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值