搭建部署FastDFS 分布式文件系统


什么是分布式文件系统

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

分布是文件系统的设计基于客户机/服务器模式

一个典型的网络可能包括多个供多用户访问的服务器

对等特性允许一些系统扮演客户机和服务的双重角色


衡量分布式文件系统的优劣

    数据的存储方式

    数据的读取速率

    数据安全机制


FastDFS介绍

FastDFS是一款开源分布式文件系统,它用纯C语言实现,支持Linux,FreeBSD, AIX 等UNIX系统

作者为淘宝网的余庆

功能包括:文件存储,文件同步,文件访问(文件上传,文件下载) 等

解决了大容量存储和负载均衡的问题


FastDFS基本概念

FastDFS服务端有两个角色:跟踪器 ( tracker ) 和存储节点 ( storage )

    — 跟踪器:主要做调度工作,在访问上起负载均衡的作用

    — 存储节点:完成文件管理的所有功能,即存储,同步和提供存储接口,同时对文件的元数据进行管理


FastDFS系统结构

8.jpg


跟踪器和存储节点都可以由一台多台服务器构成

跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务

跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或缩小


FastDFS 上传文件过程

client 询问 tracker 上传到的 storage ,不需要附加参数

tracker 返回一台可用的storage

client 直接和 storage 通讯完成文件上传


9.jpg



FastDFS下载文件过程

Client 询问tracker 下载文件的storage , 参数为文件标识( 卷名和文件名 )

tracker 返回一台可用的storage

client 直接和storage 通讯完成文件下载

10.jpg



搭建部署FastDFS 分布式文件系统


实验使用软件包:

    fastdfs-nginx-module_v1.16.tar.gz

    FastDFS_v4.06.tar.gz

    libevent-devel-1.4.13-4.el6.x86_64.rpm

    libevent-doc-1.4.13-4.el6.noarch.rpm

    libevent-headers-1.4.13-4.el6.noarch.rpm

    nginx-1.7.10.tar.gz


实验使用操作系统为:RHEL6


实验拓扑图


11.jpg

本案例 搭建一个简单的轮询FastDFS 分布式文件系统

只搭建一台跟踪器 俩台存储节点 为方便理解 

实际生产项目中可以使用更多 但具体操作步骤不变


操作流程:

    跟踪器 (tracker)    pc70  192.168.4.70

        配置主控服务器 

    存储节点 (storage)    pc71 192.168.4.71     pc72 192.168.4.72

            准备存储空间

            配置存储节点

            搭建nginx web服务器

     客户端 ( client )   192.168.4.254

            上传文件

            下载文件


操作步骤:

配置主控跟踪器服务器  pc70


    1) 安装依赖包

    # yum -y install gcc gcc-c++

    # rpm -q make

    make-3.81-20.el6.x86_64

    # yum -y install libevent

    # cd fastdfs/

    # ls libevent*

    libevent-devel-1.4.13-4.el6.x86_64.rpm  libevent-headers-1.4.13-4.el6.noarch.rpm

    libevent-doc-1.4.13-4.el6.noarch.rpm

    # yum -y install *.rpm

    

    2) 安装主包

    # tar -zxf FastDFS_v4.06.tar.gz 

    # cd FastDFS

    # ls

    client  conf             HISTORY  INSTALL  php_client  restart.sh  storage  tracker

    common  COPYING-3_0.txt  init.d   make.sh  README      stop.sh     test

    # ./make.sh 

    # ./make.sh install

    # ls /usr/local/bin///命令存放路径

    fdfs_appender_test   fdfs_delete_file    fdfs_storaged  fdfs_upload_appender

    fdfs_appender_test1  fdfs_download_file  fdfs_test      fdfs_upload_file

    fdfs_append_file     fdfs_file_info      fdfs_test1     restart.sh

    fdfs_crc32           fdfs_monitor        fdfs_trackerd  stop.sh

    # ls /etc/fdfs///配置文件存放路径

    client.conf  http.conf  mime.types  storage.conf  tracker.conf

    

    

    3) 修改配置文件tracker.conf

     # vim /etc/fdfs/tracker.conf

     22 base_path=/data/fastdfs//日志文件 数据 存放目录

    # mkdir -p /data/fastdfs                    // 创建数据存储目录

    # vim /etc/fdfs/tracker.conf 

     36 store_lookup=0                     //修改调到算法为轮询

     46 store_server=0

     51 store_path=0

     56 download_server=0

    

    182 use_storage_id = true//根据服务器的ID号时别

    186 storage_ids_filename = storage_ids.conf//存储主机编号文件

    

    4) 创建存储主机编号文件 storage_ids.conf

    //在源码目录下有 storage_ids.conf 文件模版

    # ls conf/storage_ids.conf 

    conf/storage_ids.conf

    # cp conf/storage_ids.conf /etc/fdfs/        //使用模版 创建 storage_id 文件

    # vim /etc/fdfs/storage_ids.conf                //编辑 storage_id 文件,加入存储组声明

    100001   group1  192.168.4.71

    100002   group1  192.168.4.72

    

    

