首页 » PHP教程 » dockerphpfastdfs技巧_一文搞定FastDFS的搭建和运用

dockerphpfastdfs技巧_一文搞定FastDFS的搭建和运用

访客 2024-12-05 0

扫一扫用手机浏览

文章目录 [+]

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并看重高可用、高性能等指标,利用FastDFS很随意马虎搭建一套高性能的文件做事器集群供应文件上传、下载等做事。

FastDFS做事端有两个角色:跟踪器(tracker)和存储节点(storage)。
跟踪器紧张做调度事情,在访问上起负载均衡的浸染。

dockerphpfastdfs技巧_一文搞定FastDFS的搭建和运用

存储节点存储文件,完成文件管理的所有功能:便是这样的存储、同步和供应存取接口,FastDFS同时对文件的metadata进行管理。
所谓文件的meta data便是文件的干系属性,以键值对(key value)办法表示,如:width=1024,个中的key为width,value为1024。
文件metadata是文件属性列表,可以包含多个键值对。

dockerphpfastdfs技巧_一文搞定FastDFS的搭建和运用
(图片来自网络侵删)

跟踪器和存储节点都可以由一台或多台做事器构成。
跟踪器和存储节点中的做事器均可以随时增加或下线而不会影响线上做事。
个中跟踪器中的所有做事器都是对等的,可以根据做事器的压力情形随时增加或减少。

为了支持大容量,存储节点(做事器)采取了分卷(或分组)的组织办法。
存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加便是全体存储系统中的文件容量。
一个卷可以由一台或多台存储做事器组成,一个卷下的存储做事器中的文件都是相同的,卷中的多台存储做事器起到了冗余备份和负载均衡的浸染。

在卷中增加做事器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增做事器切换到线上供应做事。

当存储空间不敷或即将耗尽时,可以动态添加卷。
只须要增加一台或多台做事器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

2. 环境搭建1、Linux-centos7上安装FastDFS(繁琐)

自行百度,重点先容docker安装办法

2、docker安装FastDFS(推举)1.拉取镜像

docker pull delron/fastdfs 2.利用docker镜像构建tracker容器(跟踪做事器,起到调度的浸染)

docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs tracker3.利用docker镜像构建storage容器(存储做事器,供应容量和备份做事)

TRACKER_SERVER=本机的ip地址:22122 ,本机ip地址不要利用127.0.0.1

docker run -dti --network=host --name storage -e TRACKER_SERVER=192.168.157.133:22122 -v /var/fdfs/storage:/var/fdfs -v /etc/localtime:/etc/localtime delron/fastdfs storage4.进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在/etc/fdfs目录下的storage.conf

#进入容器docker exec -it storage bash #进入目录cd /etc/fdfs/ #编辑文件vi storage.conf

默认端口是8888,也可以不进行变动。

5.修正storage中的nginx 不须要安装

cd /usr/local/nginx/confvi nginx.conf

6.修正完配置重启容器,没有修正就不须要重启

docker stop storagedocker start storage

如果重启后无法启动的会,可能是报下面缺点了,手动创建 vi /var/fdfs/logs/storaged.log 文件即可 tail: cannot open '/var/fdfs/logs/storaged.log' for reading: No such file or directory

7.测试

7.1 进入storage容器,进入/var/fdfs目录

docker exec -it storage bashcd /var/fdfsecho hello 这是我的第一个测试文件,大家以为不错关注下吧>a.txt/usr/bin/fdfs_upload_file /etc/fdfs/client.conf a.txt

浏览器访问 http://ip:8888/group1/M00/00/00/wKgcgF-_Le6AS4LvAAAATzab9Do068.txt 端口根据你在starage里面设置的要保持同等,访问之前关闭防火墙或者自己单独开放端口

8.开放端口

firewall-cmd --zone=public --permanent --add-port=8888/tcpfirewall-cmd --zone=public --permanent --add-port=22122/tcpfirewall-cmd --zone=public --permanent --add-port=23000/tcp

