1、 Fastdfs介绍
Fastdfs是用c语言编写的一个开源的轻量级分布式文件系统,它对文件进程管理,功能包括: 文件存储,文件同步,文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,特别适合以文件为载体的在线服务,如相册网站,视频网站等等
Fastdfs为互联网量身定制,充分考虑了冗余备份,负载均衡,线性扩容等,并注重高可用,高性能等指标,使用fastdfs很容易搭建一套高性能的文件服务器集群提供文件上传、下载服务
2、Fastdfs架构
Fastdfs架构包括Tracker server和Storage server
客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由 Storage server完成文件上传和下载
Tracker server作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server 提供文件上传服务,可以讲tracker成为追踪服务器或调度服务器
Storage server作为是文件存储,客户端上传的文件最终存储在storage服务器上,Storage server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件,可以讲storage成为存储服务器
Fastdfs架构_第1张图片

3、FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
• Tracker Server: 跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
• Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。
• Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
4、Fastdfs原理
关于模块:跟踪服务器和存储节点都可以由一台或多台服务器构成,跟踪服务器和存储节点均可以随时增加或者下线不会影响线上服务,其中跟踪服务器中所有服务器是对 等,可以根据服务器压力情况随时增加或减少
5、文件上传流程
Storage server会连接集群中所有的Tracker server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
关于上传
Fastdfs架构_第2张图片**
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
n 组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
n 虚拟磁盘路径:*storage配置的虚拟路径,与磁盘选项store_path对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
n 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
n 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。


Fastdfs架构_第3张图片

client发送download请求给某个tracker,必须带上文件名信息,tracker从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求,由于group内的文件同步时在后台是异步的,所以有可能出现在读的时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage
文件创建时间戳-storage被同步到的时间戳 且(当前时间-文件创建时间戳)>文件同步最大时间(5分钟),说明文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了

6、安装Fastdfs
192.168.1.10 nginx proxy
192.168.1.20 tracker server1
192.168.1.30 tracker server2
192.168.1.40 storage server group1
192.168.1.50 storage server group2
数据存储位置/storage/fastdfs

一.部署安装traker server

Fastdfs架构
1.安装编译环境,安装libfastcommon和fastdfs(所有节点)
Libfastcommon 包含了fastdfs运行所需的要的一些基础库

   17  mkdir /storage/fastdfs -p     (创建数据存储位置)
   20  tar zxf libfastcommon.tar.gz   (解压lib)
   21  cd libfastcommon/
   22  ./make.sh  && ./make.sh  install  (编译安装lib)
   23  cd
   24  tar zxf fastdfs.tar.gz     (解压fas)
   25  cd fastdfs/ 
   26  ./make.sh  && ./make.sh  install  (编译安装 fastdfs)
   27  ls /etc/init.d/  

Fastdfs架构

  28  cp conf/mime.types  conf/http.conf  /etc/fdfs/
(复制nginx拓展文件到fdfs)

2.第一台编写一个脚本 (方便部署traker)

vim  install-fastdfs.sh
#!/bin/bash
mkdir /storage/fastdfs -p
cd /root
tar zxf libfastcommon.tar.gz  
tar zxf fastdfs.tar.gz  
cd /root/libfastcommon/
./make.sh  && ./make.sh  install
cd /root/fastdfs/
./make.sh  && ./make.sh  install
cd /root/fastdfs/
cp conf/mime.types  conf/http.conf  /etc/fdfs/
ls /etc/fdfs
#/etc/fdfs/ 配置文件路径

3.把脚本和软件包复制到其他四台主机
scp root fastdfs.tar.gz libfastcommon.tar.gz install-fastdfs.sh [email protected]:/root
4.四台执行一下脚本,查看一下脚本是否执行成功
sh install-fastdfs.sh
Fastdfs架构

5.配置track(两台都是)

   29   cd /etc/fdfs/
   30     ls
   31     cp tracker.conf.sample  tracker.conf
   32    vim tracker.conf        修改tracker配置文件
bind_addr=192.168.1.20  #监听本机地址 8
base_path=/storage/fastdfs  #这里写刚刚创建的数据存放的路径  22
   34  /etc/init.d/fdfs_trackerd  start  启动trackerd
   35  netstat -anpt | grep 22122  

Fastdfs架构

6.安装nginx(第一台)
Fastdfs架构

   36  yum -y install pcre-devel openssl-devel  zlib-devel   #安装nginx依赖包
   35  tar zxf nginx-1.14.0.tar.gz                #解压nginx   tar包
   37  cd nginx-1.14.0/                        
   38  ./configure  &&  make && make install    #编译安装

二.配置storage server服务器(两台都是)

Fastdfs架构_第4张图片
1.安装nginx (两台都要)

   30  yum -y install pcre-devel openssl-devel   安装依赖包
   31  tar zxf nginx-1.14.0.tar.gz            解压nginx包
   32  tar zxf fastdfs-nginx-module.tar.gz    解压nginx拓展包
   33  cd nginx-1.14.0/
   36  ./configure --add-module=../fastdfs-nginx-module/src && make && make install    编译安装

2.配置storage

   38  cd /etc/fdfs/
   39  cp storage.conf.sample  storage.conf
   40  vim storage.conf    修改storage配置文件
