FastDFS介绍

1、简介

​ FastDFS 是一个开源的高性能分布式文件系统(Distributed File System)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件为载体的在线服务,如图片、文档、音频、视频等。(文件大小建议范围:4KB<file_size<500MB)

​ FastDFS设计是用来存储小文件的,过大的文件处理方案是拆分为小文件,可跟踪小文件的上传情况。如果应用场景都是处理大文件,可能选择其他分布式文件系统方案会更合适。 如:HDFS(Hadoop Distributed File System)

2、优缺点

​ FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

  • 优点:

    • 支持在线扩容,动态添加卷
    • 支持文件冗余备份和负载均衡
    • 文件不分块存储,文件和系统中的文件一一对应
    • 对文件内容做hash处理,避免出现重复文件,节约磁盘空间
    • 存储服务器上可以保存文件属性(meta-data)
    • V2.0 网络通信采用libevent,支持大并发访问,整体性能更好
  • 缺点:

    • 单线程数据同步,仅适合存储小文件
    • 备份数根据存储分卷(分组)决定,缺乏文件备份数设置灵活性
    • 直接按文件存储,可直接查看文件内容,缺乏文件安全性
    • 单个挂载点异常会导致整个存储节点下线
    • 缺乏多机房容灾支持
    • 静态的负载均衡机制

3、结构组成

  • Tracker Server:

    跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周 期性心跳。

  • Storage Server:

    存储服务器,主要提供容量和备份服务;以group为单位,每个group内可以有多台storage server,数据互为备份。

  • Client:

    客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

Tracker相当于一个调度中心,上传和下载都通过它来进行分配指定。

Storage cluster部分,由Volume1、Volume2……VolumeK组成,它们称为卷(或者叫做组),卷与卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。

4、上传过程

  • 服务启动之后,Storage Server会定期的向Tracker Server上传状态消息

  • 客户端请求Tracker进行上传操作时,会获取存储服务器相关信息,主要包括storageIP和端口

  • 根据返回信息上传文件(file content和metadata),通过存储服务器写入磁盘

  • 返回给客户端file_id、路径信息、文件名等信息

当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。

当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。

5、下载过程

docker部署fastDFS图片服务器

安装docker

CentOS Docker 安装 | 菜鸟教程 (runoob.com)

开始

1、准备工作

端口开放

本文档图片服务器搭建用到了端口22122(tracker)、23000(storage)、8899(nginx)

  • 使用虚拟机进行操作时,需开启防火墙后将以上三个端口打开
  • 若是在云服务器上进行测试,需将以上三个端口号加入安全组规则,也需开启防火墙开放端口

防火墙相关命令放于附录

拉取镜像

docker pull delron/fastdfs

2、启动服务

启动tracker

docker run -d --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

启动storage和nginx

注意:ip为tracker服务器的地址

docker run -d --network=host --name storage -e TRACKER_SERVER=ip:22122 -v /var/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage

启动后使用:docker ps命令查看是否成功

3、修改配置

进入storage容器

docker exec -it storage /bin/bash

修改storage内部http.server_port

vi /etc/fdfs/storage.conf

http.server_port=8899

修改nginx端口

vi /usr/local/nginx/conf/nginx.conf

listen 8899;

退出:exit

4、重启容器

docker restart storage

至此,通过docker部署fstdfs文件服务器完成,测试是否成功可参照下面一章中的测试!!!!

分布式图片服务器部署

工作准备

1、安装依赖的环境

# 安装gcc环境
yum -y install gcc-c++# 有环境的显示如下,之前未安装的只需等待即可

# 安装FastDFS依赖libevent库
yum -y install libevent# 看到Complete即为安装成功

2、文件(压缩包)准备

链接:https://pan.baidu.com/s/1awqI0esvfijQvUm8zM96mw
提取码:hm71

使用Xftp或其他工具将以下四个文件上传至服务器的/usr/local/fdfs目录下

## 步骤:
# 到/usr/local/目录下
cd /usr/local/
# 创建文件夹
mkdir fdfs
# 查看
cd /usr/local/fdfs
ll

3、端口开放

