一、go-fastdfs 分布式文件系统搭建

分布式文件系统go-fastdfs (类fastdfs,go语言版本的FastDFS)在运维管理等方面优于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
中文Wiki地址:https://github.com/sjqzhang/go-fastdfs/wiki

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

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

注意:使用前请认真阅读完本文,特别是wiki

  • 支持curl命令上传

  • 支持浏览器上传

  • 支持HTTP下载

  • 支持多机自动同步

  • 支持断点下载

  • 支持配置自动生成

  • 支持小文件自动合并(减少inode占用)

  • 支持秒传

  • 支持跨域访问

  • 支持一键迁移

  • 支持并行体验

  • 支持断点续传(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),配置自动生成

  • 每个节点对等(简化运维)

  • 所有节点都可以同时读写

2、部署

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

    image.png

    2.2. 修改权限

    建个目录go-fastdfs存放fileserver运行文件

 # chmod +x fileserver

    2.3. 生成配置文件

    // 运行一下,然后杀死程序即可生成各种需要的配置文件,还是很人性化的 
  # ./fileserver

    image.png


3、配置

    // 正常运行之后的目录结构

    image.png

需要修改 conf 目录下的 cfg.json 文件;

根据自己需要修改,配置如下;

# cat conf/cfg.json 
{
        "绑定端号": "端口",
        "addr": ":8080",
        "PeerID": "集群内唯一,请使用0-9的单字符,默认自动生成",
        "peer_id": "7",
        "本主机地址": "本机http地址,默认自动生成(注意端口必须与addr中的端口一致),必段为内网,自动生成不为内网请自行修改,下同",
        "host": "http://192.168.2.6:8080",
        "集群": "集群列表,注意为了高可用,IP必须不能是同一个,同一不会自动备份,且不能为127.0.0.1,且必须为内网IP,默认自动生成",
        "peers": ["http://192.168.2.6:8080"],
        "组号": "用于区别不同的集群(上传或下载)与support_group_manage配合使用,带在下载路径中",
        "group": "group1",
        "是否支持按组(集群)管理,主要用途是Nginx支持多集群": "默认不支持,不支持时路径为http://10.1.5.4:8080/action,支持时为http://10.1.5.4:8080/group(配置中的group参数)/action,action为动作名,如status,delete,sync等",
        "support_group_manage": false,
        "是否合并小文件": "默认不合并,合并可以解决inode不够用的情况(当前对于小于1M文件)进行合并",
        "enable_merge_small_file": false,
    "允许后缀名": "允许可以上传的文件后缀名,如jpg,jpeg,png等。留空允许所有。",
        "extensions": [],
        "重试同步失败文件的时间": "单位秒",
        "refresh_interval": 1800,
        "是否自动重命名": "默认不自动重命名,使用原文件名",
        "rename_file": false,
        "是否支持web上传,方便调试": "默认支持web上传",
        "enable_web_upload": false,
        "是否支持非日期路径": "默认支持非日期路径,也即支持自定义路径,需要上传文件时指定path",
        "enable_custom_path": true,
        "下载域名": "用于外网下载文件的域名,不包含http://",
        "download_domain": "",
        "场景列表": "当设定后,用户指的场景必项在列表中,默认不做限制(注意:如果想开启场景认功能,格式如下:'场景名:googleauth_secret' 如 default:N7IET373HB2C5M6D ",
        "scenes": [],
        "默认场景": "默认default",
        "default_scene": "default",
        "是否显示目录": "默认显示,方便调试用,上线时请关闭",
        "show_dir": false,
        "邮件配置": "",
        "mail": {
                "user": "abc@163.com",
                "password": "abc",
                "host": "smtp.163.com:25"
        },
        "告警接收邮件列表": "接收人数组",
        "alarm_receivers": [],
        "告警接收URL": "方法post,参数:subject,message",
        "alarm_url": "",
        "下载是否需带token": "真假",
        "download_use_token": false,
        "下载token过期时间": "单位秒",
        "download_token_expire": 600,
        "是否自动修复": "在超过1亿文件时出现性能问题,取消此选项,请手动按天同步,请查看FAQ",
        "auto_repair": true,
        "文件去重算法md5可能存在冲突,默认md5": "sha1|md5",
        "file_sum_arithmetic": "md5",
        "管理ip列表": "用于管理集的ip白名单,",
        "admin_ips": ["127.0.0.1","192.168.2.6"],
        "是否启用迁移": "默认不启用",
        "enable_migrate": false,
        "文件是否去重": "默认去重",
        "enable_distinct_file": true,
        "是否开启跨站访问": "默认开启",
        "enable_cross_origin": true,
        "是否开启Google认证,实现安全的上传、下载": "默认不开启",
        "enable_google_auth": false,
        "认证url": "当url不为空时生效,注意:普通上传中使用http参数 auth_token 作为认证参数, 在断点续传中通过HTTP头Upload-Metadata中的auth_token作为认证参数,认证流程参考认证架构图",
        "auth_url": "",
        "下载是否认证": "默认不认证(注意此选项是在auth_url不为空的情况下生效)",
        "enable_download_auth": false,
        "默认是否下载": "默认下载",
        "default_download": false,
        "本机是否只读": "默认可读可写",
        "read_only": false,
        "是否开启断点续传": "默认开启",
        "enable_tus": true,
        "同步单一文件超时时间(单位秒)": "默认为0,程序自动计算,在特殊情况下,自已设定",
        "sync_timeout": 0
}


4、启动

// 此处就直接运行了,当然也可以自己编写管理脚本
    root# ./fileserver &
    // 检查运行状态
    root# ps -ef | grep fileserver | grep -v grep 
    root      13826  13714  7 16:06 pts/1    00:00:00 ./fileserver


5、使用

    此时就可以正常使用了,打开浏览器,测试下 web 上传功能;

    端口号默认为:8080,我的地址就是:192.168.2.6:8080

    image.png

   

   当然不止如此,支持命令、web、代码上传,还有断点续传功能;

    在部署的服务器上,访问:192.168.2.6:8080/stat
    就可以查看此刻文件状态的 JSON 结构体,如下:

    image.png

    其他 nginx 部署、压力测试等功能,移步官方文档吧


6、动态加载配置

    步骤:
    1)修改 conf/cfg.json 文件

    2)访问 http://192.168.x.x:8080/reload?action=reload

    3) 注意:每个节点都需要进行同样的操作