项目需要存储海量小文件,传统方法是上传到某个磁盘中的文件夹,但是对于大量的小文件,这种方式不可取。所以打算采用分布式文件系统。
分布式文件系统:顾名思义,他是可以集群的。我选用fastdfs服务器存储文件
使用docker搭建FastDFS文件服务器:
- 虚拟机安装docker:
yum install docker-engine
- 配置好阿里的yum源,之前我配置的是清华的yum,试了好多fastdfs的源都下载很慢。
- 执行
docker pull morunchang/fastdfs
拉取文件服务器的镜像 - 查看是否拉取成功:
docker images
- 运行tracker :
docker run -d --name tracker --net=host morunchang/fastdfs sh tracker.sh
- 运行storage :
docker run -d --name storage --net=host -e TRACKER_IP=<linux服务器的ip地址(外网可访问)>:22122 -e GROUP_NAME=<自定义组名> morunchang/fastdfs sh storage.sh
- 查看是否成功启动:
docker ps
可以看到成功启动了
8. 修改nginx的配置,不拦截上传内容:
fastdfs内置nginx
- 进入容器内部:
docker exec -it storage /bin/bash
- 修改nginx配置文件:
vi /data/nginx/conf/nginx.conf
- 添加修改内容:
//添加修改内容
location /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
proxy_pass http://fdfs_group1;
expires 30d;
}
- 重启storage服务:
docker restart storage
我对tracker和storage的理解是:
tracker是fastdfs客户端用来和storage通信的媒介
客户端大部分的操作过程是先通过查询tracker,从tracker返回具体的storageIp,然后连接返回的storageIp,执行具体的操作。
在tracker.conf中有关upload storage选择的相关配置
1)选择upload的group
0:表示所有的group以轮询方式选择
1:指定group,该group的名称由store_group配置指定
2:负载均衡,表示选择空余容量最大的group
2)选择group中的storage
0:group中的所有的storage轮询选择
1:选择IP地址最大的storage
2:根据优先级配置(在每个storage.conf中的upload_priority配置)
3)选择storage中的store_path
0:对所有的store path进行轮询
1:负载均衡,选择空闲空间最大的store_path
(3)tracker选择download storage
tracker在下载而选择一个storage时配置的参数是:download_server,可以选择从源storage优先下载或者轮询下载。tracker会先检查下载的group中是否有active的storage,没有就返回失败。
springboot集成fastdfs时的一个坑,linux对外暴露的端口有:8080,22122,23000,几乎没人提到23000端口,这其实是storage的默认端口。
不使用docker搭建fastdfs的一些坑:
1.fastdfs_nginx_module的版本号和fastdfs不兼容,5.0.5对应1.16
2.cd fastdfs-nginx-module/src 下的config文件配置问题: http://bbs.chinaunix.net/thread-4169828-1-1.html
3.配置storage的nginx访问路径时,nginx的配置文件中加user root;不然会报nginx 404