一、分布式文件系统
分布式文件系统 (Distributed File System) 是一个软件/软件服务器,这个软件可以用来管理文件,但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件。
常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS等,
GFS(Google File System)
--------------------------------------
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统HDFS
--------------------------------------
Hadoop 实现的一个分布式文件系统(Hadoop Distributed File System),简称HDFSLustre
---------------------------------------
是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的Ceph
---------------------------------------
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统GridFS
---------------------------------------
GridFS是MongoDB之上的分布式文件系统,其利用了MongoDB的分布式存储机制并通过MongoDB来存储文件数据和文件元数据MogileFS
---------------------------------------
由memcahed的开发公司danga,开发的一款采用perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等mooseFS
---------------------------------------
相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差
分布式文件系统与传统文件系统对比:
二、什么是FastDFS
FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发并开源,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
三、FastDFS发展历史
1、2008年4月项目启动,7月发布第一个版本V1.00,两年时间内持续升级到V1.29
2、2010年8月推出V2.00
3、2011年6月推出V3.00
4、2012年10月推出V4.00
5、2013年12月推出V5.00
6、2017年3月推出V5.10
7、2018年6月推出V5.12(截止目前最新版)
8、详细发展历史查看: https://github.com/happyfish100/fastdfs/blob/master/HISTORY
9、FastDFS系统架构从第一个版本发布后一直没有大的调整,高版本完全兼容低版本的数据,可以做到平滑升级,推荐更新升级到最新版本;
10、FastDFS代码托管在github上:https://github.com/happyfish100/fastdfs
四、FastDFS整体架构
FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端;客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端;FastDFS提供专有API访问,目前提供了 C、Java 和 PHP 几种编程语言的API,用来访问FastDFS文件系统;
服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage);跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽;因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了;存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等;
五、FastDFS下载
FastDFS没有Windows版本,不能在Windows下使用;FastDFS需要安装部署在Linux环境下;下载地址:https://github.com/happyfish100/fastdfs/releases,下载安装版本为FastDFS5.11
六、FastDFS安装
- 安装前的准备
- 检查Linux上是否安装了 gcc、libevent、libevent-devel,执行如下yum命令检查:
- 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 库是 FastDFS 文件系统运行需要的公共 C 语言函数库
- 安装libfastcommon 库的步骤如下
- 下载 libfastcommon 源代码包
- 解压下载下来的tar.gz压缩包:tar -zxvf libfastcommon-1.0.36.tar.gz
- 切换到解压后的libfastcommon目录:cd libfastcommon-1.0.36
- 执行make脚本进行编译:./make.sh
- 注意:第4步make编译的时候如果报错,需解决错误后再次进行make,通常发生错误是由于Linux缺少某些依赖库导致,根据错误提示解决错误
- 执行make install进行安装:./make.sh install
- 至此 libfastcommon 库安装完毕
- 安装FastDFS
- FastDFS才是我们真正的分布式文件系统,安装步骤如下:
- 下载FastDFS,下载地址:https://github.com/happyfish100/fastdfs/releases
- 解压下载下来的tar.gz包:tar -zxvf fastdfs-5.11.tar.gz
- 切换到解压后的目录:cd fastdfs-5.11
- 执行编译: ./make.sh
- 然后再执行安装 ./make.sh install
- 至此FastDFS安装完成,安装后所有编译出来的文件存放在/usr/bin目录下,所有配置文件存放在/etc/fdfs目录下,使用命令查看:ll /usr/bin/fdfs*
- 另外注意需要把解压后的fastdfs-5.11/conf目录下的两个文件拷贝到/etc/fdfs/
- cp http.conf /etc/fdfs/
- cp mime.types /etc/fdfs/
- 这两个文件后续需要用到,所以先拷贝过去,原因:让fastdfs-nginx-module的配置文件调用
- FastDFS才是我们真正的分布式文件系统,安装步骤如下:
七、FastDFS配置
- FastDFS安装后配置文件位于/etc/fdfs/目录下,修改该目录下的配置文件
- 把所有的.sample后缀都去掉,使用 mv 命令改文件名,去掉文件名后缀。尽量使用cp复制在改名(备份,备份,备份)
- 修改tracker.conf文件
- base_path=/opt/fastdfs/tracker
- 新建 mkdir -p /opt/fastdfs/tracke
- 不然会报:
- 修改storage.conf文件
- base_path=/opt/fastdfs/storage
- store_path0=/opt/fastdfs/storage/files
- tracker_server=192.168.184.133:22122
- 新建文件夹:
- mkdir -p /opt/fastdfs/storage
- mkdir -p /opt/fastdfs/storage/files
- 如果配置store_path0该配置了,就得创键file文件,如果不配置则默认使用base_path
- 然后启动FastDFS
- 修改tracker.conf文件
八、FastDFS启动
- FastDFS服务启动需要启动两个脚本:
- 启动FastDFS的tracker服务,在任意目录下执行:fdfs_trackerd /etc/fdfs/tracker.conf
- 启动FastDFS的storage服务,在任意目录下执行:fdfs_storaged /etc/fdfs/storage.conf
- 首次启动storage后,它会在配置的路径下创建存储文件的目录,前提是配置的路径要存在,不存在服务都起不来,所以上面七步骤中有提示要创键文件夹
- 查看启动进程:ps -ef | grep fdfs ,有启动的执行命令即为启动成功;
- 查看storage是否已经登记到了tracker下:fdfs_monitor /etc/fdfs/storage.conf
九、FastDFS关闭
- 关闭FastDFS,执行如下命令:
- 关闭tracker执行命令,在任意目录下执行:fdfs_trackerd /etc/fdfs/tracker.conf stop
- 关闭storage执行命令,在任意目录下执行:fdfs_storaged /etc/fdfs/storage.conf stop
- 或者kill关闭fastdfs,但不建议kill -9 强制关闭,因为可能会导致文件信息不同步问题
十、FastDFS重启
- 重启FastDFS,执行如下命令:
- 重启tracker执行命令:fdfs_trackerd /etc/fdfs/tracker.conf restart
- 重启storage执行命令:fdfs_storaged /etc/fdfs/storage.conf restart
十一、FastDFS测试
- FastDFS安装完成之后,可以使用fdfs_test脚本测试文件上传,执行命令:
- 测试之前,需要修改client.conf配置文件,修改两个配置:
- base_path=/opt/fastdfs/client
- tracker_server=192.168.184.133:22122
- 新建文件夹:
- mkdir -p /opt/fastdfs/client
- 测试文件上传,执行命令:
- fdfs_test /etc/fdfs/client.conf upload /root/testfastfds.txt
- 测试文件删除,执行命令:
- fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKi4hVzVCW-AR0ZTAAAAIIe1k0c233_big.txt
- FastDFS生成的文件目录结构及名称示例:
-
//////////////////////////一道亮丽的风景线//////////////////////////
十二、安装Nginx的FastDFS扩展模块
- 概述
- 已经上传到FastDFS文件系统中的文件,我们如何在浏览器中访问呢?FastDFS V4.05 以后的版本就把内置 HTTP服务去掉了,所以我们测试上传成功了,但是却无法访问。
- FastDFS提供了一个Nginx扩展模块,利用该模块,我们可以通过Nginx访问已经上传到FastDFS上的文件
- 下载
- 下载fastdfs的nginx扩展模块源代码:
- wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
- 解压下载下来的fastdfs-nginx-module-master.zip 文件:
- unzip fastdfs-nginx-module-master.zip
- 安装Nginx并且添加fastDFS模块
- 下载nginx:wget http://nginx.org/download/nginx-1.12.2.tar.gz
- 解压下载下来的nginx文件,执行命令:tar -zxvf nginx-1.12.2.tar.gz
- 切换至解压后的nginx主目录,执行命令:cd nginx-1.12.2
- 切换到解压后的nginx-1.12.1目录下,执行configure命令:
- ./configure --prefix=/usr/local/fastdfs/nginx_fdfs --add-module=/home/soft/fastdfs/fastdfs-nginx-module-master/src
- 其中--prefix是指定nginx安装路径,--add-module指定fastDFS的nginx模块的源代码路径
- 执行命令进行编译:make
- 执行命令进行安装:make install
- 以上安装Nginx的FastDFS扩展模块注意事项
- 我们知道,nginx是C语言开发,因此同样需要gcc,还需要安装pcre,因为nginx的http模块需要用到pcre,还需要zlib,它提供了解压缩,还需要openssl,Nginx的安装需要Linux安装相关的几个库,否则编译会出现错误,这几个库分别是:
- gcc编译器是否安装?
- 检查是否安装:yum list installed | grep gcc
- 执行安装:yum install gcc -y
- openssl库是否安装?
- 检查是否安装:yum list installed | grep openssl
- 执行安装:yum install openssl openssl-devel -y
- pcre库是否安装?
- 检查是否安装:yum list installed | grep pcre
- 执行安装:yum install pcre pcre-devel -y
- zlib库是否安装?
- 检查是否安装:yum list installed | grep zlib
- 执行安装:yum install zlib zlib-devel -y
- 一次性安装,执行如下命令:
- yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
- 配置
- 将/home/soft/fastdfs/fastdfs-nginx-module-master/src目录下的mod_fastdfs.conf文件拷贝到 /etc/fdfs/目录下,这样才能正常启动Nginx
- mod_fastdfs.conf 专门配置Nginx的扩展模块的
- 修改mod_fastdfs.conf配置文件:
- base_path=/opt/fastdfs/nginx_mod
- tracker_server=192.168.184.133:22122
- store_path0=/opt/fastdfs/storage/files
- url_have_group_name = true
- 创键文件夹:
- mkdir -p /opt/fastdfs/nginx_mod
- 其他路径都存在所以不用创键
- 配置Nginx的配置文件
- #拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,使用 fastdfs的Nginx 模块进行转发:
location ~ /group[1-9]/M0[0-9] {
ngx_fastdfs_module;
} - 如果出现404访问不到,检查一下 url_have_group_name = false,如果为false改为true
- #拦截请求路径中包含 /group[1-9]/M0[0-9] 的请求,使用 fastdfs的Nginx 模块进行转发:
- 将/home/soft/fastdfs/fastdfs-nginx-module-master/src目录下的mod_fastdfs.conf文件拷贝到 /etc/fdfs/目录下,这样才能正常启动Nginx
- 启动与测试
- 启动带有fastdfs模块的Nginx
- 重启fastDFS服务进程,执行如下命令:(不重启也可以)
- fdfs_trackerd /etc/fdfs/tracker.conf restart
- fdfs_storaged /etc/fdfs/storage.conf restart
- 重新上传一个文件进行测试验证:fdfs_test /etc/fdfs/client.conf upload /root/testfastfdsnginx.txt
- 在浏览器访问上传的文件,显示访问成功
- 当遇到400错误, 检查配置/etc/fdfs/mod_fastdfs.conf
- url_have_group_name=true
- 该配置表示访问路径中是否需要带有group1,改为true表示路径中需要有group1
十三、FastDFS提供的主要功能
upload:上传文件,download:下载文件,delete:删除文件
十四、FastDFS文件系统的Java客户端
- fastDFS文件系统Java客户端是指采用Java语言编写的一套程序,专门用来访问fastDFS文件系统
- 由于maven仓库里没有该依赖所以:
- 下载官方的源代码:https://github.com/happyfish100/fastdfs-client-java/archive/master.zip
- 解压fastdfs-client-java-master,采用maven命令编译成jar安装到本地maven库:mvn clean install
- 在Java程序中使用它提供的API来访问fastDFS文件系统
十五、FastDFS开发示例
使用Java客户端,编程操作fastDFS分布式文件系统:
引入依赖:
<dependency>
<groupId>org.csource</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27-SNAPSHOT</version>
</dependency>
代码:
在类路径中配置该文件:fdfs_client.conf配置,tracker_server可以配置多个
connect_timeout = 2
network_timeout = 30
charset = UTF-8
tracker_server=192.168.184.133:22122
代码:
public class FastService {
public static void main(String[] args) throws IOException, MyException {
//1、初始化配置连接信息
ClientGlobal.init("fdfs_client.conf");
//检查加载配置结果
System.out.println("加载配置结果:ClientGlobal.configInfo(): " + ClientGlobal.configInfo());
//2、创建一个Tracker的客户端对象
TrackerClient trackerClient = new TrackerClient();
//3、通过Tracker的客户端对象,获取到一个Tracker服务器对象
TrackerServer trackerServer = trackerClient.getConnection();
//4、通过Tracker的客户端对象和Tracker服务器对象,获取到一个Storage服务器对象
StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);
//5、通过Tracker服务器对象和Storage服务器对象,构造一个Storage客户端对象
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
//有了上面的5步,接下来就可以正式去操作FastDFS了
//文件上传
String[] strArray = storageClient.upload_file("G:/test.txt", "txt", null);
for (String str : strArray) {
System.out.println(str);
}
//文件下载,返回值0表示下载成功,其他值都是下载失败,比如:-1, 1, -22 都是失败的
//strArray[0] group_name
//strArray[1] remote_filename
//G:/测试下载.txt local_filename
int download = storageClient.download_file(strArray[0], strArray[1], "G:/测试下载.txt");
System.out.println("下载结果:"+download);
//文件删除,返回值0表示删除成功,其他值都是删除失败,比如:-1, 1, -22 都是失败的
//int delete = storageClient.delete_file(strArray[0], strArray[1]);
//System.out.println("删除结果:"+delete);
}
}