FastDFS搭建分布式文件系统

1. 什么是分布式文件系统

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。

通俗来讲:

  • 传统文件系统管理的文件就存储在本机。
  • 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问

2. 什么是FastDFS

FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:

  • 文件存储
  • 文件同步
  • 文件访问(上传、下载)
  • 存取负载均衡
  • 在线扩容

适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。

3. FastDFS的架构

3.1 fast架构

FastDFS两个主要的角色:Tracker Server 和 Storage Server 。

  • Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽
  • Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
  • Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。
  • Tracker Cluster:跟踪服务 器的集群,有一组Tracker Server(跟踪服务器)组成。
  • Storage Cluster :存储集群,有多个Group组成。

3.2 上传和下载流程

上传

  1. Client通过Tracker server查找可用的Storage server。
  2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
  3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
  4. 上传完成,Storage server返回Client一个文件ID,文件上传结束。

下载

  1. Client通过Tracker server查找要下载文件所在的的Storage server。
  2. Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
  3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
  4. 下载文件成功。

4. FastDFS安装

注意:

安装过程中,下载的源码包,均放在 /usr/local/src

4.1 安装依赖

4.1.1 安装GCC依赖

FastDFS是C编写的,我们进行编译安装需要下载gcc:

yum -y install gcc-c++

4.1.2 安装libevent

FastDFS依赖libevent,需要安装:

yum -y install libevent

4.1.3 安装libfastcommon

libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。

下载地址: https://github.com/happyfish100/libfastcommon/releases 选择合适的版本

#切换到下载目录
cd /usr/local/src/
#下载(如果下载慢 可以将下载好的文件上传到此目录)
wget -O libfastcommon-1.0.39.tar.gz https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.39 
#解压
tar -zxvf libfastcommon-1.0.39.tar.gz
#进入目录
cd libfastcommon-1.0.39/
#编译安装
./make.sh 
./make.sh  install

注意:这里推荐下载依赖,然后上传到服务器。

到这里为止,所有依赖都已经安装完毕,接下来我们安装FastDFS:

4.2 安装FastDFS

下载地址:https://github.com/happyfish100/fastdfs/releases 选择合适的版本

#切换到下载目录
cd /usr/local/src/     
#下载(如果下载慢 可以将下载好的文件上传到此目录)
wget -O fastdfs-5.11.tar.gz https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.11
#解压
tar -zxvf fastdfs-5.11.tar.gz  
cd fastdfs-5.11/
#编译安装
./make.sh 
./make.sh  install

注意:

1)安装完成,我们应该能在/etc/init.d/目录,看到FastDFS提供的启动脚本:

  • fdfs_trackerd 是tracker启动脚本
  • fdfs_storaged 是storage启动脚本

2)我们可以在 /etc/fdfs目录,通过命令查看到以下配置文件模板:

  • tarcker.conf.sample 是tracker的配置文件模板
  • storage.conf.sample 是storage的配置文件模板
  • client.conf.sample 是客户端的配置文件模板

4.3 配置tracker

FastDFS的tracker和storage在刚刚的安装过程中,都已经被安装了,因此我们安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。

我们要启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。

  1. 进入 /etc/fdfs,复制 FastDFS 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf。

    cd /etc/fdfs/
    cp tracker.conf.sample tracker.conf
    vim tracker.conf
  2. 编辑tracker.conf ,标红的需要修改下,其它的默认即可。

    # 配置文件是否不生效,false 为生效
    disabled=false # 提供服务的端口
    port=22122 # Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
    base_path=/fastdfs/tracker # HTTP 服务端口 默认8080 ,建议修改 防止冲突
    http.server_port=9080
  3. 创建tracker基础数据目录,即base_path对应的目录

    mkdir -p /fastdfs/tracker
  4. 在防火墙中开启端口(默认22122),启动tracker

    初次成功启动,会在 /fdfsdfs/tracker/ (配置的base_path)下创建 data、logs 两个目录。

    我们可以使用 sh /etc/init.d/fdfs_trackerd 启动,不过安装过程中,fdfs已经被设置为系统服务,我们可以采用熟悉的服务启动方式:

    注意:

    此处必须先使用原始方式打开该服务

    /etc/init.d/fdfs_trackerd start

    接下来才可以使用以下方式:

    #启动服务
    systemctl start fdfs_trackerd.service
    #关闭服务
    systemctl stop fdfs_trackerd.service
    #开机自动启动
    systemctl enable fdfs_tracked.service
  5. 查看状态

    systemctl status fdfs_tracker
  6. tracker server目录及文件结构

    ${base_path}
    |__data
    | |__storage_groups.dat:存储分组信息
    | |__storage_servers.dat:存储服务器列表
    |__logs
    | |__trackerd.log: tracker server 日志文件

