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

时间:2024-03-06 16:47:37

分布式文件系统搭建

  • 选项一:B站开源的 BFS 分布式文件系统很适合小文件的存取,不过部署起来要复杂很。
  • 选项二:C 原版 FastDFS,备选
  • 选项三:其他分布式文件系统(GFS、HDFS、Lustre、Ceph、GridFS、mogileFS、TFS等);
  • 选项四:无意中发现了 go 实现的 FastDFS

go-FastDFS 简介

项目地址:https://github.com/sjqzhang/go-fastdfs

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

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

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

文档:https://sjqzhang.github.io/go-fastdfs/install.html

下载go-fastdfs

wget https://github.com/sjqzhang/go-fastdfs/releases/download/v1.3.1/fileserver
sudo mv fileserver /opt/godfs/fileserver  
sudo chmod -R 777 /opt/godfs  # 更改go-fastdfs文件夹权限
/opt/godfs/fileserver &   # 运行go-fastdfs

注意:fileserver 会在当前目录下生成配置文件,所以,启动前先进入fileserver根目录

检测是否启动成功(下列文件会自动生成)

xxx@ubuntu:/opt/godfs$ ls
conf  data  files  fileserver  log  static

默认启动端口8080

xxx@ubuntu:/opt/godfs$ sudo netstat -nlp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      34164/./fileserver

命令行上传文件测试

xxx@ubuntu:~/Pictures$ curl -F file=@test.jpg -F path=test http://127.0.0.1:8080/upload
http://127.0.0.1:8080/group1/test/test.jpg

在go-fastdfs中查看该文件

xxx@ubuntu:/opt/godfs/files/test$ ls
test.jpg

Go-fastdfs程序崩溃后自启动

supervisor: 参考:https://www.cnblogs.com/zhumengke/articles/11399764.html

配置文件:

[group:godfs]
programs=godfs-7022

[program:godfs-7022]
command=/opt/godfs/fileserver
directory=/opt/godfs
user=www-data
autorestart=true
redirect_stderr=true
stdout_logfile=/home/xxx/logs/supervisor.log
loglevel=info

 

Nginx 集群搭建

修改go-fastdfs配置文件 

# sudo vim /opt/godfs/conf/cfg.json
"support_group_manage": false,   # 修改为true,支持按组集群管理

go-fastdfs其他配置详细介绍

View Code

Postman文件上传,单机测试

配置Nginx配置文件

sudo vim /etc/nginx/sites-enabled/gofds

upstream gofastdfs-group1 {
    server 127.0.0.1:8080;
    ip_hash;     #notice:very important(注意)
}
server {
    # the port your site will be served on
    listen     9999;
    # the domain name it will serve for
    server_name 0.0.0.0; # substitute your machine\'s IP address or FQDN
    charset     utf-8;
    
    sendfile        on;
    keepalive_timeout  65;
    rewrite_log on;
    client_max_body_size 0;
    proxy_redirect ~/(\w+)/big/upload/(.*) /$1/big/upload/$2;  #继点续传一定要设置(注意)
   
    if ( $request_uri ~ /godfs/group ){
        # 注意group会随组的前缀改变而改变
        rewrite ^/godfs/(.*)$ /$1 last;
    }

    location ~ /group(\d) { 
        #统一在url前增加godfs,以便统一出入口。
        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://gofastdfs-group$1;
    }
    location ~ /godfs/upload { 
        #这是一个横向扩展配置,前期可能只有一个集群group1,当group1满后,只需将上传指向group2,
        #也就是将rewrite , proxy_pass 中的group1改为group2即可。
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        rewrite ^/godfs/upload /group1/upload break;
        proxy_pass http://gofastdfs-group1;
    }
    location ~ /godfs/big/upload { 
        #以上上类似。
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        rewrite ^/godfs/upload /group1/big/upload break;
        proxy_pass http://gofastdfs-group1;
    }
}

Postman集群测试

用户自定义认证

如果你是海量文件,又需要有自己的一些验证逻辑,建议使用自定义认证。

 

修改go-fastdfs配置文件 

"auth_url": "", # 填入自己认证的URL路径即可,如:http://www.baidu.com

管理API接口

API接口详细文档:https://sjqzhang.github.io/go-fastdfs/api.html

重新加载配置文件

curl http://127.0.0.1:8080/group1/reload

 

文件删除,文件不能直接在go-fastdfs文件库(/opt/go-fastdfs/files)中删除,因为go-fastdfs还有一份元数据

http://127.0.0.1:8080/group1/delete
参数:
md5:文件的摘要(md5|sha1) 视配置定
path:文件路径
md5与path二选一
说明:md5或path都是上传文件时返回的信息,要以json方式返回才能看到(参阅浏览器上传)
http://127.0.0.1:8080/delete?md5=430a71f5c5e093a105452819cc48cc9c

数据美化:go-fastdfs-web 监控工具安装

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

1.安装

下载地址:https://github.com/perfree/go-fastdfs-web/releases/download/v1.3.4/go-fastdfs-web-1.3.4.tar.gz

到 官方下载页面 下载所需的版本(带jre或者不到jre)
go-fastdfs-web-download

运行

root# ./goFastDfsWeb.sh start

