软件篇-分布式文件系统(一) - FastDFS介绍与普通安装
分布式文件系统
1.分布式文件系统是什么
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样
上述来自百度百科的介绍。通俗来说就是:
-
传统的文件系统管理的文件是存储在本机。例如我们在桌面创建个文件,或者删除文件都是在本机上操作,
-
分布式文件系统管理的文件存储在很多机器上,这些机器通过网络相互连接,被统一管理。无论是上传还是下载文件都通过管理中心来访问。如图:
image-20200429093622376.png
2.分布式文件系统类型
分布式文件系统类型有很多,主流的几种类型如下:
-
NFS
最早由Sun微系统公司作为TCP/IP网上的文件共享系统开发。Sun公司估计大约有超过310万个系统在运行NFS,大到大型计算机、小至PC机,其中至少有80%的系统是非Sun平台
-
AFS
AFS是一种分布式的文件系统用来共享与获得在计算机网络中存放的文件。AFS使得用户获得网络文件就像本地机器般方便。AFS文件系统被称为“分布式”是因为文件可以分散地存放在很多不同的机器上,但这些文件对于用户而言是可及的,用户可以通过一定的方式得到这些文件。
-
GFS
Google公司为了存储海量搜索数据而设计的专用文件系统。是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务
-
KFS
是开始软件自主研发基于JAVA的纯分布式文件系统,通过HTTP WEB为企业的各种信息系统提供底层文件存储及访问服务,搭建企业私有云存储服务平台
-
DFS
DFS是AFS的一个版本,作为开放软件基金会(OSF)的分布式计算环境DCE中的文件系统部分。
如果文件的访问仅限于一个用户,那么分布式文件系统就很容易实现。可惜的是,在许多网络环境中这种限制是不现实的,必须采取并发控制来实现文件的多用户访问,表现为如下几个形式:
-
只读共享 任何客户机只能访问文件,而不能修改它,这实现起来很简单。
-
受控写操作 采用这种方法,可有多个用户打开一个文件,但只有一个用户进行写修改。而该用户所作的修改并不一定出现在其它已打开此文件的用户的屏幕上。
-
并发写操作 这种方法允许多个用户同时读写一个文件。但这需要操作系统作大量的监控工作以防止文件重写,并保证用户能够看到最新信息。这种方法即使实现得很好,许多环境中的处理要求和网络通信量也可能使它变得不可接受
-
3.FastDFS
3.1 介绍
FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。百度百科的介绍如下:
image-20200429100330476.png简单总结为,其特点如下:
- 文件存储
- 文件同步
- 文件访问(文件上传,下载)
- 大容量的存储和负载均衡
- 在线扩容。
特别适合一些大容量存储的系统。例如相册网站,视频网站等等。当然除了FastDFS例外还有一些其他的分布式系统也能存储。例如上面介绍的那些分布式文件系统。还是有HDFS(Hadoop),TFS(淘宝)等等
3.2 架构图
image-20200429100935217.png解释:
- Client 是我们去连接FastDFS的客户端。例如我们是java客户端去连接,那么client就是 java客户端
- Track Server 跟踪服务器 相当于我们的管理中心,主要做调度工作,负责调度Storage 节点和Client之间的通信。同时在访问上也有负载均衡的作用,以及记录storage节点运行状态。是连接Client和Storage server的枢纽
- Storage Server 存储服务器。主要存储文件和元数据(meta data),每一个strorage 都会启动一个单独的线程向 跟踪服务器集群(Track cluster)里面的 Track汇报其状态信息。例如 磁盘的使用情况,文件同步情况,上传下载次数等等。这其实跟微服务思想很相似。每一个服务向注册中心发送心跳。
- Group 文件组,一个组里面包含了多台 Storage Server,加入上传到同一组的内的任何个一台机器后,同组内其他机器就会同步到其他信息上,相当于其他机器就是这台机器的副本。达到文件备份效果。不同的组保存的数据是独立的,相互不干扰,不通信。假如当所有的组文件存储满了,我们还可以再增加组,这就是水平扩容。
- Track cluster 跟踪服务器集群,多台跟踪服务器组成
- Storage cluster 存储服务器集群,多个组构成
3.3 安装(普通安装 单机版)
-
上传要用到的软件
image-20200429190013391.png -
更新apt(切换到root用户下,后面所有操作都在root用户下操作)
apt-get update
-
安装build_essential(包含了 gcc g++ make)
apt-get install build-essential
-
安装libtool(用库支持脚本,将共享库的使用隐藏在一个一致的可移植的接口后面)
apt-get install libtool
-
安装unzip 用来解压 zip
apt-get install unzip zip
-
解压libfastcommon(FastDFS依赖于这个)
unzip libfastcommon-master.zip
-
进入该目录编译安装
cd libfastcommon-master ./make.sh ./make.sh install
-
安装FastDFS - 解压FastDFS
tar -zxvf FastDFS_v5.08.tar.gz
-
安装FastDFS - 编译安装
cd FastDFS ./make.sh ./make.sh install
-
检验安装结果
image-20200429190915319.pngll /etc/init.d/ | grep fdfs
fdfs_storaged storage启动脚本
fdfs_trackerd tracker启动脚本
-
配置文件模板
image-20200429190945695.pngll /etc/fdfs
这里面都是配hi文件的模板
-
启动tracker
在我们编译安装FastDFS过程中,Tracker 和 Storage 已经都被安装了,所以我们直接启动就可以,但是Tracker和Storage所需的配置文件不同,所以我们就修改一下不同的配置文件
-
修改Tracker配置文件,先把Tracke模板配置文件复制一份
image-20200429191053766.png -
打开
tracker
并修改
image-20200429191149824.png image-20200429191250936.png image-20200429191423984.pngvim ./tracker.conf
当然我们目录是不存在的,我们就新建一个这样的目录
image-20200429191515472.png -
启动Tracker
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start #启动 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart #重启
-
-
启动Storage
-
修改配置文件
image-20200429191620289.png
创建刚刚我们修改的目录
image-20200429192640837.png -
-
启动
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start #启动 /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart #重启
-
查看进程
image-20200429193443831.pngps -ef | grep fdfs
-
修改 client
这个是用来测试文件上传
image-20200429193526672.png image-20200429193622116.png image-20200429193708819.png image-20200429194006449.png
4.上传文件
-
时序图
image-20200429193756997.png -
创建文件
image-20200429193850668.png -
上传文件
image-20200429195636879.pnggroup1/M00/00/00/wKiphl6pa1-ARR-tAAAABRnOxBs74.html # group1 组名 # M00 对应 store_path0 也就是存储路径 # 00/00 磁盘路径
查询存储文件的目录
image-20200429194122550.png
5.访问文件
5.1 为什么需要安装Nginx
通过上面的操作我们已经可以去上传文件了,但是文件上传后我们没有办法通过浏览器去进行访问。因为在FastDFS 4.x 版本以后移除了 http支持。即使没有移除也有以下缺陷:
(借鉴:https://www.php.cn/nginx/421962.html)
在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传、下载、删除等操作。
同时通过FastDFS的HTTP服务器来提供HTTP服务。但是FastDFS的HTTP服务较为简单,无法提供负载均衡等高性能的服务,所以FastDFS的开发者—淘宝的架构师余庆先生,为我们提供了Nginx上使用的FastDFS模块(也可以叫FastDFS的Nginx模块)。
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题.假设Tracker服务器将文件上传到了storage1。
文件ID已经返回客户端,这时,后台会将这个文件复制到storage2,如果复制没有完成,客户端就用这个ID在192.168.1.30取文件,肯定会出现错误。
所以我们可以采用Nginx的反向代理帮助我们去进行进行图片的访问。余庆先生提供了一个Nginx的FastDFS模块。我们只需要将这个模块集成到Nginx里面去,通过Nginx的反向代理,这样我们就能访问了。
5.2 安装Nginx
-
安装nginx所需要的依赖
-
openssl
apt-get install libssl-dev
-
pcre
apt-get install libpcre3 libpcre3-dev
-
zlib
apt-get install zlib1g-dev
-
5.2.1 fastdfs-nginx-module 安装
-
解压 fastdfs-nginx-module
image-20200430091838373.png image-20200430091903675.png进入到src文件夹下
image-20200430091952779.png修改配置
# 修改配置 vim config # 执行下面命令(将配置中的/usr/local改为/usr): :%s+/usr/local/+/usr/+g
将
image-20200430092751064.pngmod_fastdfs.conf
复制到/etc/fdfs
下进入
/etc/fdfs
下修改刚刚复制的配置文件,将下面参数修改成这样:tracker_server=192.168.169.134:22122 # tracker服务IP和端口 url_have_group_name=true # 访问链接前缀加上组名 store_path0=/var/fdfs/storage # 文件存储路径
将FastDFS一些关于Http访问的配置文件也复制到
image-20200430093504620.png image-20200430093631183.png/etc/fdfs
下
5.2.2 Nginx安装
-
解压Nginx压缩包
image-20200430091517646.png
tar -zxvf nginx-1.10.0.tar.gz
-
进入nginx目录,编译nginx
image-20200430094032569.png./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/home/wangzh/fastdfs-nginx-module/src
-
编译
image-20200430094724626.pngmake
在编译时报错,我们只需要修改obj/MakeFile
就可以了。先找到该文件
编辑该文件
image-20200430095213854.png将图中选中部分删除,重新make
image-20200430095311786.png-
安装
make install
-
配置nginx整合fastdfs-module模块
找到nginx产生的配置文件
image-20200430095533393.png修改文件,增加一个server
server { listen 8000; server_name localhost; #域名中包含 group 交给 ngx_fastdfs_module 处理 location ~/group([0-9])/ { ngx_fastdfs_module; } location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
-
启动
image-20200430100622105.pngnginx # 启动 nginx -s stop # 停止 nginx -s reload # 重新加载配置
-
访问nginx
image-20200430101135276.png
-
访问我们先前上传的文件
image-20200430104836958.pnghttp://192.168.169.134:8000/group1/M00/00/00/wKiphl6pa1-ARR-tAAAABRnOxBs74.html
完美。