• FastDFS——从入门到入土(上)


    初识FastDFS

    FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件为载体的在线服务,如相册网站、视频网站等等

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

    随着文件数据越来越多,通过 Tomcat 或 Nginx 上的动静态资源文件在单一的服务节点中是存不下的

    如果使用多节点来存储的话这会大大增加我们的运维成本,不利于管理和维护

    所以我们需要一个解决方案,能够通过一个系统来管理多个节点上的文件数据,分布式文件系统应运而生

    特点

    分布式文件系统允许文件通过网络存储在多台节点上,多台存储节点组成一个整体,为更多用户提供文件分享和存储空间等功能

    虽然是一个分布式文件系统,但对用户是透明的,用户在使用的时候就像在访问本地文件系统一样

    分布式分布式,那说明肯定不止一个节点,所以分布式文件系统可以提供冗余备份,容错能力很高,就算系统中有节点宕机,整体还是能够对外提供服务的

    除此之外,分布式文件系统还可以实现负载均衡,用户读取某一文件的时候可以由多个节点共同提供,而且还可以通过横向扩展来保证性能提升与分担负载

    • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
    • 支持相同内容的文件只保存一份,节约磁盘空间
    • 下载文件支持HTTP协议,可以使用内置Web Server(5.0之后废弃),也可以和其他Web Server配合使用(nginx)
    • 支持在线扩容
    • 支持主从文件
    • 存储服务器上可以保存文件属性(meta-data)
    • V2.0网络通信采用libevent,支持大并发访问,整体性能好

    官方网站:https://github.com/happyfish100/
    配置文档:https://github.com/happyfish100/fastdfs/wiki/

    2.架构

    在这里插入图片描述

    • 跟踪服务器(tracker server)

    tracker server 主要负责调度服务,提供负载均衡
    tracker server 将集群中所有存储组和 storage server 的状态信息等存放在内存中
    tracker server 是 client 和 storage server 交互的枢纽
    storage serve 在启动后会自动连接 tracker,告知自己的 group 信息并保持周期性的心跳,tracker根据 storage 的心跳信息,建立 group==>[storage server list] 的映射表

    • 存储服务器(storage server)

    storage 上存储了文件的元文件的信息,它直接利用 OS 的文件系统来调用或管理文件

    storage 以组或卷(group或volume)来作为单位,一个 group 内包含多台storage ,数据互相备份

    利用 group 可以实现数据隔离、负载均衡、应用隔离等功能

    数据隔离:将不同应用的数据放在不同 group 下
    负载均衡:根据应用的访问特性来将应用数据分配到不同 group 下来做负载均衡

    group 内的每台 storage 都依赖于本地文件系统,storage 可以配置多个存储目录,当收到写请求时,会根据配置好的规则来选择其中一个存储目录来存储文件

    为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级265个,总共65535个文件。新写的文件会以hash的方式路由到某个子目录下。然后将文件数据直接作为一个本地文件存储到该目录中

    • 客户端(client)

    作为业务请求发起方,通过专门接口,使用TCP/IP协议与tracker server或者storage server进行数据交互

    FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用

    Tracker集群
    FastDFS集群中的Tracker server可以有多台,Tracker server之间是相互平等关系,同时提供服务

    Trackerserver不存在单点故障。客户端请求Trackerserver采用轮询方式,如果请求的tracker无法提供服务则换另一个tracker

    Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息

    Storage集群
    为了支持大容量,storage server采用了分组的形式。存储系统由一个或多个group组成,group之间的文件是相互独立的,所有group内的文件容量累加就是整个存储系统中的文件容量

    一个group内包含一台或多台storage server,group内的storage是平等关系,不同group内的storage不会相互通信,同group内的storage之间会相互连接进行文件同步,从而保证同group内的每个storage上的文件完全一致

    在group中添加 storage时,系统会自动同步已有的文件系统,同步完成后,系统自动将新增storage到线上提供服务。当存储空间不足或者即将耗尽时,可以动态添加group。只需要增加一台或多台storage并将它们配置到同一个group内就行

    FastDFS初始化过程

    在这里插入图片描述

    FastDFS文件操作

    1.上传

    FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用

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

    分配好storage后,将客户端请求分发到指定storage上,storage会为文件分配一个数据存储目录然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件,Storage将文件写入磁盘后,会返回路径信息给客户端,客户端就可以根据这个路径信息找到上传的文件

    在这里插入图片描述

    2.下载

    Storage会定时的向Tracker安装发送心跳,告诉Tracker自己还还活着,这样Fastdfs就可以工作了

    客户端发送下载请求到Tracker上,Tracker查找到存储的Storage地址后返回给客户端

    客户端拿到Storage地址后,去Storage上找到文件

    Storage把文件返回给客户端

    group1/M00/02/44/Swtdssdsdfsdf.txt
    
    1.通过组名tracker能够很快的定位到客户端需要访问的存储服务器组是group1,并选择合适的storage提供客户端访问。
    2.storage根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    拓展模块

    在大多数业务场景中,往往需要为FastDFS存储的文件提供http下载服务,而尽管FastDFS在其storage及tracker都内置了http服务, 但性能表现却不尽如人意;

    作者余庆在后来的版本中增加了基于当前主流web服务器(nginx/apache)的扩展模块,其用意在于利用web服务器直接对本机storage数据文件提供http服务,以提高文件下载的性能

    在这里插入图片描述
    在每一台storage服务器主机上部署Nginx及FastDFS扩展模块,由Nginx模块对storage存储的文件提供http下载服务, 仅当当前storage节点找不到文件时会向源storage主机发起redirect或proxy动作

    例如:文件上传至节点A,但是通过负载均衡之后,访问了节点B,则不能访问文件,所以会出现时而能访问时而不能访问的结果,而FastDFS扩展模块就可以解决这个问题,它会发起重定向或者代理的动作

    文件下载过程
    在这里插入图片描述

    单机部署

    单机:192.168.149.131
    注:一定要先启动Tracker,在启动Storage

    包目录:/usr/local/

    需要安装的包

    1.libfatscommon:FastDFS分离出的一些公用函数包
    2.FastDFS:FastDFS本体
    3.fastdfs-nginx-module:FastDFS和nginx的关联模块
    4.nginx:发布访问服务
    
    • 1
    • 2
    • 3
    • 4
    • 安装编译环境
    yum -y install gcc pcre-devel  zlib-devel openssl-devel libxml2-devel \
    libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel \
    perl-devel  perl-ExtUtils-Embed git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel
    
    • 1
    • 2
    • 3
    • 安装相关包
    #创建包目录
    mkdir /usr/local/fastdfs
    cd /usr/local/fastdfs
    
    • 1
    • 2
    • 3
    wget --no-check-certificate https://github.com/happyfish100/libfastcommon/archive/refs/heads/master.zip -O libfastcommon-master.zip
    
    wget --no-check-certificate https://github.com/happyfish100/fastdfs/archive/refs/heads/master.zip -O fastdfs.zip
    
    wget --no-check-certificate https://github.com/happyfish100/fastdfs-nginx-module/archive/refs/heads/master.zip -O fastdfs-nginx-module.zip
    
    unzip libfastcommon-master.zip
    unzip fastdfs.zip
    unzip fastdfs-nginx-module.zip
    
    rm -rf *.zip
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 编译安装
    cd /usr/local/fastdfs/libfastcommon-master && sh make.sh clean && sh make.sh && sh make.sh install
    
    cd /usr/local/fastdfs/fastdfs-master && sh make.sh clean && sh make.sh && sh make.sh install
    
    cd /usr/local/fastdfs/fastdfs-master && sh setup.sh /etc/fdfs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 配置文件更新
    cp -r -a /usr/local/fastdfs/fastdfs-master/conf/* /etc/fdfs
    
    cp -r -a /usr/local/fastdfs/fastdfs-master/systemd/* /usr/lib/systemd/system
    
    • 1
    • 2
    • 3
    • tracker和storage配置
    #创建工作目录
    mkdir /opt/fdfs/{tracker,storage,client} -pv && mkdir /opt/fdfs/storage/data
    
    • 1
    • 2
    #切换目录
    cd /etc/fdfs/
    
    ##tracker文件配置和修改启动服务配置
    cp tracker.conf tracker.conf.bak
    vim tracker.conf
    base_path = /opt/fdfs/tracker
    
    vim /usr/lib/systemd/system/fdfs_trackerd.service
    PIDFile=/opt/fdfs/tracker/data/fdfs_trackerd.pid
    
    ##storage文件配置和修改启动服务配置
    cp storage.conf storage.conf.bak
    vim storage.conf
    group_name =group1
    base_path = /opt/fdfs/storage
    store_path0 = /opt/fdfs/storage/data
    tracker_server =192.168.149.131:22122
    http.server_port =8888
    
    vim /usr/lib/systemd/system/fdfs_storaged.service
    PIDFile=/opt/fdfs/storage/data/fdfs_storaged.pid
    
    #client配置
    cp client.conf client.conf.bak
    vim client.conf
    base_path = /opt/fdfs/client
    tracker_server =192.168.149.131:22122
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    #重新加载启动服务
    systemctl daemon-reload
    
    #启动服务
    systemctl start fdfs_trackerd
    systemctl start fdfs_storaged
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    # 建立fdfs快捷命令
    alias fdfs_delete_file='fdfs_delete_file /etc/fdfs/client.conf'
    alias fdfs_download_file='fdfs_download_file /etc/fdfs/client.conf'
    alias fdfs_file_info='fdfs_file_info /etc/fdfs/client.conf'
    alias fdfs_monitor='fdfs_monitor /etc/fdfs/client.conf'
    alias fdfs_upload_file='fdfs_upload_file /etc/fdfs/client.conf'
    alias fdfs_test='fdfs_test /etc/fdfs/client.conf'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 验证
    fdfs_upload_file 1.jpg
    group1/M00/00/00/wKiVg2L8Uq6AO3LzAADZ-GROavg913.jpg
    
    • 1
    • 2

    1.Nginx外部访问

    fastdfs 安装好以后是无法通过 http 访问的,这个时候就需要借助 Nginx 了,所以需要安装 fastdfs 的第三方模块到 Nginx 中,就能使用了

    • 安装Nginx
    cd /usr/local/
    wget http://nginx.org/download/nginx-1.15.4.tar.gz
    tar -zxvf nginx-1.15.4.tar.gz
    
    #编译安装,添加FastDFS模块--add-module=/usr/local/fastdfs/fastdfs-nginx-module-master/src
    cd nginx-1.15.4/
    
    ./configure --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-stream_ssl_preread_module --with-compat --with-pcre-jit --add-module=/usr/local/fastdfs/fastdfs-nginx-module-master/src
    
    make
    
    make install
    
    cd ..
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 修改配置文件
    cp nginx-1.15.4/conf/nginx.conf nginx-1.15.4/conf/nginx.conf.bak
    
    vim nginx-1.15.4/conf/nginx.conf
    worker_processes  1;
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    	log_format  main '$remote_addr - $remote_user [$time_local] "$request" '                                                     
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for" "$upstream_addr"';
        sendfile        on;
    
        keepalive_timeout  65;
        server {
            listen       8080;
            server_name  localhost;
            
           location ~/group([0-9])/M00 {
                ngx_fastdfs_module;
            }
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    }   
    #转移
    cp nginx-1.15.4/conf/nginx.conf /usr/local/nginx/conf/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    Nginx Fastdfs模块配置

    cp /usr/local/fastdfs/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/
    
    #备份文件
    cp /etc/fdfs/mod_fastdfs.conf /etc/fdfs/mod_fastdfs.conf.bak
    
    vim /etc/fdfs/mod_fastdfs.conf
    tracker_server =192.168.149.131:22122
    url_have_group_name =true
    store_path0=/opt/fdfs/storage/data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    由于Nginx是编译安装,我们还需要为它注册服务

    #注册nginx服务
    vim /usr/lib/systemd/system/nginx.service
    [Unit]
    Description=The nginx HTTP and reverse proxy server
    After=network-online.target remote-fs.target nss-lookup.target
    Wants=network-online.target
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    KillSignal=SIGQUIT
    TimeoutStopSec=5
    KillMode=process
    PrivateTmp=true
    
    #重启生效一下
    systemctl daemon-reload 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    将 /usr/local/nginx/conf/ 软连接到/etc/nginx (方便我们配置)

    ln -s /usr/local/nginx/conf/ /etc/nginx
    
    • 1

    启动 Nginx

    systemctl start nginx
    
    • 1

    验证一下
    在这里插入图片描述

  • 相关阅读:
    MQTT 持久会话与 Clean Session 详解
    【JS题解】牛客网JS篇1-10题
    QT定时器简单应用
    分布式.幂等性
    集合_Collection_LinkedList简述及增删机制源码简析
    Linux json-c使用
    计算点云每个点的局部点云最大高度差值(附open3d python代码)
    声纹技术(一):声纹技术的前世今生
    结构体内存对齐
    你还不会用数据库吗?一篇文章带你入门!!!#sql #Mysql
  • 原文地址:https://blog.csdn.net/s_alted/article/details/126544077