FastDFS搭建文件服务器

一.为什么需要文件服务器?

在我们的项目中,文件上传下载(其中包括图片)是经常需要我们去开发的,我们可以根据前端传过来的文件保存到本地服务器中,但是这会导致两个问题,其一,当系统发展到后面,逐渐的单一的服务器支撑不了巨大的访问量,我们就会采用集群分布式的架构方式去搭建我们的服务器环境,当使用这种架构之后原来我们存在我们服务器A中的文件服务器B是没有的,加入nginx负载均衡到服务器B就会加载不出图片,因为我们上传的图片在服务器A中,因此我们必须独立出一台服务器作为文件(图片)服务器,其二是如果我们是开发供用户使用的门户网站系统的话(例如抖音),那么用户上传的图片文件会非常的多,存储在我们项目的web服务器的开销不来的,因此分布式文件系统就诞生了。

我们这里说的是用FastDFS搭建出的文件系统,简单介绍一下FastDFS:

FastDFS是用c语言编写的一款开源的分布式文件系统,它是由淘宝资深架构师余庆编写并开源。FastDFS专为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

1.FastDFS的工作原理:

在FastDFS的架构中主要包括Tracker server和Storage server。客户端通过访问Tracker server,根据Tracker server回调的Storage server的ip去访问进行文件上传以及下载。

下面是FastDFS的架构:

(1)Tracker server:Tracker server主要作为是负载均衡和调度,当client要上传或者下载文件时,首先访问Tracker server,Tracker server会根据具体的访问策略去找到具体的Storage server给client,client根据返回的地址信息去直接访问Storage server,所以可以称Tracker server为追踪服务器或者调度服务器。

(2)Storage server:Storage server的作用就是用来文件存储的,是整个FastDFS最终的实现的目的,客户端最终上传的文件都存储在Storage server中,但是Storage server并没有实现自己的文件系统,而是采用服务器本身的文件系统去存储,所以Storage server也称为存储服务器。

Storage集群采用了分组的存储方式。集群由一组或者多组组成,一组Storage server有一台或者多台组成,不同组的Storage server不会互相通信,同一组的Storage server会互相网络连接通信进行文件同步,保证一组上每一台server的文件都是一致的,一组的存储容量为该组中容量最少的那一台server

2.文件上传流程

首先客户端发起上传文件的请求给Tracker server,Tracker server负责调度Storage server集群,从集群中查看空闲的Storage server的信息返回给客户端,客户端拿到信息之后直接根据该信息去与Storage server进行文件上传的交互,文件上传完成后Storage server会返回一个文件id给客户端去存储,下次下载该文件的时候直接发送该文件id即可在这里我们可以看到Tracker server完全是一个中间人的身份去完成文件的上传,Storage server会定时发送心跳给Tracker server汇报自己的状态。

3.下载流程

客户端发送下载请求给Tracker server,Tracker server查询可用的Storage server信息返回给客户端,客户端拿着之前保存的file_id去请求Storage server进行文件的下载。

文件id,例如:

group1是组名,M00是Storage server的存储的虚拟路径,在Storage server的配置文件中如果我们设置了store_path0的话就是M00,store_path1的话就是M01,然后后面就是store_path下面的相对路径。

二.FastDFS的配置

安装FastDFS这里就不说了,这里讲的只要是配置文件的说明。

1.Tracker server的配置

我这里的tracker和server都是在本机,所以两者的配置文件目录我都放在了/etc/fdfs目录

其中tracker.conf,storage.conf分别为tracker和storage的配置文件

打开tracker.conf

主要配置有

端口:port=22122

存储策略:store_lookup=0(轮询向storage存储文件),1(指定具体的group),2(负载均衡,选择空闲的storage存储)

tracker基础目录:base_path=/home/fastdfs,tracker在运行时会在此目录存储storage的管理数据以及会在此目录下创建一个logs目录存放一个trackerd.log文件记录tracker的运行日志

2.Storage server的配置 

打开storage.conf

组名:group_name=group1

端口:23000

向tracker发送心跳的时间间隔(秒):heart_beat_interval=30

storage的基础目录:base_path=/home/fastdfs,在此目录下会创建一个logs目录存在一个storaged.conf文件记录storage的运行日志。

store_path0=/home/fastdfs/fdfs_storage,此目录就是上面说的文件id里面的M00,如果有多个存储目录就可以设置store_path1

上报tracker的地址:tracker_server=192.168.157.137:22122,有多个tracker的话可以配置多个tracker的地址

3.运行FastDFS

分别运行tracker和storage的脚本起启动tracker以及storage

启动tracker:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start   (tracker脚本 tracker.conf的路径)

启动storage:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start   (storage脚本 storage.conf的路径)

下面是我已经运行之后并且已经通过客户端向fastdfs存储的文件的目录:

,其中data就是tracker通过base_path的设置在/home/fastdfs中创建了一个data目录去存放管理storage server的信息,logs记录tracker和storage的运行日志,fafs_storage就是我在storage.conf中设置的store_path0,里面就是存放的文件。

三.搭建图片虚拟主机

我们上面已经成功运行了FastDFS,当我们在上面存储了图片之后通常我们都要通过http对其进行访问,例如说我们向服务端上传了一个头像的图片,服务端把图片保存在了storage server中之后要把图片的http地址返回给客户端,让客户端能够直接访问该url去加载该图片显示给用户看,那么我们该怎样的到我们上传给storage server的http地址尼,可能这时候有人就会想到用nginx进行映射了,对,这里我们也是使用的nginx对storage server里面的图片进行映射。

我们这里打算是这样子,在最外面套上一层nginx代理,然后nginx代理经过转发给它后面的storage server,而我们上面说过,storage server是一组的,一组可能会有多个storage server,那么我们就需要在这一组中再套上一层nginx代理进行负载均衡。

首先我们对于storage server这一层的nginx需要安装FastDFS-nginx-module模块,安装过程我们这里就不述说了。

然后在安装的nginx的ngin.conf文件中编辑:

server {
     listen 80;
     server_name 192.168.157.137;
     
     location /group1/M00/ {
         root /home/FastDFS/fdfs_storage/data;
         ngx_FastDFS_module;
     }
}

然后在最外面的一层nginx中打开ngin.conf编辑:

    #图片服务
    upstream img_server_pool1{
        server 192.168.157.137:80 weight=10;
    }

    upstream img_server_pool2{
        server 192.168.157.138:80 weight=10;
    }

    server {
       listen 80;
	server_name img.imgserver.com;
	location /group1 {
	    proxy_pass http://img_server_pool1/group1;
	}
        location /group2 {
            proxy_pass http://img_server_pool2/group2;
        }
    }

假如我们后面的storage不止一组的话,可以配置多个location和多个upstream。

猜你喜欢

转载自blog.csdn.net/weixin_37689658/article/details/90269022
今日推荐