FastDFS分布式存储

一、Fast DFS概念及原理

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

1:Fast DFS原理

FastDFS是一个开源的轻量级分布式文件系统,纯C实现,目前提供了C、Java和PHP API。功能包括:文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

Fast DFS系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。client请求Tracker server 进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载,在底层存储上通过逻辑的分组概念,使得通过在同组内配置多个Storage,从而实现软RAID10。

2:FastDFS架构

(1)Tracker server

跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的Storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。

(2)Storage server

存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份。客户端上传的文件最终存储在storage服务器上,Storage server没有实现自己的文件系统,而是利用操作系统的文件系统来管理文件,可以将storage称为存储服务器。storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。

(3)Client

客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。如图所示。

 跟踪服务器和存储节点都可以由一台或多台服务器构成,跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对 等,可以根据服务器压力情况随时增加或减少。

3:文件的上传

 

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

上传的内部机制如下:

(1)选择tracker server

当集群中不止一个tracker server时,由于tracker之间是完全对等无状态的关系,当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

  • Round robin,所有的group间轮询
  • Specified group,指定某一个确定的group
  • Load balance,剩余存储空间多group优先

 (2)选择storage server

当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:

  • Round robin,在group内的所有storage间轮询
  • First server ordered by ip,按ip排序
  • First server ordered by priority,按优先级排序(优先级在storage上配置)

 (3)选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

  • Round robin,多个存储目录间轮询
  • 剩余存储空间最多的优先

(4)生成Fileid

选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

(5)生成文件名

当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

4:文件的下载

 跟upload file一样,在download file时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

(1)定位文件

客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

(1)组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。

(2)虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。

(3)数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

(4)文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

 

知道FastDFS FID的组成后,我们来看看FastDFS是如何通过这个精巧的FID定位到需要访问的文件:

  • 通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问
  • 存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件

 5:同步时间管理

当一个文件上传成功后,客户端马上发起对该文件下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢? 其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包括了本地同步时间(即,同步到的最新文件的时间戳)。而tracker根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步。同步信息上报如下图:

 

 

写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。 比如一个group内有A、B、C三个storage server,A向C同步到进度为T1 (T1以前写的文件都已经同步到B上了),B向C同步到时间戳为T2(T2 > T1),tracker接收到这些同步进度信息时,就会进行整理,将最小的那个做为C的同步时间戳,本例中T1即为C的同步时间戳为T1(即所有T1以前写的数据都已经同步到C上了);同理,根据上述规则,tracker会为A、B生成一个同步时间戳。

6:集成nginx

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

假设Tracker服务器将文件上传到了192.168.4.125,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件ID在192.168.4.126上取文件,就会出现文件无法访问的错误。


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

另外,使用nginx反向代理后,后端可以以HTTP请求的方式来访问文件资源。访问nginx反向代理+上传文件时的ID

二、Fast DFS的部署

1:部署环境

服务器:CentoS   Linux   release   7.9.2009(Core)

FastDFS 下载地址:https://github.com/happyfish100

(1)fastdfs

(2)libfastcommon

(3)fastdfs-nginx-module

(4)nginx-1.18.0

跟踪服务器1【主机】 (Tracker1):192.168.10.101

跟踪服务器2【备机】 (Tracker2): 192.168.10.102

存储服务器1(Storage1):192.168.10.103

存储服务器2(Storage2):192.168.10.104

代理服务器(nginx):192.168.10.105

2: 在所有节点安装如下组件(代理服务器除外)

(1)检查Linux 上是否安装了 gcc  libevent

[root@localhost   ~]#yum    -y   install    zlib-devel   gcc* libtool pcre-devel 

[root@localhost  ~]#yum  -y  install  libevent

(2)安装libfastcommon

[root@localhost   ~]#systemctl   stop  firewalld 

[root@localhost  ~]#setenforce  0

[root@localhost     ~]#tar     zxvf     libfastcommon-1.0.36.tar.gz

[root@localhost    ~]#cd    libfastcommon-1.0.36

 [root@localhost libfastcommon-1.0.36]#./make.sh # 编译

[root@localhost      libfastcommon-1.0.36]#./make.sh       install      # 安装 

(3)安装编译FASTDFS

[root@localhost   ~]#tar    zxvf   fastdfs-5.11.tar.gz 

[root@localhost   ~]#cd   fastdfs-5.11

[root@localhost                 fastdfs-5.11]#./make.sh

[root@localhost    fastdfs-5.11]#./make.sh    install

