分布式文件系统--FastDFS

  |   2,766 浏览

概述

FastDFS是一个开源的轻量级分布式文件系统:github地址。淘宝某大佬出品。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
通常来说,我们在技术选型时,针对分布式文件系统这一领域,根据系统业务需求来说,像淘宝这样的商城,文件体量巨大,但文件大小普遍都不大。所有一般我们系统如果是管理海量文件,文件大小在1M-500M左右,我们推荐使用FastDFS来搭建分布式文件系统,如果海量文件大小都是1G-100G甚至上T的时候,我们推荐使用HDFS来搭建分布式文件系统。
对于互联网公司,一般我们的业务系统文件量多,但大小普遍不会太大,所以我们通常使用FastDFS。下面我们来介绍分布式文件系统FastDFS是怎么搭建的。
架构图如下:

安装

准备服务器

由于是分布式文件系统,必然需要多台服务器,参数如下:

服务器名称服务器IP
node1192.168.56.101
node2192.168.56.102
node3192.168.56.103

接下来的操作需要在上面三台服务器上全部依次操作一遍

安装依赖包

依赖包:libfastcommon,直接上官方github下载最新版本到服务器上。
常规操作:解压,编译,安装

$ tar -zxvf libfastcommon-1.0.39.tar.gz
$ cd libfastcommon-1.0.39
$ ./make.sh
$ ./make.sh install

安装fastdfs

我们直接从官方github中下载最新版本到服务器上进行编译安装。由于FastDFS是用C语言开发的,需要安装gcc等C语言编译环境。
常规操作:解压,编译,安装

$ tar -zxvf fastdfs-5.11.tar.gz
$ cd fastdfs-5.11
$ ./make.sh
$ ./make.sh  install

创建数据目录

设置分布式文件系统数据存放目录,存放文件和日志

#追踪器数据存放目录
mkdir -p /mnt/data/fastdfs/tracker
#存储器数据存放目录
mkdir -p /mnt/data/fastdfs/storage

配置启动追踪器

修改配置文件

$ cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
$ vi /etc/fdfs/tracker.conf
#修改tracker.conf中的 base_path=/mnt/data/fastdfs/tracker

启动追踪器

$ fdfs_trackerd /etc/fdfs/tracker.conf restart
#启动成功后会默认监听端口:22122

配置启动存储器

修改配置文件

$ cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
$ vi /etc/fdfs/storage.conf

#修改如下配置参数

base_path=/mnt/data/fastdfs/storage #设置 storage 的日志目录
store_path_count=1 #存储路径个数,需要和 store_path 个数匹配
store_path0=/mnt/data/fastdfs/storage #存储路径
tracker_server=192.168.56.101:22122 #node1服务器的 IP 地址和端口号
tracker_server=192.168.56.102:22122 #node2服务器的 IP 地址和端口号
tracker_server=192.168.56.103:22122 #node3服务器的 IP 地址和端口号

启动存储器

$ fdfs_storaged  /etc/fdfs/storage.conf restart
#启动成功后会默认监听端口:23000

测试上传文件

使用官方自带命令上传文件

FastDFS安装成功可通过/usr/bin/fdfs_test测试上传、下载等操作。

$ vi /etc/fdfs/client.conf
#修改如下参数
base_path=/mnt/data/fastdfs
tracker_server=192.168.56.101:22122
tracker_server=192.168.56.102:22122
tracker_server=192.168.56.103:22122

上传命令语法:fdfs_test [客户端配置文件地址] upload [上传文件]
例如:fdfs_test /etc/fdfs/client.conf update /home/1.png
执行上面的上传命令,就会把/home下的1.png上传至文件系统,此时就会在192.168.56.101、192.168.56.102、192.168.56.101三台服务器上的目录【/mnt/data/fastdfs/storage/data/00/00】下均能找到这张图片。

使用java代码上传文件

方式一:参考官方demo
方式二:自己使用maven构建
引入依赖:

<dependency>
    <groupId>org.csource</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27-RELEASE</version>
</dependency>

java代码如下:

//加载配置文件
ClientGlobal.init("fastDFS.conf");
TrackerClient tracker = new TrackerClient();
TrackerServer trackerServer = tracker.getConnection();
StorageClient storageClient = new StorageClient(trackerServer, null);
//上传home目录下的1.png
String fileIds[] =storageClient.upload_file("/home/1.png", null, null);
System.out.println(fileIds.length);
System.out.println("组名:" + fileIds[0]);
System.out.println("路径: " + fileIds[1]);

fastDFS.conf配置文件内容如下:

#tracker服务器地址,如果有多个tracker可以配置多个tracker_server
tracker_server=192.168.56.101:22122
tracker_server=192.168.56.102:22122
tracker_server=192.168.56.103:22122

文件下载

文件上传成功后,我们已经发现在三台服务器上都能找到对应的文件,业务系统如何访问这些文件呢?
我们会马上想到使用nginx静态目录代理一下不就搞定了?确实如此。静态目录代理后,我们是可以访问这些文件,但这样会存在一个问题,因为我们是分布式的文件系统。访问的时候会将请求负载到不同的服务器上去。假如用户将一个稍大的文件上到了服务器node1上,而此时文件同步是需要一定时间的。用户前端已经显示上传成功,但访问的时候有可能把请求负载到了node2上,而此时还没有同步完成,导致文件上传成功,会出现短暂时间内文件间歇性访问不了。
那么如何解决上述问题呢?fastDFS作者自然也想到了这个问题,所以顺便又开源了一个fastdfs-nginx模块,解决此问题。
nginx模块安装分两种情况,一是服务器上现在已经有nginx在运行了,二是全新安装nginx
两种情况有些许不同,全新安装步骤如下:
下载nginx源代码
下载fastdfs-nginx模块
解压,解压
先不着急去编译和安装,因为会出错。需要修改一下配置
错误:/usr/local/include/fastdfs/fdfs_define.h:15:27: 致命错误:common_define.h:没有那个文件或目录
解决:编辑fastdfs-nginx模块目录下src目录中的config文件

$ vi fastdfs-nginx-module-1.20/src/config
#修改以下两条参数配置
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

修改配置文件后,进行编译前的配置,执行以下命令:

$ ./configure --add-module=/home/fastdfs-nginx-module/src

编译和安装

$ gmake && gmake install

如果服务器上已经存在nginx,并且有其他项目在线上运行了,那么就要慎重操作,不要把原来的nginx配置文件覆盖了。
因为nginx无法在安装完成后再动态添加模块。所以依然需要执行上述步骤,唯一不同的是最后一步只编译,不要进行安装,因为安装会覆盖现在nginx。给线上其他项目造成影响。编译好后,仅将nginx执行文件覆盖原nginx中sbin目录的对应文件即可,操作过程中注意备份原nginx。
当nginx的fastdfs模块安装成功后,我们还需要进行配置才能进行分布式访问文件。
给nginx配置文件增加代码配置

$ vi nginx.conf
#增加如下配置
location /group1/M00/{
    #root /mnt/data/fdfs/storage/data;
    ngx_fastdfs_module;
}

配置完成后不急着启动nginx
需要先进行fastdfs模块配置,不然nginx怎么知道文件在哪三台存储节点呢
从fastdfs源码目录里复制以下两个依赖配置:

$ cp /home/fastdfs-5.11/conf/http.conf /etc/fdfs/
$ cp /home/fastdfs-5.11/conf/mime.types /etc/fdfs/

将fastdfs-nginx-module-1.20模块目录src下的mod_fastdfs.conf拷贝至/etc/fdfs/下

$ cp fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
$ vi /etc/fdfs/mod.fastdfs.conf

修改以下配置参数:

base_path=/mnt/data/fastdfs
tracker_server=192.168.56.101:22122
tracker_server=192.168.56.102:22122
tracker_server=192.168.56.103:22122
url_have_group_name=true
store_path0=/mnt/data/fastdfs/storage

到这里我们就可以启动nginx了。启动之后我们试着访问一下我们之前上传上去的图片就可以了。
http://192.168.56.101/group1/M00/00/00/wKg4ZVzuJvWAOwBpAAAV5viWyEM005.png
图片出来的那一刻,恭喜你,大功告成。

评论

发表评论

validate