配置存储节点 pc71   pc72


    1) 准备存储空间

    # fdisk -l /dev/vdb

    Disk /dev/vdb: 3221 MB, 3221225472 bytes

    16 heads, 63 sectors/track, 6241 cylinders

    Units = cylinders of 1008 * 512 = 516096 bytes

    Sector size (logical/physical): 512 bytes / 512 bytes

    I/O size (minimum/optimal): 512 bytes / 512 bytes

    Disk identifier: 0xaf03cc5f

    

       Device Boot      Start         End      Blocks   Id  System

    /dev/vdb1               1        6241     3145432+  83  Linux

    

    # mkdir -p /data/fastdfs/        //创建数据存储目录

    [root@pc71 ~]# blkid /dev/vdb1

    /dev/vdb1: UUID="e632a1df-60d5-47a6-825b-fc47ece05569" TYPE="ext4" 

    [root@pc71 ~]# vim /etc/fstab         //将准备的存储空间挂载到 数据存储目录上

    [root@pc71 ~]# tail -1 /etc/fstab

    UUID=e632a1df-60d5-47a6-825b-fc47ece05569 /data/fastdfs/ ext4defaults0 0

    

    [root@pc72 ~]# blkid /dev/vdb1

    /dev/vdb1: UUID="86acaaca-6c2c-4a41-8052-60038c41cc92" TYPE="ext4" 

    [root@pc72 ~]# vim /etc/fstab

    [root@pc72 ~]# tail -1 /etc/fstab

    UUID=86acaaca-6c2c-4a41-8052-60038c41cc92/data/fastdfs/ext4defaults0 0


    # mount -a

    # df -h | grep  /dev/vdb1

    /dev/vdb1             2.9G  4.5M  2.8G   1% /data/fastdfs

    

    2) 安装软件包

    # yum -y install gcc gcc-c++

    # rpm -q make

    make-3.81-20.el6.x86_64

    # yum -y install libevent

    # cd fastdfs/

    # ls libevent*

    libevent-devel-1.4.13-4.el6.x86_64.rpm  libevent-headers-1.4.13-4.el6.noarch.rpm

    libevent-doc-1.4.13-4.el6.noarch.rpm

    # yum -y install *.rpm

    # tar -zxf FastDFS_v4.06.tar.gz 

    # cd FastDFS

    # ./make.sh  && ./make.sh install

    # ls /usr/local/bin/

    fdfs_appender_test   fdfs_delete_file    fdfs_storaged  fdfs_upload_appender

    fdfs_appender_test1  fdfs_download_file  fdfs_test      fdfs_upload_file

    fdfs_append_file     fdfs_file_info      fdfs_test1     restart.sh

    fdfs_crc32           fdfs_monitor        fdfs_trackerd  stop.sh

    # ls /etc/fdfs/

    client.conf  http.conf  mime.types  storage.conf  tracker.conf

    

    3) 修改配置文件storage.conf

    # vim /etc/fdfs/storage.conf 

      7 group_name=group1//所属存储组

     37 base_path=/data/fastdfs//数据 和日志存储目录

    

     85 sync_start_time=00:00//同步数据的默认开始时间

     89 sync_end_time=23:59//同步数据的默认结束时间   实时推送

    

     96 store_path_count=1//存储路径的个数

    100 store_path0=/data/fastdfs//第一个存储路径

    109 tracker_server=192.168.4.70:22122//主存储服务器的ip 端口号

    

    140 file_distribute_path_mode=0//有多个存储路径时 数据存储路径的选择 0 轮询 

    145 file_distribute_rotate_count=100//当存储选择为轮询 当存储数据文件达到100时 轮询给下一个存储路径

    