(4)检查文件与目录

服务脚本检查

[root@localhost ~]#ll /etc/init.d/

配置文件检查

 [root@localhost ~]#ll /etc/fdfs/

 3: 配置tracker 服务器(在101和102两个主机上执行)

(1)复制tracker 样例配置文件,并重命名

[root@localhost   ~]#cp   /etc/fdfs/tracker.conf.sample   /etc/fdfs/tracker.conf

(2)修改tracker 配置文件

[root@localhost ~]#vim /etc/fdfs/tracker.conf

修改的内容如下:

 disabled=false            #启用配置文件

 port=22122        #tracker     服务器端口(默认22122)

base_path=/fastdfs/tracker        #存储日志和数据的根目录

 store_group=group1        #设置存储组名称

(3)创建base_path 指定的目录

[root@localhost ~]#mkdir  -p  /fastdfs/tracker

(4)启动 tracker 服务器

[root@localhost         ~]#/etc/init.d/fdfs_trackerd          start

初次启动,会在/fastdfs/tracker     目录下生成logs 、data   两个目录。

检查FastDFS  Tracker  Server 是否启动成功:

[root@localhost    ~]#ps     -ef    I    grep    fdfs_trackerd

备注:

重启服务

fdfs_trackerd    /etc/fdfs/tracker.conf    restart     # 重启服务

4:  STORAGE 服务(在103和104主机上设置)

(1)复制storage 样例配置文件,并重命名

[root@localhost         ~]#cp          /etc/fdfs/storage.conf.sample         /etc/fdfs/storage.conf

(2)编辑配置文件

[root@localhost         ~]#vi         /etc/fdfs/storage.conf

#修改的内容如下:

disabled=false                                         #启用配置文件

port=23000                                             #storage 服务端口

base_path=/fastdfs/storage              #数据和日志文件存储根目录

store_path0=/fastdfs/storage           #第一个存储目录

tracker_server= 192.168.10.101:22122                     #tracker 服务器 IP 和端口

tracker_server= 192.168.10.102:22122                   #tracker 服务器 IP2  和端口

group_name=group1                                     #和tracker     中的组名保持一致

http.server_port=8888                               #http  访问文件的端口

(3)创建基础数据目录

[root@localhost ~]#mkdir  -p  /fastdfs/storage

(4)启动 storage 服务器,并检查进程

[root@localhost           ~]#/etc/init.d/fdfs_storaged           start

[root@localhost ~]#ps -ef I grep fdfs_storaged

备注:

重启用如下命令

fdfs_storaged        /etc/fdfs/storage.conf        restart

5:  client (在任意一个 Fastdfs 节点上配置)

[root@localhost ~]#cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

 [root@localhost ~]#mkdir -p /fastdfs/tracker

[root@localhost ~]#vim /etc/fdfs/client.conf

#修改以下配置,其它保持默认 base_path=/fastdfs/tracker

tracker_server= 192.168.10.101:22122                 #tracker        服务器 IP 和端口

tracker_server= 192.168.10.102:22122                  #tracker       服务器 IP2  和端口

6: 测试上传文件

[root@localhost   ~]#fdfs_upload_file   /etc/fdfs/client.conf   logo.jpg

备注:

上传时操作目录下必须有上传的文件或图片

7: 在所有storage 节点安装fastdfs-nginx-module  nginx

FastDFS 通过 Tracker   服务器,将文件放在 Storage   服务器存储,但是同组存储服务器之间需要 进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 storage01, 上传成功后文 件 ID 已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 storage02, 在  件还没有复制完成的情况下,客户端如果用这个文件 ID   storage02      上取文件,就会出现文件无法访 问的错误。而 fastdfs-nginx-module   可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module  在 nginx 安装时使用) storage 上的 nginx 是用于访问具体的文件,并且需要使用fastdfs 模块。

 (1)解压并修改fastdfs-nginx-module 的配置文件

[root@localhost ~]#tar zxvf fastdfs-nginx-module_v1.16.tar.gz

[root@localhost ~]#cd fastdfs-nginx-module/src

进入解压完的目录,到src   目录,修改config     文件,将文件路径中存在的local    删掉。

[root@localhost src]#vim config