group_ name=group1第一台storage为group1 第二台storage为group2    11
bind_ addr=192.168.1.40
port=23000  #默认端口,不做修改
base_ path=/storage/fastdfs/ #数据和日志存放的目录地址   41
store_ path0=/storage/fastdfs/ #第一个存储目录和basr_path路径相同  110
tracker_ server=192. 168.1.20:22122   119
tracker_ server=192.168.1.30:22122  120
http. server_ port=8888 #http访问文件的端口  末尾

3.配置nginx拓展配置文件

   43  cd /fastdfs-nginx-module/src/
   44  cp mod_fastdfs.conf  /etc/fdfs/
   45  vim /etc/fdfs/mod_fastdfs.conf

base_path=/storage/fastdfs/    #数据和日志存放的目录地址  10
tracker_server=192.168.1.20:22122       #40
tracker_server=192.168.1.30:22122         #41
storage_server_port=23000      44
group_name=group1  #第二台storage组名为group2  47
url_have_group_name = true    #当group有多个的时候需要改为true,以组名去访问    53
store_path0=/storage/fastdfs   #第一个存储目录和basr_path路径相同  62

[group1]         #119去注释修改或直接添加
group_name=group1
storage_server_port=23000
store_path_count=2
store_path0=/storage/fastdfs
[group2]
group_name=group2
storage_server_port=23000
store_path_count=2
store_path0=/storage/fastdfs

****4.拷贝nginx拓展软件的配置文件,storage的配置文件,nginx安装包和nginx拓展包到第二台storage主机(拷贝完之后,按照上面2,3步骤来一遍)

   48  cd /etc/fdfs/
   49  scp mod_fastdfs.conf storage.conf  [email protected]:/etc/fdfs/
   50  cd
   52  scp fastdfs-nginx-module.tar.gz nginx-1.14.0.tar.gz  [email protected]:/root/

5.Nginx主配置文件修改 (两台都改)

[root@localhost ~]# vim  /usr/local/nginx/conf/nginx.conf
    在原来的server上添加
    server {
        listen    8888;   
        server_name localhost;
        location ~/group[0-9]/M00/ {
                 ngx_fastdfs_module;   #nginx拓展模块
        }
}

6、启动服务
启动storaged server(两台都要启动)
[root@localhost fdfs]# /etc/init.d/fdfs_storaged start
Fastdfs架构
启动nginx(两台都启动)
[root@localhost ~]# /usr/local/nginx/sbin/nginx
Fastdfs架构

在track上看一下日志
[root@localhost fdfs]# cd /storage/fastdfs/logs/
[root@localhost logs]# cat trackerd.log

Fastdfs架构

测试一下
Fastdfs架构_第5张图片
修改第一台的client.conf.sample配置文件

[root@localhost ~]# cd /etc/fdfs/
[root@localhost fdfs]# vim client.conf.sample
base_path=/storage/fastdfs  #10
tracker_server=192.168.1.20:22122   #14
tracker_server=192.168.1.30:22122    #15
上传一张图片到storage  (第一台)
[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf.sample  鲸鱼.png  (这个id最好放在一个文件里方便查找)

Fastdfs架构
在storage上查看一下

[root@localhost data]# cd  /storage/fastdfs/data/00/00
[root@localhost 00]# ls

Fastdfs架构
浏览器访问一下
http://192.168.1.50:8888/group2/M00/00/00/wKgBMl3cpCWAZGQIADuP0gQAyTs723.png
Fastdfs架构_第6张图片
下载并改名刚刚传上去的图片
[root@localhost ~]# fdfs_download_file /etc/fdfs/client.conf.sample group2/M00/00/00/wKgBMl3coGKACR1RADuP0gQAyTs874.png xgp.png
Fastdfs架构

删除刚刚上传的图片
[root@localhost ~]# fdfs_delete_file /etc/fdfs/client.conf.sample group2/M00/00/00/wKgBMl3coGKACR1RADuP0gQAyTs874.png

三,配置nginx反向代理服务器 (第一台)

在http模块中添加
[root@localhost nginx-1.15.4]# vim /usr/local/nginx/conf/nginx.conf
    upstream fdfs_group1 { #设置group1的服务器 20
      server 192.168.1.40:8888 weight=1 max_fails=2 fail_timeout=30s;
    }
    upstream fdfs_group2 {
      server 192.168.1.50:8888 weight=1 max_fails=2 fail_timeout=30s;
    }
#下边添加两个location
        location ~ /group1(/*) {     #48
            proxy_pass http://fdfs_group1;
        }
        location ~ /group2(/*) {
            proxy_pass http://fdfs_group2;
        }

启动nginx

 [root@localhost ~]# /usr/local/nginx/sbin/nginx
[root@localhost ~]# netstat -anpt | grep 80

浏览器查看一下,还是用刚刚那个id(需要重新上传一下)

[root@localhost ~]# fdfs_upload_file /etc/fdfs/client.conf.sample  鲸鱼.png 
group2/M00/00/00/wKgBMl3cpCWAZGQIADuP0gQAyTs723.png

浏览器访问:http://192.168.1.10/group2/M00/00/00/wKgBMl3cpCWAZGQIADuP0gQAyTs723.png
Fastdfs架构_第7张图片
Fastdfs架构

实验完毕