爆肝两万字,详解fastdfs分布式文件系统

文章目录

1.学习目标

image.png

2.简介

技术论坛:http://bbs.chinaunix.net/forum-240-1.html
资源地址:https://sourceforge.net/projects/fastdfs/
源码地址:https://github.com/happyfish100

  1. FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
  2. FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
  3. FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。
  4. 存储节点存储文件,完成文件管理的所有功能:就是这样的存储、同步和提供存取接口,FastDFS同时对文件metadata进行管理。所谓文件的metadata就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。文件metadata是文件属性列表,可以包含多个键值对。
  5. 跟踪器和存储节点都可以由一台或多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
  6. 为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用
  7. 在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

2.1.架构图

image.png
解释:
写入
假设我现在client要上传文件,我要找到跟踪器tracker,tracker找到client,然后tracker找到存储节点,看看存储节点那个卷下面的节点比较空闲,能放得下这个文件,然后写入进去,生成一个文件名
读取
如果我们client要下载文件,不需要与tracker再做交互,直接与storage打交道,根据我们当时上传文件tracker给我们提供的文件名,我们加上服务器名字和端口号再加上完整的文件名即可读取下载成功
主备切换
我们storage存储节点是由多个卷构成的一个大的集群,比方说c d e盘构成一个硬盘,每个卷又分成主和子,他们两者文件类型一致,如果主服务器崩了,子服务器马上可以顶上

2.2.上传流程

image.png

  1. client询问tracker上传到的storage,不需要附加参数
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件上传

2.3.下载流程

image.png

  1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名);
  2. tracker返回一台可用的storage;
  3. client直接和storage通讯完成文件下载。

client可以直接去到Storage进行在线的读取和下载,这个在线读取和下载前提是我们知道它的一个ip地址和端口号,后面跟上卷名,再跟上文件名,我们如果知道这个完整路径的话,可以直接去到我们存储节点进行在线预览,或者是在线下载;如果我们现在只知道一个卷名和文件名,我们并不知道ip和端口,我们也可以去找我们的tracker,拿着我们的卷名和文件名去找我们的跟踪器,跟踪器就会找到对应的卷名和文件名所在的节点,会把这个存储节点的ip地址和端口号返回给我们的客户端,然后我们client再次通过我们的ip端口卷名文件名,然后直接通过我们的存储节点进行我们的读取和下载操作,一般我们如果考虑效率问题的话,肯定是我们直接拿着ip端口卷名文件名直接去存储节点,读取我们的一个文件,如果实在是不知道ip和端口情况下,可能就需要通过我们tracker,但一般情况下,我们tracker上传的时候,我们tracker会返回一个完整的卷名和文件名加ip和端口,我们一般呢会把返回的相对路径存放到数据库里面去,那我们需要进行文件预览和下载的时候呢,我们一般从数据库拿到我们带有ip和端口的卷名和文件名这一整串信息的数据直接去storage进行一个下载 ,效率更高一点!!!

2.4.术语介绍

  1. TrackerServer:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用,记录storage server的状态,是连接Client和Storage server的枢纽。
  2. Storage Server:存储服务器,文件和meta data都保存到存储服务器上
  3. group:组,也称为卷,同组内服务器上的文件是完全相同的【主崩子接】
  4. 文件标识:包括两部分:组名和文件名(包含路径)
  5. meta data:文件相关属性,键值对(Key Value Pair)方式,如:width1024,height=768

