Bootstrap

FastDFS分布式存储

一、FastDFS 原理

1.基本概述     

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

2.FastDFS架构

(1)tracker  server

        跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的Storage server和group,每个storage在启动后会连接Tracker,告知自己所属group等信息,并保持周期性心跳。

(2) storage  server 

        存储服务器,主要提供容量和备份服务;以group为单位,每个group内部可以有多台storage server,数据互为备份。

(3)client

       客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。

 

 3.文件上传

 (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.文件的下载

 

(1)定位文件

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

  •  组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
  • 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
  • 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件
  • 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

(2)定位文件所在group

     通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问。

(3)定位文件所在位置

      存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

二、实验分析

1.环境要求

IP

192.168.10.101

Tracker  server

 libfastcommon,

fastdfs, fastdfs-nginx-module,

192.168.10.102

Tracker  server

libfastcommon,

fastdfs, fastdfs-nginx-module,

192.168.10.103

Storage  server

libfastcommon,

fastdfs, fastdfs-nginx-module,

 nginx-1.18.0

192.168.10.104

Storage  server

libfastcommon,

fastdfs, fastdfs-nginx-module,

 nginx-1.18.0

192.168.10.105

nginx反向代理

 nginx-1.18.0

 安装前的准备

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install gcc* zlib-devel libtool pcre-devel libevent

<安装libfastcommon-1.0.36>

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

[root@localhost libfastcommon-1.0.36]# ./make.sh    执行该脚本

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

[root@localhost libfastcommon-1.0.36]# cd /usr/lib64/

[root@localhost lib64]# cp libfastcommon.so /usr/lib


<安装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

 查看安装后的效果

[root@localhost ~]# ll /etc/fdfs/                   查看FastDFS的配置文件

[root@localhost ~]# ll /usr/bin/fdfs*               # 查看FastDFS相关的可执行程序

2.tracker  server  服务器端  101 ,102

[root@localhost ~]# cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
[root@localhost ~]# vim /etc/fdfs/tracker.conf
base_path=/fastdfs/tracker    修改
store_group=group1            修改,与storage配置文件相一致

[root@localhost ~]# mkdir -p /fastdfs/tracker           创建文件目录
[root@localhost ~]# /etc/init.d/fdfs_trackerd start             启动——启动成功
Reloading systemd:                                         [  确定  ]
Starting fdfs_trackerd (via systemctl):                    [  确定  ]
 

[root@localhost ~]# ps -ef | grep trackerd             进程号查询

3. Storage  server  103,104

[root@localhost ~]# cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
[root@localhost ~]# vim /etc/fdfs/storage.conf
disabled=false          启用
base_path=/fastdfs/storage                 #41行

tracker_server=192.168.10.101:22122          #119行
tracker_server=192.168.10.101:22122

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

[root@localhost ~]# /etc/init.d/fdfs_storaged start
Reloading systemd:                                         [  确定  ]
Starting fdfs_storaged (via systemctl):                    [  确定  ]
[root@localhost ~]# ps -ef | grep storaged
 

客户端上传文件测试

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

base_path=/fastdfs/tracker         #10
tracker_server=192.168.10.101:22122       #15
tracker_server=192.168.10.102:22122

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

方法一:

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf logo.jpg          上传logo.jpg图片
group1/M00/00/00/wKgKZ2aeJ46AHEpfAAFMnKMUrMI326.jpg

方法二:

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

 url: http://192.168.10.103/group1/M00/00/00/wKgKZ2aeKTmAXssfAAFMnKMUrMI345_big.jpg
 

安装<fastdfs-nginx-module_v1.16.tar.gz>

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

[root@localhost ~]# cd fastdfs-nginx-module
[root@localhost fastdfs-nginx-module]# ls
HISTORY  INSTALL  src
[root@localhost fastdfs-nginx-module]# cd src/
[root@localhost src]# ls
common.c  common.h  config  mod_fastdfs.conf  ngx_http_fastdfs_module.c
[root@localhost src]# vim config 
 

安装<nginx>

[root@localhost ~]# tar zxvf nginx-1.19.5.tar.gz 
[root@localhost nginx-1.19.5]# useradd -M -s /sbin/nologin nginx
[root@localhost nginx-1.19.5]# cd /usr/include/
[root@localhost include]# cd fastcommon/
[root@localhost include]# cp fastcommon/* fastdfs
[root@localhost ~]# cd nginx-1.19.5
[root@localhost nginx-1.19.5]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/fastdfs-nginx-module/src
[root@localhost nginx-1.19.5]#  make && make install
[root@localhost nginx-1.19.5]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.19.5]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost ~]# cp fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
[root@localhost ~]# vim /etc/fdfs/mod_fastdfs.conf 
tracker_server=192.168.10.101:22122      #40行
tracker_server=192.168.10.102:22122

url_have_group_name = true              #50行
 

store_path0=/fastdfs/storage           #64行
 

[root@localhost ~]# cd fastdfs-5.11
[root@localhost fastdfs-5.11]# ls
client  COPYING-3_0.txt  init.d   php_client  stop.sh  tracker
common  fastdfs.spec     INSTALL  README.md   storage
conf    HISTORY          make.sh  restart.sh  test
[root@localhost fastdfs-5.11]# cd conf/
[root@localhost conf]# ls
anti-steal.jpg  http.conf   storage.conf      tracker.conf
client.conf     mime.types  storage_ids.conf
[root@localhost conf]# cp http.conf mime.types /etc/fdfs
[root@localhost conf]# ln -s /fastdfs/storage/data/ //fastdfs/storage/data/M00

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

  location /group1/M00 {
            ngx_fastdfs_module;
}

[root@localhost conf]# nginx -s stop
ngx_http_fastdfs_set pid=7872
nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"
[root@localhost conf]# nginx
ngx_http_fastdfs_set pid=7873

测试:

 

安装<nginx>做反向代理105

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

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

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

cd nginx-1.19.5
useradd nginx

./configure --prefix=/usr/local/nginx --user=nginx --group=nginx

make && make install

[root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
 

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

http

upstream storage_server_group1 {
   server 192.168.10.103:80 weight=1;
   server 192.168.10.104:80 weight=1;
}

 

server

location / {
             proxy_pass http://storage_server_group1;

        }
[root@localhost ~]# nginx


测试

;