本文档图片服务器搭建用到了端口22122(tracker)、23000(storage)、8899(nginx)

  • 使用虚拟机进行操作时,需开启防火墙后将以上三个端口打开
  • 若是在云服务器上进行测试,需将以上三个端口号加入安全组规则,也需开启防火墙开放端口

防火墙相关命令放于附录

安装

libfastcommon安装

libfastcommon 包含了FastDFS运行所需要的一些基础库

# 解压libfastcommon安装包
tar -zxf libfastcommonV1.0.7.tar.gz
ll

# 进入文件
cd libfastcommon-1.0.7/# 编译
./make.sh
./make.sh install

PS:libfastcommon安装好后会自动将库文件拷贝到/usr/lib64下,而FastDFS程序引用usr/lib目录,因此需要将/usr/lib64下的库文件拷贝到/usr/lib

cd /usr/lib64/cp libfastcommon.so /usr/lib/find /usr/lib/ -name libfastcommon.so

FastDFS_v5.05.tar.gz安装

PS:此文档中将tracker、storage均配置在一台服务器上,真实环境可分开配置、集群配置

cd /usr/local/fdfs/
lltar -zxf FastDFS_v5.05.tar.gz
ll

cd FastDFS/
ll

PS: 可以看到文件内有我们需要的tracker、storage以及用于测试的client。

 # 编译运行
./make.sh./make.sh install

安装成功后将 /usr/local/fdfs/FastDFS/conf/下的文件拷贝到/etc/fdf/文件下

cd /etc/fdfs/
ll

cd /usr/local/fdfs/FastDFS/conf/cp * /etc/fdfs/

配置tracker

复制路径

# 进入FastDFS文件下的tracker文件下进行tracekr配置
cd /usr/local/fdfs/FastDFS/tracker/
# 显示当前路径,需手动复制
pwd

/usr/local/fdfs/FastDFS/tracker

修改配置

vi /etc/fdfs/tracker.conf

基本操作:

  • ----i 开始修改

  • ----Esc 退出修改

  • ----:wq 保存并退出

  • ----:q! 不保存退出

# 将base_path路径改为已复制路径
base_path=/usr/local/fdfs/FastDFS/tracker
# 编辑后保存并退出

启动tracker服务

fdfs_trackerd /etc/fdfs/tracker.conf start

监听

netstat -unltp|grep fdfs

tracker启动成功!!!!

配置storage

复制路径

cd /usr/local/fdfs/FastDFS/storage/
pwd

/usr/local/fdfs/FastDFS/storage

修改配置

vi /etc/fdfs/storage.conf
  • 将base_path和store_path0的路径改为已复制路径

  • base_path=/usr/local/fdfs/FastDFS/storage

  • store_path0=/usr/local/fdfs/FastDFS/storage

# 修改tracker服务器的ip和端口(端口默认为22122)
# ip为tracker服务器地址
tracker_server=ip:22122
# 编辑后保存并退出

启动和监听

# 启动
fdfs_storaged /etc/fdfs/storage.conf start
# 监听
netstat -unltp|grep fdfs

storage启动成功!!!!

配置客户端测试上传

复制路径

cd /usr/local/fdfs/FastDFS/client/
pwd

/usr/local/fdfs/FastDFS/client

修改配置

vi /etc/fdfs/client.conf
  • 将base_path路径改为已复制路径
  • tracker_server的ip地址改为tracker服务器的ip
base_path=/usr/local/fdfs/FastDFS/client
tracker_server=xxxx:22122
# 编辑后保存并退出
测试上传

创建文件

cd /root/
ls
# 创建一个txt文件,编辑后保存退出
vi hello.txt

上传

# 上传命令
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /root/hello.txt# 返回如下地址即为上传成功(如下图)
# example file url: http://43.140.202.119/group1/M00/00/00/CgAIC2M2i-6AR4wcAAAAED0JP-g793_big.txt# 检验
cd /usr/local/fdfs/FastDFS/storage/data/00/00/
ll
# 可看到,已上传文件已经在storage的data目录下的00/00目录下存储起来了

注意: 此时仅代表通过fastdfs将文件上传至服务器,若要将此地址复制到浏览器可访问,

​ 还需通过nginx进行代理。

nginx安装及nginx插件

