分布式文件系统搭建
- 选项一: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其他配置详细介绍
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)
运行
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