2.5.同步机制

  1. 同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;【比方我们client去进行写操作,会根据tracker自己去调度,假设三台服务器,会根据tracker调度结果,返回里面任意一台的IP地址和端口,主要是看storage那一台服务器符合调度的一个规则,比方说那一台storage它现在是空闲的,那一台storage它的一个剩余磁盘容量能放下这个文件,它返回的并不一定是某一台的ip地址,可能是三台里面随机选一个ip地址或者端口进行返回】
  2. 文件同步只在组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;【采用广播方式,比如说我们现在是一个高并发,每一台都正好在进行写操作,传统的我们一个服务器新增了数据量,它们之间要进行一个相互通信,一直通信到最后一个服务器,再进行相应的数据同步,表示我这里现在新增了数据,你和我同步一下,这是传统的,我们发现它们相互通信的次数非常频繁;所以我们一般采用广播模式,比方说我们某个服务器写了一条数据,它就会广播告诉其它服务器,表示我这里新增了数据,你们也新增一下;】
  3. 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;【被写入数据称为源服务器;我们源头数据才需要进行一个同步,如果是备份数据不需要广播同步,一直不停广播就形成环路了!!!】
  4. 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给新增服务器 【假设我们有三台服务器,增加了一台,加的这一台就会从我们原有的三台里面,随机选一台作为一个源头数据,然后就会把这个源头数据和我们的备份数据同步到新增的服务器里面】

2.6.FastDFS运行时目录结构

2.6.1.Tracker Server目录

2.7.FastDFS和其它文件存储的简单对比

2.7.1.FastDFS和集中存储方式对比

指标 FastDFS NFS 集中存储设备加 NetApp、NAS
线性扩容性 高【扩容好】
文件高并发访问性能 高【速度快】 一般
文件访问方式 专用API【有自己的AIP】 POSIX【可移植操作系统接口】 POSIX
硬件成本 较低【成本低】 中等【硬盘成本高】 高【硬盘成本高】
相同内容文件只保存一份 支持【相同文件只有只保留一份】 不支持 不支持

2.7.2.FastDFS和mogileFS对比

指标 FastDFS mogileFS
系统简洁性 简洁 只有两个角色:tracker和storage 一般有三个角色:trocker、storage和存储文件信息的mysql db
系统性能 很高(没有使用数据库,文件同步直接点对点,不经过tracker中转) 高(使用mysql来存储文件索引信息,文件同步通过tracker调度和中转)
系统稳定性 高(C语言开发,可以支持高并发和高负载) 一般(Perl语言开发,高并发和高负载支持一般)【没有C语言高并发高负载好】
RAID方式 分组(组内冗余),灵活性较大 动态冗余,灵活性一般
通信协议 专用协议,下载文件支持http【专用协议最大的好处就是写的操作效率跟高,在tcp/ip之上】 http
技术文档 较详细 较少
文件附加属性(meta data) 支持【文件相关属性存储在storage】 不支持
相同内容只保存一份 支持【根据文件相关属性判断,如果属性一致则覆盖】 不支持
下载文件时支持文件偏移量【断点续传, 从指定位置向前向后移动的字节数,比如我们下载一个文件一半点暂停,然后再点开始会从你已经下载好的进度开始,而有的文件你点了暂停可能就让你从头开始下载】 支持 不支持

有没有比FastDFS更好的呢?当然有,那就是我们的hdfs,hdfs更多的是大数据方面去用,它的性能会比FastDFS更好一点

3.安装

3.1.安装简介

FastDFS主要是两个角色,一个tracker和storage,它们本质上都是一个FastDFS一个包,它们通过对应不同配置来确认它们不同的角色,所以它们通用的安装都是FastDFS的安装包
我们这边也准备了两台服务器,一台是安装我们tracker,一台安装storage,它们只是对应角色配置不一样
image.png
如果电脑配置比较差的话,也可以直接安装在一台服务器上,只需修改对应角色配置即可,安装包都是一样,也可以实现!!!

3.2.FastDFS安装包

上传所选安装包

  1. 第一个就是fastdfs安装包
  2. 第二个对应client安装包
  3. 第三个是nginx模块包
  4. 第四个就是fastdfs公用的库
  5. 第五个fastdfs和nginx整合

image.png

3.3.安装依赖

3.3.1.安装c++相关依赖