a、nginx依赖的环境

  • gcc(工作准备中已安装)

  • PCRE

    yum install -y pcre pcre-devel
    
  • zlib

    yum install -y zlib zlib-devels
    
  • openssl

    yum install -y openssl openssl-devel
    

b、nginx安装

cd /usr/local/fdfs/
ll
# 解压nginx-1.10.3.tar.gz
tar -zxf nginx-1.10.3.tar.gz
# 进入nginx-1.10.3
cd nginx-1.10.3/

c、FastDFS的nginx插件安装及配置

cd /usr/local/fdfs/
ll
# 解压
tar -zxf fastdfs-nginx-module_v1.16.tar.gz
cd fastdfs-nginx-module/

修改配置

cd src/
ls
# 修改fastdfs-nginx-module/src/config文件,把其中的`local`去掉
vi config
# 手动敲以下命令
:%s/local\///g
# 将lib改为lib64,如下图
# 后保存并退出

# 将fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下,并编辑该文件
cp mod_fastdfs.conf /etc/fdfs/
vi /etc/fdfs/mod_fastdfs.conf# 将tracker服务器ip改为相对应的tracker服务器ip地址
tracker_server=xxxx:22122
# 将store_path0修改成storage文件夹相对应位置
store_path0=/usr/local/fdfs/FastDFS/storage
# 默认false,改成true
url_have_group_name = true
# 保存后退出编辑

d、修改nginx配置

复制路径

cd /usr/local/fdfs/fastdfs-nginx-module/src/
pwd

/usr/local/fdfs/fastdfs-nginx-module/src

修改配置

# 插件配置
cd /usr/local/fdfs/nginx-1.10.3/
# ./configure --add-module=复制的路径
./configure --add-module=/usr/local/fdfs/fastdfs-nginx-module/src# 安装编译
make
make insatll
# nginx配置
cd /usr/local/nginx/conf/vi nginx.conf
# 添加serverserver {listen 8899;server_name localhost;location /group1/M00 {root /usr/local/fdfs/FastDFS/storage/data;ngx_fastdfs_module;
}

e、启动nginx

cd /usr/local/nginx/sbin/
# 启动
./nginx
# 查看是否启动成功
ps -aux | grep nginx

此时即可将测试上传时得到的链接输入浏览器,进行访问

注意:在ip地址后加上端口号(8899)

43.140.202.119:8899/group1/M00/00/00/CgAIC2M2i-6AR4wcAAAAED0JP-g793_big.txt

单机图片服务器搭建成功!!!!

集群可依据配置自行修改。。。。。。。。。

######非必要
# fastdfs删除后页面还有缓存的解决方法# 在nginx中配置
location ~ /M00{
root /data/fast_data/data;
ngx_fastdfs_module;
add_header Cache-Control no-store;
}

附录

防火墙相关命令

防火墙开关

查询防火墙状态

firewall-cmd --state

关闭防火墙

systemctl stop firewalld

启动防火墙

systemctl start firewalld

重启防火墙(添加端口后一定要重启防火墙)

firewall-cmd --reload

端口开关

查看端口开放列表

firewall-cmd --list-ports

开放80端口

firewall-cmd --permanent --zone=public --add-port=80/tcp

查询80端口是否开放

firewall-cmd --query-port=80/tcp

移除8080端口

firewall-cmd --permanent --remove-port=8080/tcp

查询所有端口对应的服务

netstat -ntlp

windows防火墙命令

  • 以管理员身份打开cmd

关闭防火墙

netsh firewall set opmode mode=disablenetsh advfirewall set allprofiles state off

查看防火墙状态

netsh advfirewall show allprofiles

防火墙恢复默认配置

netsh firewall reset

代码

  • 后续会补充整体初级代码下载地址

结构

依赖

<!--fastdfs--><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.1-RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs‐client‐java --><dependency><groupId>net.oschina.zcx7878</groupId><artifactId>fastdfs-client-java</artifactId><version>1.27.0.0</version></dependency>

serviceImpl