4.4 配置storage

  1. 进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf

    cd /etc/fdfs
    cp storage.conf.sample storage.conf
    vim storage.conf
  2. 编辑storage.conf

    # 配置文件是否不生效,false 为生效
    disabled=false  # 指定此 storage server 所在 组(卷)
    group_name=group1 # storage server 服务端口
    port=23000 # 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)
    heart_beat_interval=30 #Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成) (注 :这里不是上传的文件存放的地址,之前版本是的,在某个版本后更改了)
    base_path=/fastdfs/storage/base # 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
    store_path_count=1 # 逐一配置 store_path_count 个路径,索引号基于 0。
    #storage的上传文件存放路径 如果不配置 store_path0,那它就和 base_path 对应的路径一样。
    store_path0=/fastdfs/storage # tracker的地址,有多个 tracker server 时,每个 tracker server 写一行
    tracker_server=192.168.11.66:22122 # 访问端口 默认80 建议修改 防止冲突
    http.server_port=9888
  3. 创建Storage基础数据目录,对应base_path目录

    #对应base_path
    mkdir -p /fastdfs/storage/base #这是配置的store_path0路径,有多个要创建多个
    mkdir -p /fastdfs/storage/
  4. 在防火墙中开启端口(默认23000),启动tracker

    启动Storage前确保Tracker是启动的。初次启动成功,会在 /fastdfs/storage/base(base_path) 目录下创建 data、 logs 两个目录。

    注意:

    此处必须先使用原始方式打开该服务

    /etc/init.d/fdfs_storaged start

    接下来才可以使用以下方式:

    #启动方式
    systemctl start fdfs_storaged.service
    #开机自启
    systemctl enable fdfs_storaged.service
    #查看状态
    systemctl status fdfs_storaged.service
  5. Storage目录

    Storage 目录

    同 Tracker,Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息。

    在 store_path0/data 目录下,创建了N*N个子目录:

    [root@localhost ~]# ls /fastdfs/storage/data/
    00 05 0A 0F 14 19 1E 23 28 2D 32 37 3C 41 46 4B 50 55 5A 5F 64 69 6E 73 78 7D 82 87 8C 91 96 9B A0 A5 AA AF B4 B9 BE C3 C8 CD D2 D7 DC E1 E6 EB F0 F5 FA FF
    01 06 0B 10 15 1A 1F 24 29 2E 33 38 3D 42 47 4C 51 56 5B 60 65 6A 6F 74 79 7E 83 88 8D 92 97 9C A1 A6 AB B0 B5 BA BF C4 C9 CE D3 D8 DD E2 E7 EC F1 F6 FB
    02 07 0C 11 16 1B 20 25 2A 2F 34 39 3E 43 48 4D 52 57 5C 61 66 6B 70 75 7A 7F 84 89 8E 93 98 9D A2 A7 AC B1 B6 BB C0 C5 CA CF D4 D9 DE E3 E8 ED F2 F7 FC
    03 08 0D 12 17 1C 21 26 2B 30 35 3A 3F 44 49 4E 53 58 5D 62 67 6C 71 76 7B 80 85 8A 8F 94 99 9E A3 A8 AD B2 B7 BC C1 C6 CB D0 D5 DA DF E4 E9 EE F3 F8 FD
    04 09 0E 13 18 1D 22 27 2C 31 36 3B 40 45 4A 4F 54 59 5E 63 68 6D 72 77 7C 81 86 8B 90 95 9A 9F A4 A9 AE B3 B8 BD C2 C7 CC D1 D6 DB E0 E5 EA EF F4 F9 FE