启动服务


    1)启动主控跟踪器服务器  pc70 

    //进入 源码安装目录中

    # cp init.d/fdfs_trackerd /etc/init.d///拷贝启动脚本

    # chmod +x /etc/init.d/fdfs_trackerd 

    # chkconfig --add fdfs_trackerd

    # chkconfig fdfs_trackerd on

    # service fdfs_trackerd start

    Starting FastDFS tracker server: 

    # netstat -pantu | grep :22122

    tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      2393/fdfs_trackerd  


    2) 启动存储节点 pc71     pc72

    //进入 源码安装目录中

    # cp init.d/fdfs_storaged /etc/init.d/

    # chmod +x /etc/init.d/fdfs_storaged 

    # chkconfig --add fdfs_storaged

    # chkconfig fdfs_storaged on

    # service fdfs_storaged start

    会在存储路径 初始化256子文件夹 结束后 按回车继续

    

    storage 数据文件说明

    storage 为用户创建256个目录存放上传文件

    辅助文件的目录为 /data/fastdfs/data

    — .data_init_flag: 初始化信息

    — storage_stat.dat:统计信息

    — sync/binlog.### : 更新操作记录 ( 日志 )

    — sync/${id}.mark : 同步完成情况


    [root@pc71 ~]# netstat -pantu | grep :23000

    tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      3848/fdfs_storaged  

    tcp        0      0 192.168.4.71:35832          192.168.4.72:23000          ESTABLISHED 3848/fdfs_storaged  

    tcp        0      0 192.168.4.71:23000          192.168.4.72:35316          ESTABLISHED 3848/fdfs_storaged

    

    [root@pc72 ~]#  netstat -pantu | grep :23000

    tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      3301/fdfs_storaged  

    tcp        0      0 192.168.4.72:23000          192.168.4.71:35832          ESTABLISHED 3301/fdfs_storaged  

    tcp        0      0 192.168.4.72:35316          192.168.4.71:23000          ESTABLISHED 3301/fdfs_storaged  

    

    [root@pc70 ~]# netstat -pantu | grep :22122

    tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      2393/fdfs_trackerd  

    tcp        0      0 192.168.4.70:22122          192.168.4.72:56753          ESTABLISHED 2393/fdfs_trackerd  

    tcp        0      0 192.168.4.70:22122          192.168.4.71:34256          ESTABLISHED 2393/fdfs_trackerd  

    

    