public List<String> finalDocumentList1(MultipartFile[] files) {//返回地址列表(可访问)List<String> list = new ArrayList<>();for (int i = 0; i < files.length; i++) {MultipartFile file = files[i];//可访问路径StringBuilder filePath = new StringBuilder();//file的storagePath,ext_Name[i]String SP_file = upload1(file);if(SP_file.equals("false")){return null;}//拼接返回的图片地址的ip地址filePath.append("http://").append(path).append(":").append(port).append("/");//拼接返回图片的存储地址filePath.append(SP_file);//拼接file的浏览器可访问地址
//                System.out.println("这里是第" + i + "个file可访问路径:" + filePath);list.add(filePath.toString());}return list;}public String upload1(MultipartFile multipartFile){if (!multipartFile.isEmpty()){try {//加载fastDFS客户端的配置文件ClientGlobal.initByProperties("config/fastDfs-client.properties");//创建tracker的客户端TrackerClient tracker = new TrackerClient();TrackerServer trackerServer = tracker.getConnection();//定义storage的客户端StorageClient1 client = new StorageClient1(trackerServer, null);String file_Name = Objects.requireNonNull(multipartFile.getOriginalFilename()).split("\\.")[0];String ext_file = Objects.requireNonNull(multipartFile.getOriginalFilename()).split("\\.")[1];byte[] byteFile = multipartFile.getBytes();//文件元信息NameValuePair[] metaList = new NameValuePair[1];metaList[0] = new NameValuePair("fileName", file_Name + "." + ext_file);//通过文件字节流执行上传String fileId = client.upload_file1(byteFile, ext_file, metaList);//System.out.println("upload success. file id is: " + fileId);//关闭trackerServer的连接trackerServer.close();return fileId;} catch (IOException | MyException e) {e.printStackTrace();}}return "false";}

测试下载和删除

//文件下载@Testpublic void download() {try {//加载fastDFS客户端的配置 文件ClientGlobal.initByProperties("config/fastdfs-client.properties");//创建tracker的客户端TrackerClient tracker = new TrackerClient();TrackerServer trackerServer = tracker.getConnection();StorageServer storageServer = null;//定义storage的客户端StorageClient1 client = new StorageClient1(trackerServer, storageServer);byte[] bytes = client.download_file1("group1/M00/00/00/CgAIC2M9RAiAClvdAA6aHcaNQII186.jpg");File file = new File("D:/用户/桌面/picture/GPUCache/ew.jpg");FileOutputStream fileOutputStream = new FileOutputStream(file);fileOutputStream.write(bytes);fileOutputStream.close();//关闭trackerServer的连接trackerServer.close();} catch (Exception ex) {ex.printStackTrace();}}//文件删除@Testpublic void deleteDocument(){try {//加载fastDFS客户端的配置 文件ClientGlobal.initByProperties("config/fastdfs-client.properties");//创建tracker的客户端TrackerClient tracker = new TrackerClient();TrackerServer trackerServer = tracker.getConnection();StorageServer storageServer = null;//定义storage的客户端StorageClient1 client = new StorageClient1(trackerServer, storageServer);
//            byte[] bytes = client.download_file1("group1/M00/00/00/CgAIC2M9RAiAClvdAA6aHcaNQII186.jpg");int i = client.delete_file1("group1/M00/00/00/CgAIC2M9RAiAClvdAA6aHcaNQII186.jpg");//0为删除成功,2为未找到该文件,其他为删除文件异常System.out.println("状态码::::::::" + i);//关闭trackerServer的连接trackerServer.close();} catch (Exception ex) {ex.printStackTrace();}}

图片服务器部署(docker部署和分离部署)相关推荐

  1. ubantu20.04服务器使用docker以及docker-compose编排部署前后端分离个人博客项目(springboot+vue+mysql+redis)

    ubantu20.04使用docker部署前后端分离个人博客项目(springboot+vue+mysql+redis) 前言 本博客是基于springboot+vue+jwt+redis+mysql ...

  2. 闲谈图片服务器及独立网站为什么要使用图片服务器?

    如果您的网站存在大量的图片读写操作,我们建议您使用图片服务器.通过使用独立的图片服务器,您可以提高网站性能,改善用户体验,并降低运营成本. 什么是图片服务器         图片服务器是专门为图片读写 ...

  3. 史上最详细阿里云服务器上Docker部署War包项目 实战每一步都带详细图解!!!

    史上最详细阿里云服务器上Docker部署War包项目 实战每一步都带详细图解!!! 部署jar 包方式: https://blog.csdn.net/weixin_45821811/article/d ...

  4. 服务器部署docker

    服务器部署docker docker简介## 可以把docker是一个容器,可以让开发者将自己的项目部署到这个容器中,最常用的场景是将自己的后端项目部署到服务器的时候会将其打入docker镜像中,可以 ...

  5. Docker环境下的前后端分离部署与运维 脚本

    <Docker环境下的前后端分离部署与运维>脚本 文章目录 <Docker环境下的前后端分离部署与运维>脚本 一.Docker虚拟机常用命令 二.安装PXC集群,负载均衡,双机 ...

  6. 高并发大流量专题---6、独立图片服务器的部署

    高并发大流量专题---6.独立图片服务器的部署 一.总结 一句话总结: 独立图片服务器还是非常有必要的,可以很大程度的降低主服务器的io以及提升用户访问速度 1.独立图片服务器 独立的必要性? 分担W ...

  7. 使用rsync+inotify+apache做分布式图片服务器的部署方法

    图片服务器一般是做成分布式的,但要使得所有的图片服务器的文件一致,可以由一个主服务器将文件推送到各个备份服务器上. rsync:文件差异检查及文件推送 inotify:事件触发,实时检测到添加.删除. ...

  8. 单机 docker 部署fastfds_云服务器使用docker可视化一键部署Wrodpress个人博客,操作简单,适合小白...

    原文链接在我的博客: 教你云服务器使用docker可视化一键部署Wrodpress个人博客,操作简单,适合小白 - Kyellow's blog​kyellow.gitee.io 前段时间领取了一台云 ...

  9. 如何在云服务器使用docker快速部署jupyter web服务器(Nginx+docker+jupyter+tensorflow)

    如何在云服务器部署jupyter web服务器 jack lee 邮箱:291148484@163.com 如有错误可以法邮件给我纠正,希望本文对你有所帮助. 导读:如果你用过百度人工只能的在线提交代 ...

最新文章

  1. 企业如何提升管理能力,让企业协作更顺畅?
  2. 有6个候选人,100个选民,每个选民选择一个侯选人投票;从键盘输入每个选民选择的候选人名,统计并输出6个候选人的票数。java,c++实现
  3. Linux-Shell基础(变量,字符串,数组)
  4. BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
  5. JavaScript 时间戳(互相转换)(自定义格式)- 案例篇
  6. 【英语学习】【English L06】U07 Jobs L5 Work overtime
  7. hibernate get方法有执行sql但是后台拿不到_「6」进大厂必须掌握的面试题-Hibernate...
  8. django 1.8 官方文档翻译: 2-5-1 管理器 (初稿)
  9. OpenCV学习笔记:基础结构
  10. Docker学习总结(39)——简析容器、无服务器和虚拟机的安全性差异
  11. python 堆_【译】Python中的堆排序
  12. 问题五十九:怎么求一元六次方程在区间内的所有不相等的实根(1)
  13. SVN,HG,GIT 命令说明
  14. Layui表单自定义验证规则
  15. QT 弹出pdf 或者网页【软件 help/about按钮】
  16. 三层交换机划分VLAN
  17. java布尔字段用is前缀_Javabean中,对于boolean类型的属性,可以使用is代替方法名称中的set和get前缀,创建Bean必须带有包名。...
  18. 小数化分数(C++ 代码讲解很详细)
  19. momen.js记录下开发中用到的日期
  20. iOS——KVO与KCO

热门文章

  1. m8 windows android,M8 Android 图文刷机详细教程
  2. 使用多模板匹配进行DICOM图像的自动勾画
  3. Aphelion 報[LDAP:error code 53 - Datebase is in ReadOnly mode]錯誤
  4. 海战棋海战棋海战棋海战棋海战棋海战棋海战棋
  5. 百亿级hive表更新与删除数据
  6. mysql inner join_MySQL JOIN 语法说明与 INNER JOIN 语法用法实例
  7. 人工智能数学基础--概率与统计13:连续随机变量的标准正态分布
  8. Java开发的本质 DOS界面的常用命令
  9. PPT连续放映(加背景音乐循环播放)
  10. 微信小程序如何返回上一页的左上角小房子的坑