5. 上传测试

  1. 修改Tracker服务器中的客户端文件

    cd /etc/fdfs
    cp client.conf.sample client.conf
    vim client.conf
  2. 修改如下配置即可,其它默认。

    # Client 的数据和日志目录
    base_path=/fastdfs/client # Tracker端口
    tracker_server=192.168.11.66:22122

    注意:

    此处只需配置tracker_server的ip、端口即可。因为client访问tracker服务,tracker服务返回给client一个storage的ip、端口。

  3. 创建client基础数据目录,对应base_path目录

    #对应base_path
    mkdir -p /fastdfs/client
  4. 在linux内部执行如下命令上传 namei.jpeg 图片

    /usr/bin/fdfs_upload_file /etc/fdfs/client.conf namei.jpeg

    上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

    返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

6. 安装配置Nginx,http访问文件

上面将文件上传成功了,但我们无法下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx模块也需要Nginx环境。

Nginx只需要安装到StorageSe rver所在的服务器即可,用于访问文件。安装Nginx详见博客:

linux中Nginx安装

6.1 配置nginx

vim /usr/local/nginx/conf/nginx.conf
#配置如下
server {
listen 8081;
server_name 192.168.11.66; location /group1/M00{
alias /fastdfs/storage/data/;
autoindex on; } error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

重启nginx

systemctl restart nginx.service

在浏览器访问之前上传的图片 http://192.168.11.66:8081/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

7. FastDFS配置nginx模块

7.1 fastdfs-nginx-module 模块说明

FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。

  假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。

  此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。

  而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。

7.2 下载fastdfs-nginx-module

#进入目录
cd /usr/local/src
#下载文件
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
#解压
unzip master.zip

注意:

下载方式可能随着时间失效,请查看最新下载方式。

7.3 配置nginx,添加fastdfs-nginx-module 模块

#停止nginx
systemctl stop nginx
#进入nginx源码目录
cd /usr/local/src/nginx-1.15.12/
#添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/src/fastdfs-nginx-module-master/src
#重新编译安装nginx
make
make install
#验证是否加载fastdfs-nginx-module模块是否 ,有如下部分表示成功
/usr/local/nginx/sbin/nginx -V

如下显示:

nginx version: nginx/1.15.12
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments: --add-module=/usr/local/src/fastdfs-nginx-module-master/src

复制 fastdfs-nginx-module 源码中的配置文件 mod_fastdfs.conf 到/etc/fdfs 目录, 并修改

cp /usr/local/src/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/

vim /etc/fdfs/mod_fastdfs.conf
#修改如下配置,其它默认 # 连接超时时间
connect_timeout=10 # Tracker Server
tracker_server=192.168.11.66:22122 # StorageServer 默认端口
storage_server_port=23000 # 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true # Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/fastdfs/storage

复制 FastDFS 的部分配置文件到/etc/fdfs 目录

cd /usr/local/src/fastdfs-6.03/conf
cp anti-steal.jpg http.conf mime.types /etc/fdfs/

配置nginx,修改nginx.conf

vim /usr/local/nginx/conf/nginx.conf
#修改配置,其它的默认
#在80端口下添加fastdfs-nginx模块
location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}

nginx的完整配置:

user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65; server { listen 80;
server_name 192.168.11.66; # location /group1/M00{
# alias /fastdfs/storage/data/;
# autoindex on;
#}
location ~/group[0-9]/ {
ngx_fastdfs_module;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

启动nginx

systemctl start nginx.service

在地址栏访问。

注意:

和之前直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。

参考博客:

https://blog.csdn.net/prcyang/article/details/89946190

FastDFS搭建分布式文件系统的更多相关文章

  1. 云存储?不依赖三方服务自己也可以搞,利用Docker来搭建分布式文件系统FastDfs

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_78 对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文 ...

  2. 从零搭建分布式文件系统MinIO比FastDFS要更合适

    前两天跟大家分享了一篇关于如何利用FastDFS组件来自建分布式文件系统的文章,有兴趣的朋友可以阅读下<用asp.net core结合fastdfs打造分布式文件存储系统>.通过留言发现大 ...

  3. Docker来搭建分布式文件系统FastDfs

    对于文件存储来说,一般情况下简单的处理就是在Django配置文件中配置存储目录,按照规则对文件进行上传或者下载. 实际上,当文件较少的时候,Django是可以应付的过来的.但当文件以海量形式出现的时候 ...

  4. IPFS搭建分布式文件系统 - 访问控制

    IPFS 一个内容可寻址.对等的超媒体分发协议. IPFS网络中的节点形成分布式文件系统. 为什么要用IPFS? “IPFS and the Blockchain are a perfect matc ...

  5. FastDFS轻量级分布式文件系统部署

    FastDFS介绍 FastDFS 是一个由 C 语言实现的开源轻量级分布式文件系统,作者余庆,支持 Linux.FreeBSD.AID 等 Unix 系统,解决了大数据存储和读写负载均衡等问题,适合 ...

  6. 基于Nginx+FastDFS搭建图片文件系统

    Nginx+fastdfs:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label0_1 缩略图:https://blog.csdn.net/ ...

  7. FastDFS+Nginx分布式文件系统部署安装

    安装: ##安装tracker.storage参考:http://www.cnblogs.com/zclzhao/p/5025229.html nginx代理设置参考:http://www.cnblo ...

  8. 分布式文件系统FastDFS

    fastdfs_百度百科https://baike.baidu.com/item/fastdfs/5609710 用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园http ...

  9. CentOS7搭建FastDFS V5.11分布式文件系统-第一篇

    1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...

随机推荐

  1. JavaScript中继承的实现方法--详解

    最近看<JavaScript王者归来>中关于实现继承的方法,做了一些小总结: JavaScript中要实现继承,其实就是实现三层含义:1.子类的实例可以共享父类的方法:2.子类可以覆盖父类 ...

  2. 使用Typescript重构axios(一)——写在最前面

    0.系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三)- ...

  3. Unicode字符串和非Unicode字符串

    什么是Unicode? Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每 ...

  4. SpringBoot 源码解析 (一)----- SpringBoot核心原理入门

    Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for building all Sp ...

  5. vue ui九宫格、底部导航、新闻列表、跨域访问

    一.  九宫格 九宫格:在mint-ui组件库基于vue框架 mui不是基于vue框架 只是css/js文件 (1)官方网站下载安装包 (2)copy css js fonts[字体图标] src/l ...

  6. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  7. 深入理解计算机系统 第二章 信息的表示和处理 Part2 第二遍

    <深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 29 ~ 34 页) 第一遍对应笔记链接 https://www.cnblogs.com/s ...

  8. Go语言Hello world(GOPATH和Go Module版)

    本文是「vangoleo的Go语言学习笔记」系列文章之一. 官网: http://www.vangoleo.com/go/go-hello-world-02/ 往期回顾: Go语言入门-你好,Go语言 ...

  9. ios input输入不了

    在项目中遇到了一个问题就是input输入框在安卓可以输入,而在ios输入不了 经过百度,调试发现,在ios中input默认是有user-select: none;属性把input输入框禁用了,将其删除 ...

  10. 暑假CV-QKD的相关论文单词集(第一弹)

    CV-QKD  连续变量-量子秘钥分发 Quadrature  正交 Photon     光子 Coherent    连续的,连贯的 Reconciliation   调解 Cryptograph ...