fastdfs原理

fastdfs分为client、storage、tracker三部分

client为fastdfs客户端,负责对fastdfs服务发起请求,简单地说就是上传和下载文件

storage和tracker联合作为fastdfs服务器,提供上传和下载的接口,并负责保存文件。

其中storage为保存文件的部分,tracker为client和storage的中介,负责负载均衡。

storage理解起来非常简单,就相当于是一个硬盘,你可以往里面存东西,也可以从里面拿东西。

而tracker则更加抽象一些,他是fastdfs能成为分布式文件存储系统的核心。当一个硬盘大小不够放文件了,自然会想到用多个硬盘,也就是多个服务器进行文件的存储。由此也带来了一个问题,当存文件的时候,文件存到哪里?取文件的时候,从哪里取?因此就出现了tracker追踪者。多个硬盘也就是多个storage同时工作的时候,tracker会保存他们的位置,同时规律地向他们询问状态,判断他们是否可用。当客户端client向文件服务器发出请求,想要存取文件时,实际上是向tracker发出请求,tracker收到请求后,根据自己保存的storage信息判断应该使用哪个storage,然后进行操作,并将操作结果反馈给客户端。这一点在后面对fastdfs的配置中有很明显的体现。

 

fastdfs配置

fastdfs的安装在很多博客中都有提到,这里不再赘述。其实对于配置的讲解也不少,但大多都是直接给出参数进行配置,并未讲解这样配置的原理,可能会带来使用者的困惑,甚至出现配置错误。不过总体来说fastdfs的配置非常简单,只要牢牢抓住他的工作流程就行了,更加具体的参数配置譬如占用空间大小等,当你用到的时候,你也肯定已经不需要看这种入门教程了。

(配置文件在哪里请自行百度搜索)

在最前面说一句:http相关的全部不需要配置,fastdfs已经停用http服务了。

storage配置

作为硬盘,storage当然要配置的是存储位置。当然这种系统都会有日志文件,你还需要配置一下日志存放位置。base_path这个参数就是配置他的基础路径,# the base path to store data and log files,这是他官方给的注释,也就是说这个基础路径就是存放数据的路径,也是存放日志的路径。当然要注意还有一个参数store_path0,# store_path#, based 0, if store_path0 not exists, it's value is base_path,这个参数是数据的存放路径,当他没有被填写的时候,他的值就是base_path。很显然,这个也是数据的存放路径,并且会优先将这个作为存放路径,如果这个没有填写,才会把base_path作为存放路径。当这个参数填写后,base_path就仅仅是日志文件的存放路径了。

为什么这个store_path会在后面价格0?因为可以有多个storage,那就需要多个存放地址,从0开始一个一个往后写地址就行了,当然有一个专门指定storage的数量参数要填写。

同时,前面提到tracker是client和storage的中介,所以当然要配置tracker服务器地址tracker_server=你的tracker服务器地址(tracker_ip):端口号(tracker_port)。至于这个服务器地址是什么,接着看就知道了。

tracker配置

作为中介,tracker需要配置的东西很少,因为都是别人来找他,客户端会来找他,storage会主动向他提供自己的信息。所以它只需要在原地等着就行。那么他就需要配置一下自己的端口号port=22122(默认端口号(tracker_port)),而他所在的服务器地址就是tracker服务器地址了,所以前面那个storage配置的tracker服务器地址就是这里tracker所在的服务器的地址(tracker_ip),端口号就是这里配置的端口号。当然,tracker需要存储所有storage的信息,并且他也有日志,所以要配置一下这些东西的存储路径base_path=随便你定。

client配置

作为客户端,干什么都只需要找中介tracker就行了,所以只需要配置tracker的地址tracker_server=tracker的服务器地址(tracker_ip):端口号(tracker_port)。当然程序运行都会出现数据和日志,所以配置一下存放路径base_path=你自己定。

最后提一句,这里配置的所有存放路径必须手动创建!!!

fastfds使用

配置完了自然要用一下。这个使用方式多了去了,百度一下就行了,主要需要关注两点。一个是fastdfs的三部分并不一定是部署在一起的,client,tracker,storage可以分开部署,其实也应当是分开的,client负责给人用,tracker和storage负责存取服务的提供。因此你要用fastdfs,你得保证服务器那边tracker和storage能用,然后你客户端这边client配置好了,然后才能用。第二点就是fastdfs存了文件后会给你返回一个路径,一般就是服务器地址和组名,存放地址之类的,你后面要用这些东西来自己组织访问地址。其中里面有个/00/00/,到这里其实就是是一个文件夹路径了。

 

nginx与FastFDS联动

前面说了,fastdfs弃用了http,所以他就只提供一个文件的上传和下载了,那么表示层的任务就交给了nginx。为什么不交给tomcat或者jetty?因为nginx的静态文件传输效率是最高的,常用来座负载均衡和文件服务。nginx的配置,反向代理什么的我就不说了,网上一堆。我在这里主要说一下nginx在这个文件系统中担任什么职责。

FastDFS在存储文件的时候,其实也就是在硬盘中存,你会在storage的data文件夹(前面有配置这个文件夹的位置,也就是storage的文件存储位置)中看到很多用两位二进制命名的文件夹,然后每个文件夹进去后又是一堆这样的文件夹,然后再进去才是存储的文件。之前说的那个/00/00/就是这里的文件夹路径。你手动点进去就能找到文件。此时,只要你确确实实会nginx的反向代理,那不需要我教你也会nginx和FastDFS联动了。至于有个fastdfs-module啥的,那个是处理分布式数据同步之类的,你现在可以不搭建,等把fastdfs用熟了再搭建。当然,那个时候你可能已经投入阿里云oss的怀抱了。

 

java编写FastDFS客户端

github上有开源项目,但是有两个,一个是余庆先生写的,需要下载源码,然后maven自己打包使用,而且使用过程比较复杂(相对来说),这里我推荐的是另一个开源项目https://github.com/tobato/FastDFS_Client。不过这个项目虽然用起来很简单,但是几乎只支持springboot,其他的框架想要使用比较麻烦,还是去考虑余庆先生的吧。当然,我估计现在也没几个不用springboot的。他这个开源项目学习起来非常简单,你只需要去看他的源码,里面有测试类,跟着他的测试类写就完事了。这个项目的readme写的也很详细,相信不会有人看了还不会用的,我就不在这里讲了。这个项目可以直接用maven进行导包,不需要自己再本地打包了,也是比较方便。

 

ok,这就是本人的fastdfs学习笔记了,纯手打,累死了,改天还是要弃暗投明,投向oss的怀抱。