客户端 访问主控服务器 验证配置

    1) 提供访问命令 : 上传文件命令 下载文件命令

    //客户端建立存放 提供访问命令文件目录

    # mkdir /root/bin

    

    //在主控服务器 pc70 山

    # ls /usr/local/bin/

    # cd /usr/local/bin/

    //将其下的 fdfs_test fdfs_upload_fil fdfs_download_file fdfs_delete_file  拷贝给客户端 /root/bin

    # scp fdfs_test fdfs_upload_fil fdfs_download_file fdfs_delete_file  192.168.4.254:/root/bin


     2) 编辑连接主控节点主机的配置文件 client.conf

    //客户端建立配置文件目录

    # mkdir /etc/fdfs/

    //靠拷贝主控服务器 

    # scp /etc/fdfs/client.conf 192.168.4.254:/etc/fdfs/

    //修改客户端 上的客户端配置文件

    # vim /etc/fdfs/client.conf 

     10 base_path=/data/fastdfs

     14 tracker_server=192.168.4.70:22122//指定主控服务节点的ip 和 端口

    //客户端创建 存放数据可日志文件目录

    # mkdir /data/fastdfs

    

    3) 客户端上传文件

    # head -3 /etc/passwd > user.txt 

    # fdfs_test /etc/fdfs/client.conf upload user.txt //显示访问详细过程

    This is FastDFS client test program v4.06

    

    Copyright (C) 2008, Happy Fish / YuQing

    

    FastDFS may be copied only under the terms of the GNU General

    Public License V3, which may be found in the FastDFS source kit.

    Please visit the FastDFS Home Page http://www.csource.org/ 

    for more detail.

    

    [2018-01-16 14:30:14] DEBUG - base_path=/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0

    

    tracker_query_storage_store_list_without_group: 

    server 1. group_name=, ip_addr=192.168.4.71, port=23000

    server 2. group_name=, ip_addr=192.168.4.72, port=23000

    

    group_name=group1, ip_addr=192.168.4.71, port=23000

    storage_upload_by_filename

    group_name=group1, remote_filename=M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287.txt

    source ip address: 192.168.4.71

    file timestamp=2018-01-16 06:30:13

    file size=105

    file crc32=3908252234

    file url: http://192.168.4.70:8080/group1/M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287.txt

    storage_upload_slave_by_filename

    group_name=group1, remote_filename=M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287_big.txt

    source ip address: 192.168.4.71

    file timestamp=2018-01-16 06:30:13

    file size=105

    file crc32=3908252234

    file url: http://192.168.4.70:8080/group1/M00/00/00/wKgER1pdK3WABIFgAAAAaejzMko287_big.txt

    

    [root@pc71 ~]# ls /data/fastdfs/data/00/00/              //查看存储结果

    wKgER1pdK3WABIFgAAAAaejzMko287_big.txt

    wKgER1pdK3WABIFgAAAAaejzMko287_big.txt-m

    wKgER1pdK3WABIFgAAAAaejzMko287.txt

    wKgER1pdK3WABIFgAAAAaejzMko287.txt-m

    //因为时实时推送数据文件 所有在 pc72 上也会存在

    [root@pc72 ~]# ls /data/fastdfs/data/00/00/

    wKgER1pdK3WABIFgAAAAaejzMko287_big.txt

    wKgER1pdK3WABIFgAAAAaejzMko287_big.txt-m

    wKgER1pdK3WABIFgAAAAaejzMko287.txt

    wKgER1pdK3WABIFgAAAAaejzMko287.txt-m

    

    

    # fdfs_upload_file /etc/fdfs/client.conf 1.jpg //上传图片文件 不显示访问过程

    group1/M00/00/00/wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg

    

    [root@pc71 ~]# ls /data/fastdfs/data/00/00/         //查看存储结果

    ...

    wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg

    

    [root@pc72 ~]# ls /data/fastdfs/data/00/00/

    ...

    wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg

    

    4) 下载文件 

    // 下载文件 将其命名为test.jpg

    # fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg test.jpg

    # ls test.jpg 

    test.jpg


    5) 删除文件

    # fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgESFpdLzOAUmpNAAB_2jHRplo230.jpg 



配置Web访问 pc71  pc72


    1) 安装提供nginx 软件包

    fastdfs-nginx-module_v1.16.tar.gz 

    nginx-1.7.10.tar.gz 

    在pc71 和 pc72 

    # tar -zxf fastdfs-nginx-module_v1.16.tar.gz 

    # tar -zxf nginx-1.7.10.tar.gz 

    # useradd nginx

    # yum -y install pcre-devel

    # yum -y install zlib-devel

    # cd nginx-1.7.10

    # ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=../fastdfs-nginx-module/src/

    # make

    # make install

    # ls /usr/local/nginx/

    conf  html  logs  sbin


    2) 修改配置文件

    # vim /usr/local/nginx/conf/nginx.conf

    

     43         location / {

     44             #root   html;

     45             #index  index.html index.htm;

     46             ngx_fastdfs_module;   //引入模块文件

     47         }

    //拷贝模块配置文件 到配置文件目录

    # cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

    

    # vim /etc/fdfs/mod_fastdfs.conf 

     40 tracker_server=192.168.4.70:22122//指定主控服务器的IP 和端口

     44 storage_server_port=23000//存储节点监听端口

     47 group_name=group1//当前所在存储组

    

     53 url_have_group_name = true

     57 store_path_count=1

     62 store_path0=/data/fastdfs

    

    # /etc/init.d/fdfs_storaged restart//重启存储服务

    

    3)启动nginx 

    # /usr/local/nginx/sbin/nginx 

    # netstat -pantu | grep nginx

    

        具体访问过程

        客户端访问 80 ---> nginx ---> nginx.conf --->模块 ---> 配置文件 ---> 主控服务的IP地址  ---> 主控服务器分配


    4) 客户端访问测试

    上传文件

    # fdfs_upload_file /etc/fdfs/client.conf test.jpg 

    group1/M00/00/00/wKgER1pdQ0iASS_fAAB_2jHRplo601.jpg

    //在浏览器访问 就会看见图片内容

    # google-chrome http://192.168.4.71/group1/M00/00/00/wKgER1pdQ0iASS_fAAB_2jHRplo601.jpg

    # google-chrome http://192.168.4.72/group1/M00/00/00/wKgER1pdQ0iASS_fAAB_2jHRplo601.jpg

    


