一步步带你用 FastDFS 搭建文件管理系统 详细的不得鸟

FastDFS概述

  • 开源地址:https://github.com/happyfish100

  • 余庆大佬用 c语言 编写的一款开源的分布式文件系统。

  • 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,注重高可用、高性能等指标

  • 冗余备份: 纵向扩容

  • 线性扩容: 横向扩容, 增加容量

  • 可以很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

  • 应用场景:

    • 文件上传 -> 存储
    • 文件下载
  • 冗余备份(通过文件内容生成key值,在上传同一个文件时,不会重复存储,这就省了很大的空间)

  • 负载均衡:
    浏览器访问服务器(192.168.110.11:8080),如果全校都访问这个网站的时候,就会很卡,怎么办? 多开几个端口(一个端口的负载能力有限),再访问的时候,指向不忙的端口(8081、8082)和集群有点像,
    负载就是请求的数量;均衡就是给你平均的分配,结合就是负载均衡。

  • 线性扩容:直接加配置文件,就可以多一个服务器的存在,早期如果想加服务器,就需要重复写相关代码,扩容非常方便。

FastDFS 中的三个角色

  • 追踪器 ( tracker ) -> 守护进程
    • 管理者
    • 第一个启动
  • 存储节点 ( storage ) -> 守护进程
    • 可以理解为网络环境中可以存储文件的主机
    • 存储文件
    • 第二个启动
  • 客户端 - client
    • 程序猿写的
    • 发起上传请求, 完成上传操作
    • 发起下载请求, 将服务器文件下载到本地
    • 最后启动, 是一个普通的应用程序

FastDFS 三个角色的关系

李培冠博客

  • 先启动追踪器
  • 启动存储节点
    • 主动连接追踪器, 汇报当前存储节点的状态信息
    • 后边定时汇报状态
  • 客户端程序启动, 连接追踪器, 发给上传请求
    • 客户端询问追踪, 看那个存储节点有足够的容量
    • 追踪查询存储节点信息
    • 将查到的节点信息发送给客户端
  • 客户端通过得到的存储节点地址, 连接存储节点
  • 将文件上传到存储节点上, 存储节点得到一个file_id, 并将其发送给客户端
  • 客户端需要存储这个fileID, 下载的时候要用

李培冠博客

  • 先启动追踪器
  • 启动存储节点
    • 主动连接追踪器, 汇报当前存储节点的状态信息
    • 后边定时汇报状态
  • 客户端程序启动, 连接追踪器, 发送下载请求
    • 客户端询问追踪, 看那个存储节点上有要下载的文件
    • 追踪查询存储节点信息
    • 将查到的节点地址发送给客户端
  • 客户端通过得到的存储节点地址, 连接存储节点
  • 将存储节点发送给客户端的文件, 保存到本地

FastDFS集群

李培冠博客

  • tracker集群
    • 为了避免单点故障
    • 工作方式: 轮询
    • 集群方式: 修改配置文件
  • 存储节点的集群
    • 存储节点的管理:
      • 是以组的方式来管理的
    • 横向扩容 -> 添加新的分组, fastDFS容量增加了
      • 不同组的主机之间不通信
      • 各组的容量相加就是整体容量
    • 纵向扩容 -> 在现有的组中添加新的主机, 和同组主机之间互为备份关系
      • 同组主机中存储的内容相同
      • 同组主机之间是通信的
      • 当前组的容量按照最小的主机来算

FastDFS 架构说明

举个例子:

小老板(客户端)想要存他的货,存货肯定是要把货存到仓库里面,但是不能让小老板自己去找仓库,因为那么多仓库,小老板不知道哪个可以用以及哪个有空闲可以存我的货。

所以,自己去找就很费时费力。况且,仓库是面向很多个小老板,这么多小老板如果每次都是自己去找仓库,就会很费时间。所以,安排一个仓库管理员,这个是干什么的呢? 小老板想存东西,找这个管理员,让管理员告诉小老板,哪个仓库可以用,然后小老板就去指定仓库存东西去了。

这个仓库管理员没事就去巡逻,挨个仓库走一遍看哪个仓库有空闲可以用,工作:定时的遍历去查询仓库,看这个仓库能用不能用(收集仓库的状态)。仓库才是真正存数据的地方。

小老板存完数据之后,仓库就会给他一个凭证,告诉他你的东西存在了哪个仓库,以后可以直接过来取。

线性扩容就是加仓库。

凭证:组名 虚拟磁盘路径(设置才有,不设置没有) 数据两级目录(文件路径) 文件名(通过加密防止文件名重复)

FastDFS 安装

安装 FastDFS 依赖包

1)下载 libfastcommon.zip

下载地址:https://github.com/happyfish100/libfastcommon/releases

2)解压缩 libfastcommon.zip

3)进入到 libfastcommon 的目录中

4)执行 ./make.sh

5)执行 sudo ./make.sh install

安装 FastDFS

1)下载 fastdfs.zip

下载地址:https://github.com/happyfish100/fastdfs/releases

2)解压缩 fastdfs.zip

3)进入到 fastdfs 的目录中

4)执行 ./make.sh

5)执行 sudo ./make.sh install

验证

ls -al /usr/bin/fdfs*

李培冠博客

配置跟踪服务器 tracker

1)拷贝文件

sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf

2)在 /home/conan/ 目录中创建目录 fastdfs/tracker

mkdir –p /home/conan/fastdfs/tracker

3)编辑 /etc/fdfs/tracker.conf 配置文件