重启防火墙

systemctl restart firewalld9.开机启动容器

设置容器随docker启动而启动(由于docker是开机启动的,以是容器也会随之启动)

docker update --restart=always trackerdocker update --restart=always storage3. 做事器端口和防火墙

由于做事器防火墙的缘故原由,导致指定的端口未暴露会涌现如下问题: 1、浏览器访问fastdfs上传的资源访问不到http://192.168.157.133:8888/group1/M00/00/00/wKidhWF1ABqAYqUwAAAATzab9Do485.txt 2、fastdfs-client客户端连接fastdfs做事出错 会报下面缺点:

fastDFS报错:Unable to borrow buffer from pool

办理方案(centos7):

1、关闭防火墙

由于FastDFS安装在Linux中 22122端口被管控,windows系统访问时须要先关闭防火墙或者开放该端口 1.查看防火墙状态:

firewall-cmd --state

2.关闭并禁用防火墙,可能须要重启做事器

sudo systemctl stop firewalld.service sudo systemctl disable firewalld.service

3.查看防火墙状态:

firewall-cmd --state not running

2、开放端口

firewall-cmd --zone=public --permanent --add-port=8888/tcpfirewall-cmd --zone=public --permanent --add-port=22122/tcpfirewall-cmd --zone=public --permanent --add-port=23000/tcp#重启防火墙systemctl restart firewalld

然后重启fastdfs做事(tracker、storage、nginx)

4. FastDFS在Web项目中运用

Controller层

package com.xjt.fdfs.controller;import cn.hutool.core.io.FileUtil;import com.github.tobato.fastdfs.domain.fdfs.StorePath;import com.github.tobato.fastdfs.domain.proto.storage.DownloadByteArray;import com.github.tobato.fastdfs.service.FastFileStorageClient;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import io.swagger.annotations.ApiParam;import org.apache.commons.io.FilenameUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;@Api(tags = "FastDFS测试")@RestController@RequestMapping("/api/fastdfs")public class FileController { @Autowired private FastFileStorageClient storageClient; public final static String server_host = "http://192.168.157.134:8888/"; @ResponseBody @ApiOperation(value = "上传文件",httpMethod = "POST") @PostMapping("/upload") public String uploadFile(@ApiParam("文件") MultipartFile file) throws IOException { StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), FilenameUtils.getExtension(file.getOriginalFilename()),null); String filepath = server_host + storePath.getFullPath(); return "文件上传成功 地址为:"+filepath; } @ResponseBody @ApiOperation(value = "删除文件",httpMethod = "POST") @PostMapping("/delete") public void deleteFile(String fileUrl){ if (StringUtils.isEmpty(fileUrl)) { return; } try { StorePath storePath = StorePath.parseFromUrl(fileUrl); storageClient.deleteFile(storePath.getGroup(), storePath.getPath()); } catch (Exception e) { System.out.println(e.getMessage()); } } @ResponseBody @ApiOperation(value = "下载文件",httpMethod = "POST") @PostMapping("/download") public void downloadFile(HttpServletRequest request, HttpServletResponse response,String fileUrl){ try { StorePath storePath = StorePath.parseFromUrl(fileUrl); System.out.println(storePath.getGroup()); System.out.println(storePath.getPath()); byte[] bytes = storageClient.downloadFile(storePath.getGroup(), storePath.getPath(), new DownloadByteArray()); response.getOutputStream().write(bytes); FileUtil.writeBytes(bytes,FileUtil.file(storePath.getPath())); } catch (Exception e) { return; } }}

配置文件application.properties

#fastdfs配置fdfs.connect-timeout=1500fdfs.so-timeout=1500fdfs.trackerList[0]=192.168.157.134:22122fdfs.thumbImage.height=150fdfs.thumbImage.width=150spring.jmx.enabled=falsefdfs.pool.max-total=200spring.servlet.multipart.max-file-size=1000MBspring.servlet.multipart.max-request-size=1000MB

标签:

相关文章