ngx addon name=ngx http fastdfs moduleHTTP MODULES="$HTTP MODULEs ngx http fastdfs module"NGX ADDON SRCS="$NGX ADDON SRcS $nax addon dir/nax http fastdfs module.cCORE INCS="$CORE INCS/usr/include/fastdfs /usr/include/fastcommon/CORE LIBS="$CORE LIBS-L/usr/lib -lfastcommon lfdfsclient"CFLAGS="$CFLAGS -D FILE OFFSET BITS=64 -DFDFS OUTPUT CHUNK SIZE='256*1024'-DFDFS MOD CONF FIL

(2)编译安装nginx

[root@localhost  ~]#tar  zxvf  nginx-1.19.5.tar.gz 

[root@localhost ~]#useradd nginx

[root@localhost ~]#cd nginx-1.19.5

[root@localhost  nginx-1.19.5]#cp               /usr/include/fastcommon/*/usr/include/fastdfs/

 [root@localhost  nginx-1.19.5]#./configure  --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src/

注意:注意:这里的-add-module   后面的值就是刚刚拷贝的 fastdfs-nginx-module         的 sr c目 录

root@localhost         nginx-1.19.5]#make

[root@localhost nginx-1.19.5]#make install

[root@localhost    nginx-1.19.5]#In    -s    /usr/local/nginx/sbin/*/usr/local/sbin/

(3)配置FASTDFS

 fastdfs-nginx-module     模块下的 mod_fastdfs.conf     文件拷贝到/etc/fdfs/     目录

root@localhost ~]#cp /root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs / 

[root@localhost ~]#vim /etc/fdfs/mod_fastdfs.conf

找到下面的配置进行修改:

1 base_path=/tmp    用户存储日志的,将其改为/fastdfs/temp

2 tracker_server=tracker:22122            修改为当前服务器的ip  地址

3 group_name=groupname1   修改为之前storage    中同样的名字

4 url_have_group_name           =false 这个表示是否需要增加一个上述自定义名字的需要,改为true

修改参数如下:

connect_timeout=10 base_path=/tmp

tracker_server= 192.168.10.101:22122                      #tracker服务器 IP 和端口 

tracker_server= 192.168.10.102:22122                    #tracker 服务器 IP2  和端口 

url_have_group_name=true    #url中包含group 名称

group_name=group1

storage_server_port=23000 store_path_count=1

store_pathO=/fastdfs/storage

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

 [root@localhost   ~]#cp   /root/fastdfs-5.11/conf/http.conf   /etc/fdfs   

[root@localhost  ~]#cp  /root/fastdfs-5.11/conf/mime.types  /etc/fdfs 

(5)在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

root@localhost  ~]#ln  -s  /fastdfs/storage/data//fastdfs/storage/data/M00

( 6 )  NGINX

[root@localhost   ~]#cd   /usr/local/nginx/

修改nginx.conf 文件,在http 指令块中新增如下配置

[root@localhost  nginx]#vim  conf/nginx.conf

http  {

include           mime.typesg

default_type     application/octet-stream;

sendfile             on;

keepalive_timeout  65; server  {

listen          80;

server_name  localhost; location     /{

root      html;

index  index.html  index.htm;

}

location /group1/M00 { 

ngx_fastdfs_module;

}

}

}

[root@localhost   nginx]#mkdir   -p   /var/temp/nginx/client

[root@localhost   nginx]#fdfs_storaged   /etc/fdfs/storage.conf    restart

[root@localhost    nginx]#fdfs_trackerd     /etc/fdfs/tracker.conf    restart

[root@localhost       nginx]#/usr/local/nginx/sbin/nginx

8: 部署nginx 代理(在105主机上配置)

root@localhost  ~]#yum  -y   install  pcre-devel  zlib-devel  gcc*

 [root@localhost   ~]#tar   zxvf   nginx-1.19.5.tar.gz

[root@localhost  nginx-1.19.5]#useradd  nginx

[root@localhost      nginx-1.19.5]#./configure     --prefix=/usr/local/nginx      --user=nginx

--group=nginx

 [root@localhost  nginx-1.19.5]#make  &&make  install

[root@localhost    ~]#In     -s    /usr/local/nginx/sbin/nginx    /usr/local/sbin/ 

[root@localhost    ~]#vim    /usr/local/nginx/conf/nginx.conf 

http   {

include           mime.types;

default_type     application/octet-stream;

sendfile             on;

keepalive_timeout 65;

upstream storage_server_group1{

server 192.168.10.103:80 weight=10; server 192.168.10.104:80 weight=10;

}

server {

listen          80;

server_name localhost;

location    /{

proxy_pass    http://storage_server_group1;

}

}

}

最后在宿主机上面访问将ip改为105 的IP成功访问即部署成功

  • 28
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值