sudo vim /etc/fdfs/tracker.conf

修改内容:

base_path=/home/conan/fastdfs/tracker

配置存储服务器storage

1)拷贝文件

sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf

2)在 /home/conan/fastdfs/ 目录中创建目录 storage

mkdir –p /home/conan/fastdfs/storage

3)编辑 /etc/fdfs/storage.conf 配置文件

sudo vim /etc/fdfs/storage.conf

修改内容:

base_path=/home/conan/fastdfs/storage
store_path0=/home/conan/fastdfs/storage
tracker_server=自己ubuntu虚拟机的ip地址:22122

启动tracker和storage

执行以下两条指令

sudo fdfs_trackerd /etc/fdfs/tracker.conf
sudo fdfs_storaged /etc/fdfs/storage.conf

测试是否安装成功

1)

sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

2)编辑 /etc/fdfs/client.conf 配置文件

sudo vim /etc/fdfs/client.conf

修改内容:

base_path=/home/conan/fastdfs/tracker
tracker_server=自己ubuntu虚拟机的ip地址:22122

3)上传文件测试

sudo fdfs_upload_file /etc/fdfs/client.conf 要上传的图片文件路径 

例如:

sudo fdfs_upload_file /etc/fdfs/client.conf /home/conan/1.jpg

如果返回类似 group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg 的文件 id 则说明文件上传成功。

安装 fastdfs-nginx-module

1)下载 nginx.tar.gz:http://nginx.org/en/download.html

2)解压缩 nginx.tar.gz

3)下载 fastdfs-nginx-module.zip:https://github.com/happyfish100/fastdfs-nginx-module/releases

4)解压缩 fastdfs-nginx-module.zip

5)下载库(更换阿里源)

首先你需要去更换阿里源,因为ubuntu自带的源没有这个库

怎么更换?我在 安装ubuntu系统 这一文章中有讲到,没有更换的可以去这里看一下:

更换完成之后,执行以下命令

sudo apt update
sudo apt install libpcre3 libpcre3-dev

如果没有下载这个的话,执行下面的命令会报错:

李培冠博客

6)进入解压的 nginx 目录中

执行

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=fastdfs-nginx-module解压后的目录的绝对路径/src

我这里是:

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=/home/conan/fastdfs/fastdfs-nginx-module-1.22/src

这时如果还报以下错误:

./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.

解决方案

1)找一个临时目录,下载命令:wget http://www.zlib.net/zlib-1.2.11.tar.gz

2)解压:zlib-1.2.11.tar.gz

3)进入 zlib-1.2.11 文件夹

cd zlib-1.2.11

4)安装

./configure
make
make install

安装完成,回到 nginx 目录中,再次执行

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=/home/conan/fastdfs/fastdfs-nginx-module-1.22/src

安装完成:

李培冠博客

如果安装过程中报以下错误:(错误原因是因为nginx编译的时候把警告当错误处理,事实上这个警告并不影响)

李培冠博客

解决方案

找到 nginx 目录下的 objs 目录下的 Makefile

sudo vim Makefile

删掉里面的 -Werror

李培冠博客

然后回到 nginx 目录中,再次执行:

sudo ./configure  --prefix=/usr/local/nginx/ --add-module=/home/conan/fastdfs/fastdfs-nginx-module-1.22/src

执行完上述命令之后,

执行:

sudo make

然后执行:

sudo make install

5)拷贝

sudo cp fastdfs-nginx-module解压后的目录中src下mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf

6)修改内容

sudo vim /etc/fdfs/mod_fastdfs.conf

修改对应内容为:

connect_timeout=10
base_path=/home/conan/fastdfs/tracker
tracker_server=自己ubuntu虚拟机的ip地址:22122
url_have_group_name=true
store_path0=/home/conan/fastdfs/storage

7)拷贝文件

sudo cp 解压缩的fastdfs目录中的conf中的 http.conf  /etc/fdfs/http.conf

也可以先进入到解压缩的 fastdfs 目录中的 conf

sudo cp http.conf /etc/fdfs/http.conf

8)拷贝文件

sudo cp 解压缩的fastdfs目录中的conf中的 mime.types /etc/fdfs/mime.types

也可以先进入到解压缩的 fastdfs 目录中的 conf

sudo cp mime.types /etc/fdfs/mime.types

nginx 配置

1)添加配置信息

sudo vim /usr/local/nginx/conf/nginx.conf

在 http 部分中添加配置信息如下:

server {
    listen       8888;  # nginx服务器端口     
    server_name  localhost;  # ip地址     
    location ~/group[0-9]/ {  # 组名     
        ngx_fastdfs_module;
        }
    error_page   500 502 503 504  /50x.html;  # 错误页面     
    location = /50x.html {
        root   html;
        }
    }

李培冠博客

启动 nginx

sudo  /usr/local/nginx/sbin/nginx

李培冠博客

我们之前上传过文件得到的一个凭证,复制那个凭证

如果没有保存,重新上传一个即可(重启系统需要重新启动tracker和storage

在浏览器中输入:

ip地址:8888/凭证

比如:

192.168.180.130:8888/group1/M00/00/00/wKi1gl7F7jmAJC73AAB66dOYt_o243.jpg

就可以看到图片啦

李培冠博客

李培冠博客

欢迎访问我的个人网站:

李培冠博客:lpgit.com

posted @ 2020-08-24 19:42  李培冠  阅读(10711)  评论(0编辑  收藏  举报