学网站建设与管理难吗,wordpress mysql备份,专业的盐城网站开发,百度网盘网站入口一、FastDFS概述
1.1 什么是分布式文件系统 单机时代
初创时期由于时间紧迫#xff0c;在各种资源有限的情况下#xff0c;通常就直接在项目目录下建立静态文件夹#xff0c;用于用户存放项目中的文件资源。如果按不同类型再细分#xff0c;可以在项目目录下再建立不同的…一、FastDFS概述
1.1 什么是分布式文件系统 单机时代
初创时期由于时间紧迫在各种资源有限的情况下通常就直接在项目目录下建立静态文件夹用于用户存放项目中的文件资源。如果按不同类型再细分可以在项目目录下再建立不同的子目录来区分。例如resources\static\file、resources\static\img等。 优点便利使用方便。 缺点文件越多存放越混乱 独立文件服务器
随着公司业务不断发展将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器 流程 项目上传文件时首先通过ftp或者ssh将文件上传到图片服务器的某个目录下再通过Ngnix或者Apache来访问此目录下的文件返回一个独立域名的图片URL地址前端使用文件时就通过这个URL地址读取。 缺点 存在单点故障的问题。数据备份需要人为干预。 分布式文件系统
业务继续发展单台服务器存储和响应也很快到达了瓶颈新的业务需要文件访问具有高响应性、高可用性来支持系统。 优点 扩展能力: 毫无疑问扩展能力是一个分布式文件系统最重要的特点高可用性: 在分布式文件系统中高可用性包含两层一是整个文件系统的可用性二是数据的完整和一致性弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源而不需要中断系统运行。 缺点系统复杂度稍高需要更多服务器 1.2 FastDFS简介 FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件建议范围4KB file_size 500MB为载体的在线服务如相册网站、视频网站等等。
FastDFS特性
文件不分块存储上传的文件和OS文件系统中的文件一一对应支持相同内容的文件只保存一份节约磁盘空间下载文件支持HTTP协议可以使用内置Web Server也可以和其他Web Server配合使用支持在线扩容支持主从文件
分布式文件服务提供商
1、阿里的OSS
2、七牛云存储
3、百度云储存
1.3 FastDFS核心概念 FastDFS服务端有三个角色跟踪服务器tracker、存储服务器storage和客户端client。
tracker
跟踪服务器主要做调度工作起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息是客户端和数据服务器交互的枢纽。就相当于是工厂的包工头。
storage
存储服务器又称存储节点或数据服务器文件和文件属性meta data都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。相当于是工厂的工人。
client
客户端作为业务请求的发起方通过专有接口使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口比如upload、download、append、delete等以客户端库的方式提供给用户使用。
group
组 也可称为卷。 同组内服务器上的文件是完全相同的 同一组内的storage server之间是对等的 文件上传、 删除等操作可以在任意一台storage server上进行 。 流程 Tracker相当于FastDFS的大脑不论是上传还是下载都是通过tracker来分配资源客户端一般可以使用Ngnix等静态服务器来调用或者做一部分的缓存存储服务器内部分为卷或者叫做组卷于卷之间是平行的关系可以根据资源的使用情况随时增加卷内服务器文件相互同步备份以达到容灾的目的。 1.4 FastDFS上传机制 首先客户端请求Tracker服务获取到存储服务器的ip地址和端口然后客户端根据返回的IP地址和端口号请求上传文件存储服务器接收到请求后生产文件并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息客户端保存相关信息上传完毕。 内部机制如下
1、选择Tracker server
当集群中不止一个Tracker server时由于Tracker之间是完全对等的关系客户端在upload文件时可以任意选择一个trakcer。
2、选择Storage server
当选定Group后Tracker会在Group内选择一个Storage Server给客户端
3、选择Storage path
当分配好Storage Server后客户端将向Storage发送写文件请求Storage将会为文件分配一个数据存储目录。 注意 剩余存储空间最多的优先。 4、生成Fileid
选定存储目录之后Storage会为文件生一个Fileid由Storage Server Ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成然后将这个二进制串进行base64编码转换为可打印的字符串。
5、生成文件名
当文件存储到某个子目录后即认为该文件存储成功接下来会为该文件生成一个文件名文件名由group、存储目录、两级子目录、fileid、文件后缀名由客户端指定主要用于区分文件类型拼接而成。
1.5 FastDFS下载机制
客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口然后客户端根据返回的IP地址和端口号请求下载文件存储服务器接收到请求后返回文件给客户端。 内部机制如下
client询问tracker下载文件的storage参数为文件标识组名和文件名tracker返回一台可用的storageclient直接和storage通讯完成文件下载 二、Linux搭建FastDFS
2.1 安装FastDFS
下载安装gcc
安装方式为yum安装需网络
yum install gcc-c perl-devel pcre-devel openssl-devel zlib-devel wget下载安装FastDFS
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz下载安装FastDFS依赖
wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz下载安装FastDFS
wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz解压缩依赖tar包
tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf V6.06.tar.gz -C /usr/local编译并安装libfastcommon cd /usr/local/libfastcommon-1.0.43/./make.sh ./make.sh install
编译并安装FastDFS
cd /usr/local/fastdfs-6.06
./make.sh ./make.sh install
进入etc目录下复制配置文件
cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
2.2 创建tracker服务
创建tracker目录
mkdir -p /data/fastdfs/tracker修改配置文件
vim /etc/fdfs/tracker.confdisabledfalse #启用配置文件
port22122 #设置 tracker 的端口号
base_path/data/fastdfs/tracker #设置 tracker 的数据文件和日志目录需预先创建
http.server_port8888 #设置 http 端口号指的是在tracker服务器上启动http服务进程如:apache或者nginx 启动时所监听的端口
启动tracker服务
/etc/init.d/fdfs_trackerd start
检查tracker服务
netstat -lntup |grep fdfs
2.3 创建storage服务
创建storage目录
mkdir -p /data/fastdfs/base #日志
mkdir -p /data/fastdfs/storage #文件存储位置修改配置文件
vim /etc/fdfs/storage.confdisabledfalse #启用配置文件
group_namegroup1 #组名根据实际情况修改
port23000 #设置 storage 的端口号
base_path/data/fastdfs/base #设置 storage 的日志目录需预先创建
store_path_count1 #存储路径个数需要和 store_path 个数匹配
store_path0/data/fastdfs/storage #存储路径
tracker_server 192.168.66.100:22122 #tracker 服务器的 IP 地址和端口号
http.server_port8888 #设置storage上启动的http服务的端口号如安装的nginx的端口号
启动storage服务
/etc/init.d/fdfs_storaged start查看storage服务
netstat -lntup |grep fdfs 2.3 配置Client服务
创建client日志文件目录
mkdir -p /data/fastdfs/client
修改client配置文件
vim /etc/fdfs/client.confconnect_timeout30
network_timeout60
base_path/data/fastdfs/client # 日志路径
tracker_server192.168.66.100:22122 # 追踪服务器的IP有多个服务器可以另一行 查看启动的服务
ps -ef | grep fdfs三、FastDFS指令 3.1 上传文件指令fdfs_upload_file
fdfs_upload_file config_file local_filename [storage_ip:port] [store_path_index]参数含义 config_file 客户端client配置文件路径local_filename 要上传的文件的地址[storage_ip:port] 可选参数[store_path_index] 可选参数 示例
fdfs_upload_file /etc/fdfs/client.conf ./pdx.jpg #将当前文件夹下的pdx.jpg文件上传到FastDFSgroup1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg #上传文件后会返回文件在FastDFS中的唯一文件标识即卷名文件名
在/data/fastdfs/storage/data/00/00可以查看当前上传的文件 3.2 下载文件指令
fdfs_download_file config_file file_id [local_filename] [download_offset download_bytes 参数含义 config_file 客户端配置文件路径file_id 文件在FastDFS中的唯一文件标识即卷名文件名[local_filename] 文件下载地址download_offset 可选参数文件下载开始时间download_bytes 可选参数文件下载的字节数 示例
#将文件下载到当前路径下
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg
3.3 查看文件信息指令
fdfs_file_info config_file file_id参数含义 config_file 客户端配置文件路径file_id 文件在FastDFS中的唯一文件标识即卷名文件名 示例
#查看文件的信息
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg 3.4 删除文件指令
fdfs_delete_file config_file file_id参数含义 config_file 客户端配置文件路径file_id 文件在FastDFS中的唯一文件标识即卷名文件名 示例
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg 注意: 删除指令使用后文件在该卷中的所有备份都会被删除因为卷内的存储节点会相互同步故慎用。 四、SpringBoot操作FastDFS实现文件上传基本版 由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基础上进行了大量重构工作并于GitHub上发布了FastDFS-Client1.26.5。
主要特性
对关键部分代码加入了单元测试便于理解与服务端的接口交易提高接口质量将以前对byte硬解析风格重构为使用对象注解的形式尽量增强了代码的可读性支持对服务端的连接池管理支持上传图片时候检查图片格式并且自动生成缩略图在SpringBoot当中自动导入依赖
1、创建springboot项目2.7.0导入FastDFS依赖jar
dependencygroupIdcom.github.tobato/groupIdartifactIdfastdfs-client/artifactIdversion1.26.5/version
/dependency2、添加配置
####分布式文件系统配置###########
fdfs:so-timeout: 1500connect-timeout: 600thumb-image: #缩略图生成参数width: 150height: 150tracker-list: #TrackerList参数,支持多个- 192.168.66.100:22122# - 192.168.66.101:22122
3、编写测试类实现文件上传和文件下载
package com.zj;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 org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
import java.io.*;SpringBootTest
class FastdfsApplicationTests {//通过FastDFS的客户端对象完成对文件系统的操作Resourceprivate FastFileStorageClient fastFileStorageClient;//测试上传文件Testpublic void upload() throws FileNotFoundException {//1.先读取本地文件File file new File(D:\\aaa.jpg);//2.创建传输文件输入流FileInputStream fileInputStream new FileInputStream(file);//3.文件上传/** 参数一文件输入流* 参数二文件大小* 参数三文件拓展名* 参数四描述文件的元数据指定文件上传的位置*/StorePath storePath fastFileStorageClient.uploadFile(fileInputStream, file.length(), jpg, null);//4.将卷名和文件名一起打印System.out.println(上传文件的地址storePath.getFullPath());System.out.println(文件卷名storePath.getGroup());System.out.println(文件名storePath.getPath());}//文件下载Testpublic void download() throws IOException {//1.下载文件/** 参数一文件处于存储节点的卷名* 参数二文件在存储节点的文件名* 参数三下载的回调函数*/byte[] downloadFile fastFileStorageClient.downloadFile(group1, M00/00/00/wKhCZGS2WGaAYKOuADcAPt_yJDw957.jpg, new DownloadByteArray());//2.创建文件输出流,并指定文件下载的位置FileOutputStream fileOutputStream new FileOutputStream(d:\\aaa.jpg);//3.将文件输出流写文件到磁盘fileOutputStream.write(downloadFile);//4.刷新fileOutputStream.flush();//5.关闭流fileOutputStream.close();}}五、spring boot整合FastDFS实现文件上传完整版 1、引入Thymeleaf视图解析器和文件上传客户端对象 !--fastdfs--dependencygroupIdcom.github.tobato/groupIdartifactIdfastdfs-client/artifactIdversion1.26.5/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependency 注意 使用wangeditor富文本编辑器的前提是引入Thymeleaf模板。 2、通过CDN在前端页面引入wangEditor富文本编辑器 script typetext/javascript srchttps://unpkg.com/wangeditor/dist/wangEditor.min.js/script3、创建编辑器基本骨架
div iddiv1p欢迎使用 bwangEditor/b 富文本编辑器/p
/div
script typetext/javascriptconst E window.wangEditor;const editor new E(#div1)editor.create();
/script 4、创建文件上传的Controller控制器
package com.zj.controller;import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.IOException;RestController
public class uploadController {Resourceprivate FastFileStorageClient fastFileStorageClient;//图片上传PostMapping(/upload)public void upload(MultipartFile file) throws IOException {//1.判断文件是否为空if(file ! null){//2.获取上传的图片的名字String originalFilename file.getOriginalFilename();//3.获取上传的图片的扩展名String suffix originalFilename.substring(originalFilename.lastIndexOf(.) 1);//4.上传图片StorePath storePath fastFileStorageClient.uploadFile(file.getInputStream(), file.getSize(), suffix, null);System.out.println(上传的文件的路径storePath.getFullPath());//5.上传的文件路径需要保存到数据库中//……}}
}文件上传的请求方式必须是post 5、完整的index.html页面
!DOCTYPE html
html langen xmlns:thhttp://www.thymeleaf.org
headmeta charsetUTF-8title文件上传/titlescript typetext/javascript srchttps://unpkg.com/wangeditor/dist/wangEditor.min.js/script/head
body
div iddiv1p欢迎使用 bwangEditor/b 富文本编辑器/p
/div
script typetext/javascriptconst E window.wangEditor;const editor new E(#div1);//指定文件上传的服务路径editor.config.uploadImgServer /upload;//文件参数名editor.config.uploadFileName file;//限制文件上传的大小和类型 2Meditor.config.uploadImgMaxSize 2 * 1024 * 1024;//文件上传的类型editor.config.uploadImgAccept [jpg, jpeg, png, gif, bmp, webp];editor.create();
/script/body
/html
6、启动项目上传图片即可
六、FastDFS整合Nginx Nginx服务器是一个高性能的web服务器与反向代理服务器。
FastDFS集成Nginx的2个原因 为分布式文件系统提供Http服务支持
通过Nginx的web服务代理访问分布式文件系统的存储节点从而实现通过http请求访问存储节点资源。 注意 src 属性值图像文件的 URL。也就是引用该图像的文件的的绝对路径或相对路径。 2.解决复制延迟问题
由于FastDFS的同卷的存储节点之间需要同步当文件尚未同步完成时访问请求到达改节点获取的数据将是未同步完的不完整数据即为复制延迟问题。通过Nginx检测请求的存储节点的数据若该存储节点的数据尚未同步完成则将请求转发至数据的原存储节点从而解决复制延迟问题。 环境搭建
下载Fastdfs的Nginx模块包
#选择安装位置
cd /usr/local#下载文件或者使用本文章已经下载好的文件
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.22.tar.gz#解压文件
tar -zxvf V1.22.tar.gz在ginx-1.20.2目录下安装Nginx依赖文件
yum install -y gcc gcc-c zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel epel-release
配置Nginx服务器
#建立Makefile文件检查Linux系统环境以及相关的关键属性。添加fastdfs-nginx-module-1.22模块到nginx
./configure --add-module/usr/local/fastdfs-nginx-module-1.22/src/#编译项目主要将gcc源代码编译成可执行的目标文件
make#根据上一步骤编译完成的数据安装到预定的目录中。之前安装过ngxin的话不需要再安装
make install 注意 –add-module为nginx添加一个fastdfs-nginx-module模块值为该模块在当前系统的路径–prefix指定nginx安装位置 将Fastdfs软件包里面的http.conf和mime.types拷贝到/etc/fdfs目录下
cp /usr/local/fastdfs-6.06/conf/mime.types /etc/fdfs/
cp /usr/local/fastdfs-6.06/conf/http.conf /etc/fdfs/配置Nginx的fastdfs模块并编辑文件
#拷贝文件
[rootlocalhost opt]cp /usr/local/fastdfs-nginx-module-1.22/src/mod_fastdfs.conf /etc/fdfs/[rootlocalhost fdfs] vim mod_fastdfs.conf
#保存日志目录
base_path/data/fastdfs/storage
#tracker 服务器的 IP 地址以及端口号
tracker_server192.168.66.100:22122
#文件url中是否有group 名
url_have_group_name true
#存储路径
store_path0/data/fastdfs/storage
group_count 1 #设置组的个数
#然后在末尾添加分组信息目前只有一个分组就只写一个
[group1]
group_namegroup1
storage_server_port23000
store_path_count1
store_path0/data/fastdfs/storage配置Nginx
server {listen 80;server_name localhost;location ~ /group[1-3]/M00 {alias /data/fastdfs/storage/data;ngx_fastdfs_module;}# 根目录下返回403location / {return 403;}# log fileaccess_log logs/img_access.log access;
}启动Ningx服务
# 进入sbin目录
[roottracker nginx]# cd sbin/# 启动服务 -c指定配置文件
[roottracker sbin]# ./nginx -c /usr/local/nginx/conf/nginx.conf查看服务启动情况
[roottracker sbin]# ps -ef | grep nginx启动追踪服务与存储节点服务
[roottracker sbin]# fdfs_trackerd /etc/fdfs/tracker.conf start
[roottracker sbin]# fdfs_storaged /etc/fdfs/storage.conf start上传图片测试
将图片上传至linux系统后使用指令上传至分布式文件系统
[rootlocalhost /]# fdfs_upload_file /etc/fdfs/client.conf pdx.jpg
group1/M00/00/00/wKhCZGS6zneAUxGKAANsTCZQKGY401.jpg
通过浏览器远程访问
http://192.168.66.100/group1/M00/00/00/wKhCZGS6zneAUxGKAANsTCZQKGY401.jpg