如果上述命令不好使,可以

java -jar go-fastdfs-web.jar

 

127.0.0.1:8088

问题汇总

已经使用fastdfs存储的文件可以迁移到go fastdfs下么?

答案是可以的,你担心的问题是路径改变,go fastdfs为你考虑了这一点

curl -F file=@data/00/00/_78HAFwyvN2AK6ChAAHg8gw80FQ213.jpg -F path=M00/00/00/ http://127.0.0.1:8080/upload

同理可以用一行命令迁移所有文件

cd fastdfs/data && find -type f |xargs -n 1 -I {} curl -F file=@data/{} -F path=M00/00/00/ http://127.0.0.1:8080/

适合海量存储吗?

答案:适合海量存储
特别说明:
需然用leveldb作为元数据存储,但不强依懒leveldb,
并且进行超过1亿以上的文件进行压测(可以用项目提供的脚本进行压测,有问题及时反馈到issue),
1亿文件元数据大小约5G,导出元数据文本大小22G

还需要安装nginx么?

可以不安装,也可以选择安装
go fastdfs 本身就是一个高性能的web文件服务器。

能动态加载配置么?

答案:是可以的,但要更新到最新版本
步骤:
1)修改 conf/cfg.json 文件
2)访问 http://10.1.xx.60:8080/reload
3) 注意:每个节点都需要进行同样的操作

内存占用很高是怎么回事?

正常情况下,内存应该低于2G,除非每天上传文件超过百万
内存异常,主要是集群的文件没有同步,同时开启了自动修复功能
处理办法,删除data目录下当天的errors.md5文件,关闭自动修复,重启服务
参阅系统状态说明

如何查看集群文件信息?

http://10.1.xx.60:8080/stat

如果出现文件统计出错怎么办?
请删除 data目录下的 stat.json文件 重启服务,请系统自动重新计算文件数。

或者调用
http://10.1.xx.60:8080/repair_stat

 

可靠性怎样,能用于生产环境么?

本项目已大规模用于生产环境,如担心不能满足
可以在使用前对其各项特性进行压力测试,有任何
问题可以直接提issue

能不能在一台机器部置多个服务端?

不能,在设计之初就已考虑到集群的高可用问题,为了保证集群的真正可用,必须为不同的ip,ip 不能用 127.0.0.1
错误 "peers": ["http://127.0.0.1:8080","http://127.0.0.1:8081","http://127.0.0.1:8082"]
正确 "peers": ["http://10.0.0.3:8080","http://10.0.0.4:8080","http://10.0.0.5:8080"]

 


文件不同步了怎么办?

正常情况下,集群会每小时自动同步修复文件。(性能较差,在海量情况下建议关闭自动修复)
那异常情况下怎么?
答案:手动同步(最好在低峰执行)
http://172.16.70.123:7080/sync?date=20190117&force=1 (说明:要在文件多的服务器上执行,相关于推送到别的服务器)
参数说明:date 表示同步那一天的数据 force 1.表示是否强制同步当天所有(性能差),0.表示只同步失败的文件

不同步的情况:
1) 原来运行N台,现在突然加入一台变成N+1台
2)原来运行N台,某一台机器出现问题,变成N-1台

如果出现多天数据不一致怎么办?能一次同步所有吗?
答案是可以:(最好在低峰执行)
http://172.16.70.123:7080/repair?force=1

 

文件不同步会影响访问吗?

答案:不会影响,会在访问不到时,自动修复不同步的文件。

如何查看系统状态及说明?

http://172.16.70.123:7080/status
注意:(Fs.Peers是不带本机的,如果带有可能出问题)
本机为 Fs.Local
sts["Fs.ErrorSetSize"] = this.errorset.Cardinality()  这个会导致内存增加

 

如何压测?

先用gen_file.py产生大量文件(注意如果要生成大文件,自已在内容中乘上一个大的数即可)
例如:
```python
import os
j=0
for i in range(0,1000000):
    if i%1000==0:
        j=i
        os.system(\'mkdir %s\'%(i))
    with open(\'%s/%s.txt\'%(j,i),\'w+\') as f:
        f.write(str(i)*1024)

接着用benchmark.py进行压测

建议在前期规划时,尽量采购大容量的机器作为存储服务器,如果要两个复本就用两台组成一个集群,如果要三个复本
就三台组成一个集群。(注意每台服务器最好配置保持一样)

如果提高可用性,只要在现在的集群peers中加入新的机器,再对集群进行修复即可。
修复办法 http://172.16.70.123:7080/repair?force=1  (建议低峰变更)

如何扩容?(特别注意:为了有更好的扩展性建集群时最好请使用逻辑卷)
为简单可靠起见,直接搭建一个新集群即可(搭建就是启动./fileserver进程,设置一下peers的IP地址,三五分钟的事)
issue中chengyuansen同学向我提议使用增加扩容特性,我觉得对代码逻辑及运维都增加复杂度,暂时没有加入这特性。

 

相关文章

go-fastdfs 分布式文件系统搭建:https://blog.csdn.net/tmt123421/article/details/90522244

go-fastdfs更人性化的高性能图片服务器:https://blog.csdn.net/u014131617/article/details/86689652