FastDFS搭建分布式文件系统

<h1 id="autoid-0-0-0">FastDFS搭建分布式文件系统</h1>

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 模块,可以重定向文件链接到源服务器取文件。

</div><!--end: topics 文章、评论容器-->
posted @ 2019-12-03 15:50  ylaoda  阅读(186)  评论(0编辑  收藏  举报