在上述实验的基础上做相关的调整实现下面的实验

搭建扩展存储服务器



实验拓扑图

12.jpg


操作流程:

    跟踪器 (tracker)    pc70  192.168.4.70

        配置主控服务器 

    存储节点 (storage)    pc71 192.168.4.71     pc72 192.168.4.72    

                                     pc73 192.168.4.73     pc74 192.168.4.74

            准备存储空间

            配置存储节点

            搭建nginx web服务器

     客户端 ( client )   192.168.4.254

            上传文件

            下载文件


操作步骤:

    使用上述实验继续实验

        具体步骤不详细介绍 只说明与上述文件不同之处和注意之处   

    

配置主控跟踪器服务器  pc70

    在之前配置的pc 70 上

    修改存储主机编号文件 storage_ids.conf

    # vim /etc/fdfs/storage_ids.conf 

    100001   group1  192.168.4.71

    100002   group1  192.168.4.72

    100003   group2  192.168.4.73

    100004   group2  192.168.4.74


配置存储节点 pc73   pc74

   1) 准备存储空间

    2) 安装软件包

    3) 修改配置文件storage.conf

     # vim /etc/fdfs/storage.conf      //配置文件中只有声明组与上述不同 其于均相同 

      7 group_name=group2//所属存储组


配置Web访问 pc71  pc72

        1) 安装提供nginx 软件包

        2) 修改配置文件

        # vim /etc/fdfs/mod_fastdfs.conf         //模版配置文件中只有声明组与上述不同 其于均相同 

             47 group_name=group1//当前所在存储组

        3) 启动nginx 


启动服务    

       1) pc70  需要重新启动服务

           2) 启动存储节点 pc71     pc72

            [root@pc70 ~]# netstat -utnalp  | grep 22122

            tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      4875/fdfs_trackerd  

            tcp        0      0 192.168.4.70:22122          192.168.4.72:57119          ESTABLISHED 4875/fdfs_trackerd  

            tcp        0      0 192.168.4.70:22122          192.168.4.71:34335          ESTABLISHED 4875/fdfs_trackerd  

            tcp        0      0 192.168.4.70:22122          192.168.4.74:45914          ESTABLISHED 4875/fdfs_trackerd  

            tcp        0      0 192.168.4.70:22122          192.168.4.73:45099          ESTABLISHED 4875/fdfs_trackerd  

            [root@pc73 ~]# netstat -pantu | grep 23000

            tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      8496/fdfs_storaged  

            tcp        0      0 192.168.4.73:23000          192.168.4.74:38378          ESTABLISHED 8496/fdfs_storaged  

            tcp        0      0 192.168.4.73:51322          192.168.4.74:23000          ESTABLISHED 8496/fdfs_storaged  

            

            [root@pc74 ~]# netstat -pantu | grep 23000

            tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      7905/fdfs_storaged  

            tcp        0      0 192.168.4.74:23000          192.168.4.73:51322          ESTABLISHED 7905/fdfs_storaged  

            tcp        0      0 192.168.4.74:38378          192.168.4.73:23000          ESTABLISHED 7905/fdfs_storaged  


客户端测试    

         //会发现 group1 和 group2 已经实现轮询存储

        # fdfs_upload_file  /etc/fdfs/client.conf  1.jpg 

        group1/M00/00/00/wKgER1pdbEaAUfkvAAB_2jHRplo065.jpg

        # fdfs_upload_file  /etc/fdfs/client.conf  1.jpg 

        group2/M00/00/00/wKgESVpdbEeANZeWAAB_2jHRplo990.jpg

        # fdfs_upload_file  /etc/fdfs/client.conf  test.jpg 

        group1/M00/00/00/wKgESFpdbE2AVXMfAAB_2jHRplo700.jpg

        # fdfs_upload_file  /etc/fdfs/client.conf  test.jpg 

        group2/M00/00/00/wKgESlpdbFCAet_vAAB_2jHRplo946.jpg

        

     //在浏览器访问 就会看见图片内容

    # google-chrome http://192.168.4.71/group1/M00/00/00/wKgER1pdbEaAUfkvAAB_2jHRplo065.jpg

    # google-chrome http://192.168.4.74/group2/M00/00/00/wKgESlpdbFCAet_vAAB_2jHRplo946.jpg