官方网站:https://github.com/happyfish100/
配置文档:https://github.com/happyfish100/fastdfs/wiki/
参考资料:https://www.oschina.net/question/tag/fastdfs
Java客户端:https://github.com/happyfish100/fastdfs-client-java
为什么要学习分布式文件系统?
在我们的web开发中,很多的时候都需要把本机的一些文件上传到web服务器上面去。
举一个简单的例子,按照一个传统的上传方式,前端使用form表单,提交按钮直接submit到后台,其关键的代码就是文件的接收,至于后面的存储操做,基本上都是对IO流的操做。而文件也只是保存到本地磁盘或对应的服务器。这样就会有一些致命的缺点。
如果这台计算机宕机了,那么会导致整个服务不可用,文件不能上传和下载了,如果这台计算机磁盘损坏了那么会丢失所有的文件。并且这台计算机的磁盘空间非常有限,很容易达到磁盘的上线导致无法上传文件。
了解完传统的文件上传系统的一些弊端后,我们针对下方的一个需求带大家进一步了解分布式文件系统的一些好处。
- 需求案例:假设现在需要做一个类似抖音b站的,视频分享网站,会拥有大量的视频教程资源供用户观看以及上传下载,文件太多如果高效存储?用户访问量大如何保证下载速度呢?
- 答:分布式文件系统是解决这些问题的有效方法之一
什么是分布式文件系统?
百度百科是这样说的!
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。
另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样。
这里讲的可能会有些官方,没关系!下面我将结合上方的需求给大家做了一个简单的总结。
之前我们将上传的视频文件放在一台宿主机内,如果一个盘符内存不够,就增加硬盘个数,但是单纯的增加硬盘个数已经无法满足当代的需求,毕竟硬盘访问速度有限。
分布式文件系统将视频分别放在不同计算机内,通过网络将一个一个计算机的文件系统连接起来组成一个网络文件系统,形成一个分布式网络,一台计算机的文件系统处理能力扩充到多台计算机内同时处理,就算某一台计算机挂了,还有另外副本(备份)计算提供数据。每台计算机也可以放在不同的地域,这样用户就可以就近访问,提高访问速度。有效的解决单点故障文件丢失等一系列问题,特别适合我们高并发,常扩容的这么一个业务场景下。
FastDFS
FastDFS纯C语言实现,支持Linux、FreeBSD等UNIX系统类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性FastDFS可以看做是基于文件的key value pair存储系统,称作分布式文件存储服务更为合适。
FastDFS是什么?
FastDFS是一个开源的轻量级分布式文件系统
,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载) 等,解决了大容量存储和负载均衡的问题。
特别适合以文件为载体的在线服务,如相册网站、视频网站、图片网站、文档网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS整体架构
FastDFS文件系统主要由两大部分构成,一个是客户端,一个是服务端。
客户端(Client)通常指我们的程序
比如我们的Java程序去连接FastDFS,操作FastDFS,那我们的Java程序就是一个客户端,FastDFS提供有API用来访问FastDFS文件系统,控制文件上传下载层( 如果你是 java 开发,你只需要关心着一层)。
服务端有两个部分构成
1.跟踪器(Tracker):跟踪器主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端 Client 和后端存储节点storage的枢纽。因为相关信息全部在内存中,Tracker server 的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了。
2.存储节点(Storage):存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储,文件同步和提供文件访问等。
下载安装
- 下载安装分以下三个步骤,请按照顺序进行操作。
一.安装前置依赖包
检查Linux上是否安装了 gcc,libevent,libevent-devel
yum list installed | grep gcc
yum list installed | grep libevent
yum list installed | grep libevent-devel
如果没有安装以上前置依赖包,则需要通过下面命令进行安装
yum install gcc libevent libevent-devel-y
二.安装libfastcommon
前置依赖包安装成功后,我们紧接着需要安装公共函数库 libfastcommon
- 获取libfastcommon安装包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.36.tar.gz
- 解压安装包
tar -zxvf V1.0.36.tar.gz
- 安装完成后进入 libfastcommon 目录
cd libfastcommon-1.0.36
- 在 libfastcommon 目录执行编译
./make.sh
- 安装 libfastcommon
./make.sh install
三.安装FastDFS
- 获取fast安装包,这里采用的版本为5.11
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
- 解压安装包
tar -zxvf V5.11.tar.gz
- 安装成功后进入目录
cd fastdfs-5.11
- 执行编译 make.sh 文件
./make.sh
- 安装 fastdfs
./make.sh install
- 安装成功后,查看可执行命令,这些命令放在usr/bin目录下表示不用去配置环境变量就可以直接使用我们fastdfs的命令
ls -la /usr/bin/fdfs*
- 拷贝 http.conf 文件到 /etc/fdfs 目录下
cp http.conf /etc/fdfs/
- 拷贝 mime.types 文件到 /etc/fdfs 目录下
cp mime.types /etc/fdfs/
拷贝这两个文件后续会用到,为了避免报错大家拷贝完记得进入目录查看一下
想要成功启动我们还需要进行修改以下两个配置
配置Tracker服务
修改 tracker 文件后缀,该文件在 /etc/fdfs 目录下,进入目录后发现有三个.sample后缀的文件(自动生成的fdfs模板配置文件),通过cp命令拷贝tracker.conf.sample,删除.sample后缀作为正式文件。
cd /etc/fdfs/
cp tracker.conf.sample tracker.conf
- 编辑 tracker.conf 文件,修改相关参数
vim tracker.conf
base_path 指定存放日志的路径,要求该路径必须存在。port 默认端口号。http.server_port 为http端口,需要和nginx相同
base_path=/home/fastdfs/tracker port=22122 http.server_port=80
修改完成后输入wq
保存并退出,紧接着在配置的目录下创建该文件夹
mkdir /home/fastdfs/tracker
- 启动并测试
fdfs_trackerd
通过上方说明命令产生的结果fdfs_trackerd [start | stop | restart] 可以告诉我们怎么去用
代表配置文件是必选项,start为启动,stop为停止,restart为重启他们都是可选项,默认为start
我们想要运行trackerd.conf文件就可以通过下方命令去执行
fdfs_trackerd /etc/fdfs/tracker.conf
配置Storage服务
- 修改文件后缀
cd /etc/fdfs/
cp storage.conf.sample storage.conf
- 编辑 storage.conf 文件,修改相关参数
vim storage.conf
#storage存储data和log的跟路径,必须提前创建好 base_path=/home/fastdfs/storage #storge默认23000,同一个组的storage端口号必须 port=23000 #默认组名,根据实际情况修改 group_name=group1 #存储路径个数,需要和store_path个数匹配 store_path_count=1 #真正存放文件的目录,如果为空,则使用base_path store_path0=/home/fastdfs/storage/files #配置该storage监听的tracker的ip和port tracker_server=xx.xxx.xxx.xxx:22122
配置完成后不要忘记创建对应的文件夹
mkdir /home/fastdfs/storage
mkdir /home/fastdfs/storage/files
- 启动并测试
fdfs_storaged /etc/fdfs/storage.conf
查看我们两个服务是否启动成功
ps -ef|grep fdfs