我们fastdfs是根据C语言进行开发的,所以我们需要安装C++相关依赖

yum -y install cmake gcc-c++

image.png

3.3.2.安装fastdfs核心库

安装完成之后,我们还需要安装我们fastdfs核心库
image.png
这个核心库呢其实是从fastdfs和fastdht中提取出来的公用的C函数的库,fastdfs和fastdht是同样一个作者去写的两个产品,都是C语言编写,然后里面会有一些公用函数库,作者把它提取出来当成一个专门核心库
如果我们后缀名是.zip,需要安装一个zip解压插件

yum -y install unzip

image.png
我们把需要安装的fastdfs所以文件放在一个文件夹方便管理

mkdir -p /usr/local/fastdfs

然后我们就可以去解压了
zip后缀

unzip libfastcommon-1.0.43.zip

tar后缀

tar -zxvf libfastcommon-1.0.43.zip

image.png
我们进行之后看见有一个make.sh执行脚本,我们就通过这个脚本去进行一个编译和安装
image.png

.make.sh

这样就会进行编译
image.png
编译好后我们就可以进行安装了

.make.sh install

image.png
还有一个问题就是我们fastdfs主程序的lib目录是在/usr/local/lib下面的,所以我们需要去创建一些软链接,这些软链接就相当于快捷方式,把它的一个快捷方式从原本指向的目录改成我们想要的指向的目录
这个意思相当把前面原本指向的路径指定到我们后面需要我们指定路径

ln -s /usr/1ib64/1ibfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/local/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/local/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

3.3.3.安装fastdfs

image.png

tar -zxvf fastdfs-6.06.tar.gz

我们发现这里也有make.sh
image.png
我们可以做一个可选的操作,就是说我们可以把它的一个路径改成指定的路径,因为它默认安装路径是在/usr下面,我们可以把它改成/usr/local下面去,当然在集群下面就不要去改,那我们现在是安装的一个单节点,可以去尝试的改一下
我们进入fastdfs

vim make.sh

我们搜索/TAGE_PREFIX
image.png
我们把它改到/usr/local
image.png
然后我们再次去安装

./make.sh 先编译

image.png
再安装

./make.sh install

安装后,FastDFS主程序所在的位置是:

  • /usr/local/bin可执行文件所在位置。默认安装在/usr/bin中。
  • /etc/fdfs配置文件所在位置。就是默认位置。
  • /usr/1oca1/1ib64主程序代码所在位置。默认在usr/bin中。
  • /usr/local/irclude/fastdfs包含的一些插件组所在位置。默认在/usr/include/fastdfs中。

image.png
安装好了之后,我们可以去看一下服务脚本所在位置

cd /etc/init.d/

image.png
然后我们可以看一下我们配置文件的模板所在位置

cd /etc/fdfs/

image.png
如果我们这台服务器当做tracker来用的话,只需拷贝tracker配置拷贝过去进行修改,把后面的.sample删掉就可以用了,建议不要拿源文件直接用,最好是拷贝过去再进行修改,因为如果改错了还有备份!!!
我们还可查看内置命令所在目录

cd /usr/local/bin/

这个就是fastdfs内置命令,包括重启,启动,停止,还有测试,跟踪等等。。。
image.png
到这里,我们整个tracker服务器的fastdfs安装好了!!!
**同理,我们还要去安装storage,拿storage的安装和tracker是一模一样的,只是配置文件不同,其它安装包都一样,所以我们如果在同一台服务器部署只需修改配置文件即可!!! **

4.配置tracker

4.1.拷贝tracker.conf.sample

我们首先进入配置文件模板

cd /etc/fdfs

我们看到里有个tracker.conf.sample
image.png
然后我们拷贝一下,到conf就行

cp tacker..sample tracker.conf

4.2.配置tracker.conf

然后我们就可以进行配置了

vim tracker.conf

image.png
我们简单了解一下里面的属性

  • bind_addr = 绑定的ip地址
  • port = 22122 端口号
  • connect_timeout = 5 连接超时
  • network_timeout = 60 网络超时
  • base_path = /home/yuqing/fastdfs【这个是fastdfs我们一个tracker启动之后使用的一个根目录,它呢也要去存储一些信息,它存储的就是我们卷里面的一些storage的存储节点,包括我们卷1 卷2 卷3 每个卷下面有哪些storage,每个storage它的ip和它的端口都要去存储一下,因为它是做一个中转调度操作,client发起一个写操作的时候,我们的一个tracker就会去调度找到哪一个节点可以给我们去写操作,然后会返回ip和端口,tracker需要把我们卷下面的所有的一个存储节点ip和端口存储一下,这边我们可以把这个目录修改一下,base_path = /fastdfs/tracker,这个目录是我们自定义的,待会我们要去创建这个目录
  • max_connections = 1024 最大连接
  • accept_threads = 1 接收的线程
  • work_threads = 4 工作的线程
  • min_buff_size = 8KB 最小缓冲8KB
  • max_buff_size = 128KB 最大的缓冲
  • store_server = 0 负载均衡策略,0表示轮询机制,如果是1的话,就是第一个服务器通过我们ip地址查找到的第一个服务器,如果是2的话查找出来的也是第一个服务器,不是通过ip地址
  • store_path = 0 默认轮询
  • download_server = 0 下载服务默认轮询

这里我们就配置完成了,我们主要配置base_path 根目录即可!!!
然后我们别忘了创建刚才自定义的目录

mkdir -p /fastdfs/tracker

4.3.启动tracker

我们创建完目录呢,就可以启动tracker了,来到启动目录

cd /etc/init.d/

image.png
我们看到有两个文件 fdfs_trackerd和fdfs_storaged这两个就是我们启动的文件
我们之前安装的时候,我们修改过它的一个目录,所以呢我们这边启动的时候呢,也去修改它的一个目录,如果我们没有去修改它的目录,这边可以直接启动!!!
我们进入配置文件修改目录即可!!!

vim fdfs_trackerd

我们修改之后应该是/usr/local/bin/fdfs_trackerd,
image.png
保存并退出, 启动即可

./fdfs_trackerd start

image.png
怎么去看有没有启动成功呢?
两种方法:
查看状态

./fdfs_trackerd status

image.png
查看进程

ps -ef|grep fdfs

image.png
停止

.fdfs_trackerd stop

重启

/etc/init.d/fdfs_trackerd restart

开机启动
我们进入文件

vim /etc/rc.d/rc.local

添加启动文件
image.png

/etc/init.d/fdfs_tracked start

4.4.小结

我们现在已经启动了tracker包括我们相应的一些配置,其实真正要做的配置没有,默认的端口都没改,只是把它的base_path 根目录进行了一个修改,当然这个修改也是可有可无的,但是记住一定要创建,有一个负载均衡,大部分默认都是一个轮询的方式,其它的也没什么!!!

5.配置Storage

5.1.拷贝storage.conf.sample

跟tracker一样

cd /etc/fdfs

image.png
同样,拷贝一份

cp storage.conf.sample storage.conf

5.2.配置storage.conf

修改storage

vim storage.conf

也是一样,我们观察一下里面的属性
image.png

  • group_name = group1 默认组名,也是卷名
  • bind_addr = 绑定的ip地址
  • client_bind = true 是否允许客户端访问
  • port = 23000 端口号
  • connect_timeout = 5 连接超时
  • network_timeout = 60 网络超时
  • base_path = /home/yuqing/fastdfs【同样这里也是存放storage_server它里面基础数据的内容,以及日志内容的目录,比如说启动的进程号、同步的相应信息,我们也可以进行修改,/fastdfs/storage/base
  • max_connections =1024 最大连接数
  • buff_size = 256KB 缓冲大小
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小卷聊开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值